文章目录

  • 聚合函数
  • HAVING
  • SELECT的执行过程
  • 查询结构
  • SELECT执行顺序
  • SQL的执行原理


聚合函数

聚合函数:作用于一组数据,并对一组数据返回一个值

聚合函数类型:AVG()、SUM()、MAX()、MIN()、COUNT()

注意:聚合函数不能嵌套调用,比如不能出现类似“AVG(SUM(字段名称))”形式的调用

  • AVG、SUM:可对数值型数据使用
  • MIN、MAX:对任意类型数据使用
  • COUNT:适用于任意数据类型;COUNT(*) -> 表中记录总数,COUNT(expr) 返回expr不为空的记录总数

HAVING

使用HAVING字句的条件

  • 行已经被分组
  • 使用了聚合函数
  • 满足HAVING 子句中条件的分组将被显示
  • HAVING 不能单独使用,必须要跟 GROUP BY 一起使用

mysql分组函数和聚合函数 mysql聚合函数的用法_mysql

SELECT的执行过程

查询结构

#方式1:
SELECT ...,....,...
FROM ...,...,....
WHERE 多表的连接条件
AND 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
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:分页

SELECT执行顺序

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
SELECT DISTINCT player_id, player_name, count(*) as num # 顺序 5
FROM player JOIN team ON player.team_id = team.team_id # 顺序 1
WHERE height > 1.80 # 顺序 2
GROUP BY player.team_id # 顺序 3
HAVING num > 2 # 顺序 4
ORDER BY num DESC # 顺序 6
LIMIT 2 # 顺序 7

在 SELECT 语句执行这些步骤的时候,每个步骤都会产生一个 虚拟表 ,然后将这个虚拟表传入下一个步骤中作为输入

SQL的执行原理

SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤

  • 1、首先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1
  • 2、通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2
  • 3、添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟 表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3

拿到查询数据表的原始数据(虚拟表vt1),再此基础上进行WHERE阶段,过滤得到虚拟表vt2

再进行GROUPHAVING 阶段,对vt2进行分组和分组过滤,得到中间虚拟表vt3、vt4

随后进入 SELECTDISTINCT 阶段,分别得到中间的虚拟表 vt5-1、vt5-2

指定字段排序,ORDER BY 阶段,得到虚拟表vt6

取出指定行记录,LIMIT阶段,得到虚拟表 vt7