mysql 查询

Posted 邓维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 查询相关的知识,希望对你有一定的参考价值。

mysql 查询

 

1: Distinct

      有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能去重他的目标字段(即所有查询的字段)

注意: distinct必须放在要查询字段的开头

eg:

1:select distinct user_name from xxx 这样会过滤掉user_name 重复的,      

2:如果这样写: select  distinct id, user_name, password  from xxx    mysql会认为要过滤掉 id、user_name 、 password 都重复(完全一样)的,不然只要有一个字段不一样都会被查询出来;

注意:如果查询的有时间字段只有当时间的年月日时分秒都重复时才会被过滤掉

所以一般distinct用来查询不重复记录的条数。

如果要查询不重复的记录,有时候可以用group by 

2:order by 

注意:Mysql5.7及以上版本group by 子查询中order by 无效

如何解决?

1: 通过limit 语句使子查询的order by生效

但是这必须保证limit的数量,所以也可以使用DISTINCT实现。

 

3: group by

注意:使用group by 后默认返回的是每个组中id 最小的那一条记录

 

问题1:  对于mysql中的group by分组后如何获取组内创建时间最大(或最小)的那行数据 ?

以最大为例:

思路: 先对要查询的数据先进行降序排序,然后在使用group by 即可,但是会使用到子查询先排序(这里需要注意上面说到的order by)

 

SELECT
*
FROM(

SELECT
DISTINCT
*
FROM  a 
ORDER BY a.start_time DESC

) AS b
GROUP BY b.id

 

 

 

问题2:对一个结果集分组后怎么取每个分组的两条(或多条)最大(或最小)的数据?

取最大的两条:

SELECT 
* 
FROM student_score AS  a
WHERE (
 SELECT 
COUNT(*) 
FROM student_score AS b
    WHERE a.student_name=b.student_name AND a.score<b.score 
)<2
 
ORDER BY a.score DESC

取最小的两条:

 

SELECT 
* 
FROM student_score AS  a
WHERE (
 SELECT 
COUNT(*) 
FROM student_score AS b
    WHERE a.student_name=b.student_name AND a.score>b.score 
)<2
 
ORDER BY a.score DESC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章

部分代码片段

你如何在 python 中处理 graphql 查询和片段?

linux中怎么查看mysql数据库版本

关于MySQL的关联查询

Microsoft SQL Server 代码片段收集

从mysql的片段中加载ListView