SQL查询语句先执行select?

SQL查询语句先执行SELECT?

SELECT 语句的完整语法,如下:

SELECT
DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>

其执行顺序如下:

FROM
<表名> # 笛卡尔积
ON
<筛选条件> # 对笛卡尔积的虚表进行筛选
JOIN <JOIN,LEFT JOIN,RIGHT JOIN...>
<JOIN> # 指定JOIN,用于添加数据到ON之后的虚表中,例如LEFT JOIN会将左表的剩余数据添加到虚表中
WHERE
<WHERE条件> # 对上述虚表进行筛选
GROUP BY
<分组条件> # 分组
<SUM()等聚合函数> # 用于HAVING子句进行判断,在书写上这类聚合函数是写在HAVING判断里面的
HAVING
<分组筛选> # 对分组后的结果进行聚合筛选
SELECT
<返回数据列表> # 返回的单列必须在GROUP BY子句中,聚合函数除外
DISTINCT
# 数据除重
ORDER BY
<排序条件> # 排序
LIMIT
<行数限制>

引擎在执行上述每一步时,都会在内存中形成一张虚拟表,然后对虚拟表进行后续操作,并释放没用的虚拟表的内存,以此类推。

具体介绍一下 SQL 查询语句的执行顺序(下面“VT”表示虚拟表):

  1. FROM:SELECT * FROM table_1, table_2;SELECT * FROM table_1 JOIN table_2; 的结果一致,都是表示求笛卡尔积;用于直接计算两个表笛卡尔积,得到虚拟表VT1,这是所有 SELECT 语句最先执行的操作,其他操作时在这个表上进行的,也就是 FROM 操作所完成的内容
  2. ON:从 VT1 表中筛选符合条件的数据,形成 VT2 表
  3. JOIN:将该 JOIN 类型的数据补充到 VT2 表中,例如 LEFT JOIN 会将左表的剩余数据添加到虚表 VT2 中,形成 VT3 表;若表的数量大于 2,则会重复 1-3 步
  4. WHERE:执行筛选,(不能使用聚合函数)得到 VT4 表
  5. GROUP BY:对 VT4 表进行分组,得到 VT5 表;其后处理的语句,如 SELECT、HAVING,所用到的列必须包含在 GROUP BY 条件中,没有出现的需要用聚合函数
  6. HAVING:筛选分组后的数据,得到 VT6 表
  7. SELECT:返回列得到 VT7 表
  8. DISTINCT:用于去重得到 VT8 表
  9. ORDER BY:用于排序得到 VT9 表
  10. LIMIT:返回需要的行数,得到 VT10

需要注意的是:

  • GROUP BY 条件中,每个列必须是有效列,不能是聚合函数
  • NULL 值也会作为一个分组返回
  • 除了聚合函数,SELECT 子句中的列必须在 GROUP BY 条件中

根据以上内容,我们可以回答以下经常遇到的问题:

  • 可以在 GROUP BY 之后使用 WHERE 吗?不行, WHERE 是在 GROUP BY 之前。
  • 可以基于 GROUP BY 里的东西进行 ORDER BY 吗?可以,ORDER BY 基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY。
  • LIMIT 是在什么时候执行?在最后

但是在实际应用中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询。因为它们会进行一系列优化,在不改变查询结果的前提下,把执行顺序打乱,从而让查询执行得更快。

比如:

select * from score sc left join student stu 
on sc.student_id = stu.id where s.name = 'Jack';

以上语句只需要找出名字叫“Jack”的学生信息,那就没必要对两张表的所有数据执行左连接。在连接之前系统先进行过滤,这样查询会快得多,而且对于这个查询来说,先执行过滤并不会改变查询结果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值