1.1、排序
通过 order by 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)
语法:
select 字段… from 表 [where 条件] order by 排序的字段或表达式 [asc | desc]
asc:升序,默认就是升序 desc:降序
特点:
- 如果是按升序排列,可以省略asc. 排序子句在where子句后面。
- 可以对单列排序,也可以对多个字段进行排序,如果第 1 个字段相等,则按第 2 个字段排序,依此类推。
需求:
查询所有学生数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序
select * from student2 order by age desc, math
1.2、分组函数
分组函数又叫聚合函数,它是对一列的值进行计算,然后返回一个结果值。
常用的五个聚合函数:
sum(列): 求和
max(列): 最大值
min(列): 最小值
avg(列):平均值
count(列):统计这一列在表中的记录数
特点:
- count函数的参数可以支持:字段、*、常量(一般是1)
- count(1)和count(*)都统计表中所有的记录数,包含字段为null 的记录。
count(字段) 会统计该字段在表中出现的次数(记录数),忽略字段为null 值的记录。
其余4个分组函数都会忽略null值。
- sum和avg一般用于处理数值型, max、min、count可以处理任何数据类型。
- 都可以搭配distinct使用,用于统计去重后的结果。
需求:
- 查询学生数学成绩总和
select sum(math) from student2
- 查询学生数学成绩的平均值,最大值和最小值
select avg(math) , max(math) , min(math) from student2
- 查询学生总人数
select count(*) 总人数 from student2
注意:
- count(字段),avg(字段),max(字段),min(字段),sum(字段) 都会忽略字段为null值的。
- count(*)不忽略null值。
1.3 分组查询
分组查询是指使用group by子句对查询信息进行分组,相同数据作为一组。
语法:
select 字段 1,字段 2…,分组函数 from表名group by分组字段 [ having 条件];
group by怎么工作的?
将分组字段值相同的记录作为一组,如按性别将学生分成2组,再结合分组函数对每组数据进行统计,返回每个组统计的结果。
例如:统计男女生各有多少人。

注意:当我们使用某个字段分组,在查询的时候,也需要将这个字段查询出来,否则看不到数据属于哪组的。
需求
- 查询年龄大于25岁的人,按性别分组,统计每组的人数
select count(*) , sex from student2 where age>25 group by sex
- 查询年龄大于25岁的人,按性别分组,统计每组的人数,只显示性别人数大于2的数据
select count() , sex from student2 where age>25 group by sex having count()>2
1.3.1、Having和where的区别
| where 子句 | ① 对查询结果进行分组前,将不符合 where 条件的行去掉,即在分组之前过滤数据,即先过滤再分组。 ② where 后面不可以使用聚合函数。 |
|---|---|
| having子句 | ①having 子句的作用是筛选满足条件的组,即再分组之后过滤数据,即先分组后过滤。 ②having 后面可以使用聚合函数。 |
1.4 limit子句
LIMIT子句的作用是限制查询结果返回的条数。
语法:
select 字段列表 from 表名 [ where子句] [ group by子句] [ having子句] [order by子句] [limit 起始记录的索引,每页记录数 ];
特点:
- 起始记录索引从0开始
- limit子句放在查询语句的最后
需求:
- 查询学生表中数据,从第3条开始显示,显示6条。
select * from student2 limit 3,6
1.4.1 limit使用场景
limit用于分页查询,比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来,而是一页显示固定条数。
假设每页显示size条记录,查询第page页的数据,通用SQL如下:
select 字段 from 表 limit (page-1)*size, size
