第二部分、核心查询
内容概述:排序、分组、聚合、多表查询、合并查询、子查询
1.排序
通过order by子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)
select 字段名 from 表名 where 条件语句 order by 字段名2 asc/desc (通过字段名2排序,升序(默认)/降序)
(1)单列排序:只按照一个字段排序
例如:select * from mytable order by age; 默认升序
select * from mytable order by age desc; 降序排序
(2)组合排序:同时对多个字段进行排序,如果第一个字段相同,就按照第二个字段进行排序。
select * from mytable order by salary desc,age desc;
2.聚合函数
先是横向,逐行查询(进行相关条件判断);然后进行纵向查询,对某一列的值进行计算然后返回 一个单一的值(会忽略null空值)。
例如:返回一个表中的一个字段的总和/平均值等。
语法结构:select 聚合函数(字段名) from 表名;
常见的聚合函数:
count(字段名): 统计某个字段的行数
sum(字段名: 统计指定字段的数值和
max(字段名:最大值
min(字段名:最小值
avg(字段名: 平均值
例如:
select count(id) from mytable;
select sum(salary) from mytable;
select avg(age) from mytable;
值得注意的是:count(1) 与 count(*)所表达的效果一样
select sum(salary) '薪水总和', max(salary) '最高薪水' from mytable; 中间省略了as
select sum(salary) '薪水总和', max(salary) '最高薪水' from mytable where age>25;
3.分组:适用group by语句对查询的信息进行分组
分组往往和聚合函数一起使用,对数据分组,分完组后各个组内进行聚合统计分析。
select 分组字段/聚合函数 from 表名 group by 分组字段 having 条件 #其中having指对分组后的结果进行进一步过滤
例如:
select * from mytable group by sex #这样写没有聚合函数,没有实际意义。
重点理解group by是如何分组的:
先是各自分组,然后只显示各个组的第一个数据。分组的目的是为了统计,没有聚合函数,便没有实际意义。
select sex(这里是group by的字段的重复,虽然不添加也可以执行),avg(salary) from mytable group by sex;
#记住(1)group by 的字段必须出现在select的位置。
(2)前面select 的位置,除了group by的字段、聚合函,不能出现其他字段。
select name,avg(salary) from mytable where name is not null group by name;
这里用名字分组可能体现的不明显,因为没有相同的部分可以分为一组,于是添加一个工作城市的字段进行分类。
查询平均薪资大于3000的城市:
select department,avg(salary) from mytable where department is not null group by department having avg(salary)>3000;
#where与having的区别
where:分组前的过滤,后不能接聚合函数
having:分组过后的过滤,后可以接聚合函数
1.4limit关键字:用于限制返回的查询结果的行数(即:可以通过limit指定查询多少行数据)
limit语法是MySQL的方言(专有),可以用来完成分页。(因为每一页的内容显示的记录往往是固定的)
select 字段1,字段2... from 表名 limit soofset,length;
limit offset,length 关键字可以接受一个或两个为0或者正整数的参数
offset 起始行数,默认从0开始
length 返回行数
例如:select * from mytable limit 1,3;
学习永远不会迟