加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

步步深入MySQL:架构-查询执行流程-SQL解析顺序

发布时间:2018-09-23 14:25:21 所属栏目:编程 来源:AnnsShadoW
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 一、前言 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了。 本文将从MySQL总体架构---查询执行流程---语句执行顺序来探讨一下其中的知识。

如果使用了外连接(LEFT,RIGHT,FULL),主表(保留表)中的不符合ON条件的列也会被加入到VT1-J2中,作为外部行,生成虚拟表VT1-J3。

  1. mysql> SELECT 
  2.     -> * 
  3.     -> FROM 
  4.     -> table1 AS a 
  5.     -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid; 
  6. +-----+------+------+------+ 
  7. | uid | name | oid  | uid  | 
  8. +-----+------+------+------+ 
  9. | aaa | mike |    1 | aaa  | 
  10. | aaa | mike |    2 | aaa  | 
  11. | bbb | jack |    3 | bbb  | 
  12. | bbb | jack |    4 | bbb  | 
  13. | bbb | jack |    5 | bbb  | 
  14. | ccc | mike |    6 | ccc  | 
  15. | ddd | mike | NULL | NULL | 
  16. +-----+------+------+------+ 
  17. 7 rows in set (0.00 sec)  

下面从网上找到一张很形象的关于‘SQL JOINS'的解释图,如若侵犯了你的权益,请劳烦告知删除,谢谢。

步步深入MySQL:架构-查询执行流程-SQL解析顺序 

2、WHERE

对VT1过程中生成的临时表进行过滤,满足WHERE子句的列被插入到VT2表中。

注意:

此时因为分组,不能使用聚合运算;也不能使用SELECT中创建的别名;

与ON的区别:

如果有外部列,ON针对过滤的是关联表,主表(保留表)会返回所有的列;

如果没有添加外部列,两者的效果是一样的;

应用:

对主表的过滤应该放在WHERE;

对于关联表,先条件查询后连接则用ON,先连接后条件查询则用WHERE;

  1. mysql> SELECT 
  2.     -> * 
  3.     -> FROM 
  4.     -> table1 AS a 
  5.     -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid 
  6.     -> WHERE 
  7.     -> a. NAME = 'mike'; 
  8. +-----+------+------+------+ 
  9. | uid | name | oid  | uid  | 
  10. +-----+------+------+------+ 
  11. | aaa | mike |    1 | aaa  | 
  12. | aaa | mike |    2 | aaa  | 
  13. | ccc | mike |    6 | ccc  | 
  14. | ddd | mike | NULL | NULL | 
  15. +-----+------+------+------+ 
  16. 4 rows in set (0.00 sec)  

3、GROUP BY

这个子句会把VT2中生成的表按照GROUP BY中的列进行分组。生成VT3表。

注意:

其后处理过程的语句,如SELECT,HAVING,所用到的列必须包含在GROUP BY中,对于没有出现的,得用聚合函数;

原因:

GROUP BY改变了对表的引用,将其转换为新的引用方式,能够对其进行下一级逻辑操作的列会减少;

我的理解是:

根据分组字段,将具有相同分组字段的记录归并成一条记录,因为每一个分组只能返回一条记录,除非是被过滤掉了,而不在分组字段里面的字段可能会有多个值,多个值是无法放进一条记录的,所以必须通过聚合函数将这些具有多值的列转换成单值;

  1. mysql> SELECT 
  2.     -> * 
  3.     -> FROM 
  4.     -> table1 AS a 
  5.     -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid 
  6.     -> WHERE 
  7.     -> a. NAME = 'mike' 
  8.     -> GROUP BY 
  9.     -> a.uid; 
  10. +-----+------+------+------+ 
  11. | uid | name | oid  | uid  | 
  12. +-----+------+------+------+ 
  13. | aaa | mike |    1 | aaa  | 
  14. | ccc | mike |    6 | ccc  | 
  15. | ddd | mike | NULL | NULL | 
  16. +-----+------+------+------+ 
  17. 3 rows in set (0.00 sec)  

4、HAVING

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读