【MySQL】第十一部分 SELECT的执行过程

【MySQL】第十一部分 SELECT的执行过程



11. SELECT的执行过程

11.1 SQL92语法的结构

SELECT ...
FROM TABLE
WHERE 多表连接的条件 AND 不包含聚合函数的过滤条件
GROUP BY 分组	
HAVING 	包含聚合函数的过滤条件
ORDER BY 排序
LIMIT 限制数据条数

11.2 SQL92语法的结构

SELECT ...
FROM TABLE JOIN TABLE ON 多表连接的条件
WHERE 不包含聚合函数的过滤条件
GROUP BY 分组	
HAVING 	包含聚合函数的过滤条件
ORDER BY 排序
LIMIT 限制数据条数

11.3 语句执行顺序

两种语法执行顺序都是一样的

在这里插入图片描述

FROM ==> WHERE ==> GROUP BY ==> HAVING ==> SELECT ==> DISTINCT ==> ORDER BY ==> LIMIT
# 查询10,20,30,40,50号部门中最高薪资并且大于8000 别名"薪资",根据薪资降序显示前2个部门的信息
SELECT department_id,MAX(salary) "薪资"   # 顺序 5
FROM employees   # 顺序 1
WHERE department_id IN (10,20,30,40,50)  # 顺序 2
GROUP BY department_id  # 顺序 3
HAVING MAX(salary) > 8000  # 顺序 4
ORDER BY MAX(salary) DESC  # 顺序 5
LIMIT 0,2; # 顺序 5

11.4 解释之前遗留问题

# 查询10,20,30,40号部门中最高薪资并且大于10000
# 写法一
SELECT department_id,MAX(salary)
FROM employees 
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary) > 10000;

# 写法二 (不推荐,效率低)
SELECT department_id,MAX(salary)
FROM employees 
GROUP BY department_id
HAVING MAX(salary) > 10000 AND department_id IN(10,20,30,40);

为什么写法二的效率低?
根据上述语句的执行顺序,GROUP BY分组后,HAVING对分组后的每个部门进行条件筛选,接着AND只要10-40号部门,那么其他部门不就白计算了,导致效率低下

写法一, 先进行WHERE筛选出需要的部门,在对这些部门进行分组,最后HAVING再去筛选,所需要计算的数据量小,并且不会浪费

根据执行顺序也可以解释为什么SELECT语句中取别名,WHERE语句中使用不了,而ORDER BY 中可以使用, 因为WHERE比SELECT先执行,所以SELECT去别名看不见,同理ORDER BY 可以使用.

FROM ==> WHERE ==> GROUP BY ==> HAVING ==> SELECT ==> DISTINCT ==> ORDER BY ==> LIMIT

总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值