前言
上一章节我们讲解了mysql中的去重以及排序。这一章节我们讲一下mysql中比较复杂的查询-子查询,现在我们先回顾一下上章节讲的几个查询关键字。
查询语法常用关键字详细讲解
1、where——条件筛选
我们通常用于加限定条件,比如选取所有水果中,除了香蕉其他的水果你爱吃的有哪些? 这个时候需要 WHERE fruit!='香蕉' ,或者选择三号和五号中参加人数多少?WHERE date(create_time)='2021-09-03' or date(create_time)='2021-09-05'。
2、group by 分组
所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
select 类别, 函数
from A
group by 类别
复制
group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。
mysql中五种常用的聚合函数:
(1)max(列名):求最大值。
(2)min(列名):求最小值。
(2)sum(列名):求和。
(4)avg(列名):求平均值。
(5)count(列名):统计记录的条数。
3、having
having子句可以让我们筛选成组后的各种数据,where子句在聚合前先筛选记录,也就是说作用在group by和having子句前。而 having子句在聚合后对组记录进行筛选。
select 类别, 函数 from A
group by 类别
having sum(数量) > 18
---Having和Where的联合使用方法
select 类别,函数 from A
where 数量 >8
group by 类别
having SUM(数量) >10
复制
4、order by 排序
(1)order by xxx //默认升序排列
(2)order by xxx desc //降序排列
(3)order by xxx asc //升序排列,与默认一样
(4)order by rand() //随机排列,效率不高
5、limit
limit [offset,] N
offset 偏移量,可选,不写则相当于limit 0
比如想看10条数据:
select * from table_name limit 10;
复制
5、总结
子查询讲解
我们用子查询通常是需要将要查询的单表进行二次及以上查询,比如说我要看班级内语文成绩最好的学生数学多少分?这种情况就需要用子查询,先把语文成绩最好的学生找出来,然后再找出这个学生的数学成绩。
msyql子查询在工作中常用到的有两种,一个是from类型,一个是where类型。
1、where类型的子查询
如求:成绩最好的学生姓名信息
select * from stu where score=(select max(score) mm from stu)
复制
这里面where 要筛选的条件是通过自己找到的最大成绩,这样就是where类型的子查询。
2、from类型的子查询
概念:查询结果集在结构上可以当成表看,那就可以当成临时表对他进行再次查询。
还是上一个问题,使用from类型的子查询可以这样写:
select * from (select * from stu order by score desc) tmp limit 1
复制
以上是对stu表现进行排序,然后以这个结果作为临时表(tmp),最后再查第一条数据就是我们要的数据。
以上两种方式列子比较简单,在工作中我们遇到的查询方式是比较复杂,现在看下面的例子,复杂程度也是和工作中遇到的难度接近:
问:使用sql语句 求a表中每个uid对应 最大的score值 的那一条数据,如果出现score相同,则取Id最大的那条数据。
在上面会出现一个学生多个成绩,我们要找到每个学生对应的最大成绩,那就需要对UID进行分组,然后求组内最大值,需要用max函数。
接下来需要找到对应人和成绩的用户个人详细信息,最后再对出现同一个人相同成绩去ID最大的值。
SELECT max(a.id) AS id,
a.uid,
a.class,
a.score
FROM
(SELECT UID,
max(score) AS score
FROM a
GROUP BY UID) b
JOIN a AS a ON a.uid=b.uid
AND a.score=b.score
GROUP BY a.uid,
a.class,
a.score;
复制
语句其中用到了join连接,在我们工作中很少单独使用子查询,一般是和多个条件组合使用,下一章我们会讲到mysql的几种连接。