MySQL Select 语句执行顺序

打印 上一主题 下一主题

主题 996|帖子 996|积分 2988

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一条 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,并返回给查询用户

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表