【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
总结
以上就是今天要讲的内容,希望对大家有所帮助!!!