四:mysql解析顺序

mysql语法顺序
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 >
执行顺序
--行过滤
 1 FROM 
 2 ON 
 3  JOIN  
 4 WHERE         
 5 GROUP BY 
 6 HAVING 
 --列过滤
 7 SELECT                         
 8 DISTINCT 
 --排序
 9 ORDER BY 
 -- MySQL附加
10 LIMIT            
 第二步和第三步会循环执行
 第四步会循环执行,多个条件的执行顺序是从左往右的。
 分组之后才会执行SELECT
 前9步都是SQL92标准语法。limit是MySQL的独有语法。

1. from
对FROM的左边的表和右边的表计算笛卡尔积(CROSS JOIN)。产生虚表VT1
2. on
虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。
3.OUTER JOIN添加外部列
如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表
VT2中,产生虚拟表VT3
(如果FROM子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。)
4.WHERE
对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
5.GROUP BY
根据group by子句中的列,对VT4中的记录进行分组操作,产生虚拟表VT5
6.HAVING
对虚拟表VT5应用having过滤,只有符合的记录才会被 插入到虚拟表VT6中。
7.SELECT ***
这个子句对SELECT子句中的元素进行处理,生成
VT7
*表。
8.DISTINCT
寻找VT7表中重复的行,将它们删掉,生成VT8。
9.ORDER BY
对生成的结果表进行排序,生成VT9.
10.limit
LIMIT子句从上一步得到的VT9虚拟表中选出从指定位置开始的指定行数据。


流程说明:
  • 单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据
    SELECT的选择列选择相应的列进行返回最终结果。
  • 两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接类型进行过滤形成中间表;然后根据WHERE
    条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
    笛卡尔积:行相乘、列相加。
  • 多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
    ***WHERE条件解析顺序 ***
  • MySQL :从左往右去执行 WHERE 条件的。
  • Oracle :从右往左去执行 WHERE 条件的。

你可能感兴趣的:(mysql)