Mysql学习笔记

Mysql中查询语句的解析顺序如下:;

(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3)<join_type> JOIN <rigth_table>
(2) ON <join_condition>
(4) WHERE<where_condition>
(5) GROUP BY<group_by_list>
(6) HAVING<having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT<limit_number>

1、FROM:对查询指定的表计算笛卡尔积;
2、ON:按照join_condition过滤数据;
3、JOIN:添加关联外部表数据;
4、WHERE:按照where_condition过滤数据;
5、GROUP BY:进行分组操作;
6、HAVING:按照having_condition过滤数据;
7、SELECT:选择指定的列;
8、DISTINCT:指定列去重;
9、ORDER BY:按照order_by_conditon排序;
10、LIMIT:取出指定记录的数量;

这些步骤执行时,每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回给调用者。如果没有在查询中指定某一字句,将跳过相应的步骤。

SELECT各个阶段分别干了什么?

1.FROM阶段
FROM阶段标识出查询的来源表,并处理表运算符。在涉及到联接运算的查询中(JOIN_TYPE),主要以下几个步骤:
A:求笛卡尔积。不论是什么类型的联接运算,首先都是执行交叉连接(CROSS JOIN),求笛卡尔积(Cartesian product),生成虚拟表VT1-J1。
B:ON筛选器。这个阶段对上个步骤生成的VT1-J1进行筛选,根据ON字句中出现的谓词进行筛选,让谓词取值为TRUE的行通过了考验,插入到VT1-J2
C:添加外部行:如果指定了OUTER JOIN,如LEFT OUTER JOIN、RIGHT OUTER JOIN,还需要将VT1-J2中没有匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。如果FROM字句包含两个以上表,则对上一个连接生成的结果表VT1-J3和下一个表重复依次执行3个步骤,直到处理完所有的表为止。
经过以上步骤,FROM阶段就完成了。
2.WHERE阶段
WHERE阶段是根据<where_condition>中条件对VT1中的行进行筛选,让条件成立的行才会插入到VT2中。此时数据还没有分组,所以不能在WHERE中出现统计的过滤。
3.GROUP BY阶段
GROUP BY阶段按照指定的列名列表,将VT2中的行进行分组,生成VT3。最后每个分组只有一行。在GROUP BY阶段,数据库认为两个NULL值是相等的,因此会将NULL值分到同一个分组中。
4.HAVING阶段
该阶段根据HAVING字句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到VT4中。COUNT(expr)会返回expr不为NULL的行数,count(1)、count(*)会返回包括NULL值在内的所有数量。
5.SELECT阶段
这个阶段是投影的过程,处理SELECT子句提到的元素,产生VT5。这个步骤一般按下列顺序进行:A:计算SELECT列表中的表达式,生成VT5-1。B:若有DISTINCT,则删除VT5-1中的重复行,生成VT5-2。
6.ORDER BY阶段
根据ORDER BY子句中指定的列名列表,对VT5-2中的行,进行排序,生成VT6。如果不指定排序,数据并非是按照主键顺序进行排序的。NULL被视为最小值。
7.LIMIT阶段
取出指定行的记录,产生虚拟表VT7,并返回给查询用户,LIMIT n,m的效率是非常低的,一般可以通过在WHERE条件中指定范围来优化WHERE id >? limit 10。

参考链接https://www.cnblogs.com/warehouse/p/9410599.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值