1、聚合函数
1.聚合函数介绍
聚合函数作用于一组函数,并对一组数据返回一个值。
2.聚合函数语法
select [column,] group function(column),...
from table
[where condition]
[group by column]
[order by column];
3.聚合函数类型
3.1 AVG()和SUM()函数
可以对数值型数据使用AVG()和SUM()函数。
举例:
3.2 MIN()和MAX()函数
可以对任意数据类型使用MIN()和MAX()函数。
举例:
3.3 Count()函数
count(*) 返回表中记录总数,适用于任意数据类型
count(expr) 返回expr不为空的记录总数。
举例:
2、GROUP BY
将表中的数据分成若干组
明确:1、where一定放在from后面!!!
2、在select列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中。
3、包含在GROUP BY子句中的列不必包含在Select列表中。
2.1 基本使用(只用一个分组)
举例:
2.2 使用多个列分组
举例:
3、HAVING
过滤分组的作用
注意:
1、行已经被分组
2、使用了聚合函数
3、满足HAVING子句中条件的分组将被显示
4、HAVING不能单独使用,必须要跟GROUP BY 一起使用
3.1 基本使用
举例:
注意:不能再where子句中使用聚合函数
3.2 Where和HAVING之间的对比
区别1:Where可以直接使用表中的字段作为筛选条件,但是不能使用分组中的计算函数作为筛选条件;HAVING必须要与GROUP BY配合使用,可以把分组计算的函数和分组字段作为筛选条件。
区别2:如果需要通过连接从关联表获取需要的数据,WHERE是先筛选后连接,而HAVING是先连接后筛选。
4、Select的执行过程
4.1 查询的结构
方式1:
select ...,...,...
from ...,...,...
where 多表的连接条件
AND 不包含组函数的过滤条件
group by ...,...
order by ...ASC/DESC
limit ...,...;
方式2:
select ...,...,...
from ... join ...
on 多表的连接条件
join...
on...
where 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
group by ...
having 包含组函数的过滤条件
order by ...ASC/DESC
limit...,...
其中:
1、from:从哪些表筛选
2、on:关联多表查询时,去除笛卡尔积
3、where:从表中的筛选条件
4、group by:分组依据
5、having:在统计结果中再次筛选
6、order by:排序
7、limit :分页
4.2 查询的顺序
1、关键字的顺序是不能颠倒的
select ...from...where...order by...having...order by ...limit...
2、select语句实际的执行顺序
from->where->group by->having->select字段->distinct->order by ->limit
4.3 SQL的执行原理
select是先执行FROM这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
1、首先通过CROSS JOIN求笛卡尔积,相当于得到虚拟表vt(virtual table)1-1;
2、通过ON进行筛选,在虚拟表vt-1的基础上进行筛选,得到虚拟表vt1-2;
3、添加外部行。如果我们使用的是左连接、右连接或者全连接,就会涉及到外部行,也就是在虚拟机表vt1-2的基础上增加外部行,得到虚拟表vt1-3.
如果我们操作的事两张以上的表,还会重复上面的步骤,直到所有的表被处理完为止。这个过程的得到是我们的原始数据。
然后进入第三步和第四步,也就是GROUP BY和HAVING阶段。在这个阶段中,实际上是虚拟表vt2的基础上进行分组和过滤,得到中间的虚拟表vt3和vt4。
当我们完成了条件筛选部分之后,就可以按照筛选表中提前的字段,也就是进入到select和distinct阶段。
首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表vt5-1 和 vt5-2 。
当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段 ,得到虚拟表 vt6 。
最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段 ,得到最终的结果,对应的是虚拟表vt7 。
当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略。同时因为 SQL 是一门类似英语的结构化查询语言,所以我们在写 SELECT 语句的时候,还要注意相应的关键字顺序,所谓底层运行的原理,就是我们刚才讲到的执行顺序。