MySQL执行顺序
MySQL语句的执行顺序也是在面试过程中经常问到的问题,并且熟悉执行顺序也有助于SQL语句的编写。
SELECT
FROM
JOIN
ON
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
执行顺序如下:
FROM
ON
JOIN
WHERE
GROUP BY # (开始使用别名)
SUM # SUM等SQL中的函数
HAVING
SELECT
[DISTINCT] # 去重
ORDER BY
LIMIT
执行顺序解释
FROM
:首先要判断从哪个表里面进行查找,这时候可以判断出别名,以方便后面的语句使用ON
:其实JOIN ON
可以看做一个整体,代表要链接的表(JOIN
)以及表条件(ON
),但是在连接表之前,需要先知道连接条件,所以ON
在前面JOIN
:如2所示,JOIN
要放在ON
后面WHERE
:通过JOIN ON
会生成一个中间表,这时候执行WHERE
筛选出符合条件的记录,(数据减少后当然操作更快),因此WHERE
过滤要尽量放在前面(但是也不能在没有中间表的时候就执行,所以必须是在JOIN...ON...
后面)GROUP BY
是分组,通常分组都需要使用聚合函数才能执行聚合函数
:聚合函数可以看做与HAVING
是一个整体,HAVING
中放的是聚合函数的过滤条件(也可以放普通的条件,但是考虑到执行顺序以及执行效率,尽量将聚合函数的条件放在这里),由于HAVING
中放着聚合的条件,所以要先执行聚合函数,得到结果,才能进行条件过滤,因此聚合函数在HAVING
之前SELECT
:在这些都执行结束之后,基本就能得到一个包含所有表所有符合条件的记录,这时候再用SELECT
得到要查询的字段,进行输出- 这时候可以使用
DISTINCT
进行过滤 ORDER BY
最后执行排序与分页,逻辑上来说是先排序后分页(比如我要用工资进行排序的话,我要的是所有工资从低到高,每10条数据显示,而不是10条显示,然后在对这10条进行排序)- 分页,如9所示
举些例子
- 单表查询
SELECT manager_id,count(*) FROM employees WHERE employee_id>3 GROUP BY manager_id;
从employees表里面选择ID>3的各个manager_id的人数
执行顺序
FROM employees WHERE employee_id>3 GROUP BY manager_id COUNT(*) ;
- 双表查询
SELECT e.employee_id,e.last_name,d.location_id FROM employees e JOIN departments d ON e.department_id=d.department_id ORDER BY e.employee_id;
执行顺序
FROM employees e,departments d # 从哪儿表格里面查(双表
ON e.department_id=d.department_id # 连接条件用上,过滤出符合条件的
JOIN departments d # 关联双表
SELECT e.employee_id,e.last_name,d.location_id # 查询字段
ORDER BY e.employee_id; # 排序方式