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

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

发布时间:2018-10-21 09:43:12 所属栏目:编程 来源: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

(编辑:湖南网)

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

热点阅读