翼度科技»论坛 编程开发 mysql 查看内容

MySQL Select 语句执行顺序

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
一条 SQL 查询语句结构如下:
  1. SELECT
  2. DISTINCT <select_list>
  3. FROM <left_table> <join_type> JOIN <right_table> ON <join_condition>
  4. WHERE <where_condition>
  5. GROUP BY <group_by_list>
  6. HAVING <having_condition>
  7. ORDER BY <order_by_condition>
  8. LIMIT <limit_number>
复制代码
但真正的执行步骤如下,执行时,每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入:
1. FROM

在这一步,无论后面跟那种联接运算(LEFT JOIN、RIGHT JOIN等),都首先执行交叉联接(CROSS JOIN),计算笛卡尔积,生成虚拟表 VT-1
2. ON

根据 ON 的筛选条件对 VT-1 进行筛选,生成 VT-2
3. JOIN

如果指定了OUTER JOIN(如 LEFT JOIN、RIGHT JOIN),将上一步没有匹配的行添加到 VT-2,生成 VT-3。例如 LEFT JOIN 会将左表的剩余数据添加到 VT-2 中
如果 FROM 子句包含两个以上表,则这一步最后生成的虚表 VT-3 和 FROM 子句的下一个表重复依次执行前述三个步骤,直到处理完所有的表为止
4. WHERE

根据条件对 VT-3 进行筛选,条件成立的行插入 VT-4
5. GROUP BY

按照指定的列名对 VT-4 的行进行分组,生成VT-5,最后每个分组只有一行
6. HAVING

使用聚合函数对 VT-5 的分组进行筛选,生成 VT-6
7. SELECT

投影获取指定的列,如有表达式则计算,生成 VT-7
8. DISTINCT

数据除重,生成 VT-8
9. ORDER BY

根据 ORDER BY 子句中指定的列排序,生成 VT-9
10.  LIMIT

取出指定行的记录,产生 VT-10,并返回给查询用户

来源:https://www.cnblogs.com/Yee-Q/p/17844364.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具