目录

1.语法顺序

2.执行顺序

3.优化方法

1.join 方面

2.where 方面


1.语法顺序

select语句的语法格式如下。
select 字段列表
from 数据源
[ where条件表达式 ]
[ group by 分组字段
[ having条件表达式 ]
[ order by 排序字段 [ asc | desc ] ]

2.执行顺序

  1. FROM  对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1

  2. ON       对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。

  3. JOIN   如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。

  4. WHERE  对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。

  5. GROUP BY  根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.

  6. WITH CUBE or WITH ROLLUP  对表VT5进行cube或者rollup操作,产生表VT6.

  7. HAVING  对虚拟表VT6应用having过滤,只有符合的记录才会被 插入到虚拟表VT7中。

  8. SELECT  执行select操作,选择指定的列,插入到虚拟表VT8中。

  9. DISTINCT  对VT8中的记录进行去重。产生虚拟表VT9.

  10. ORDER BY  将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.

  11. TOP 取出指定行的记录,产生虚拟表VT11, 并将结果返回。

这些步骤执行时,每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入.这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。

3.优化方法

1.join 方面

1.1.笛卡尔积:

在数学中,两个集合 X 和 Y 的笛卡儿积(Cartesian product),又称直积,表示为 X × Y,是其第一个对象是 X 的成员而第二个对象是 Y 的一个成员的所有可能的有序对.

假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}

1.2.join类型

cross join 是笛卡尔积 就是一张表的行数乘以另一张表的行数

inner join 只返回两张表连接列的匹配项

left join 第一张表的连接列在第二张表中没有匹配,第二张表中的值返回null

right join 第二张表的连接列在第一张表中没有匹配,第一张表中的值返回null

full join 返回两张表中的行  相当于 left join + right join

在对两张表的所有join 时,都需要构造笛卡尔积

以下语句为例子

select a.name,b.name

from T_left a    Left Join T_Right b   //1步骤

ON  a.id = b.id         //2步骤

1步骤 首先对From子句中的前两个表,执行笛卡尔积运算。运算结果 形成一个结果集合。

2步骤  按照 on中的条件 ,对上一步骤的结果集进行筛选,形成新的结果集

left join 为例 如果在t_left中存在为匹配到的行,则 把这些行以外部的形式添加到上一步的结果集,形成新的结果集

多个 join 从左到右执行

总结:先生成笛卡尔积,然后on条件过滤,如果join是inner则执行where过滤,如果是left ,rigth ,full ,就把过滤掉的主表数据在添加回来,然后执行where过滤。

如果是使用left,right,full时, on中的条件不是最终过滤,因为后面又可能会添加回来,而where才是最终过滤

2.where 方面

2.1 where的执行顺序

mysq:条件执行顺序是 从左往右,自上而下的

SQL server、orcale:条件执行顺序是从右往左,自下而上

select语句的语法顺序和执行顺序相关推荐

  1. mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序

    SQL语句书写顺序和执行顺序 (7) SELECT (8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9 ...

  2. SQL查询语句的书写顺序、执行顺序和注意事项

    SQL查询语句的书写顺序.执行顺序和注意事项 1,SQL查询语句常用关键字 select .from.where.group by.having.order by select :指定查看结果集中的那 ...

  3. select语句完整语法及执行流程

    select语句完整语法及执行流程 select  目标表的列名或列表达式序列 from 基本表名和(或)视图序列 [where 行条件表达式] [group by  列名序列] [having  组 ...

  4. 一文搞懂select语句在MySQL中的执行流程!

    MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多年后,想跳槽进入大厂, ...

  5. select语句完整语法

    select 语句完整语法: 1) select 目标表和列名或列表达式序列 2) from基本表名和(或)视图序列 3) [where行条件表达式] 4) [group by 列名序列] [havi ...

  6. SQL语句中各个部分的执行顺序(转)

    原文链接:http://www.tuicool.com/articles/fERNv2 写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必 ...

  7. SQL语句的书写顺序和执行顺序

    sql语句的书写顺序: select >> from >> where >> group by >> having >> order by ...

  8. sql语句的书写顺序以及执行顺序

    1. 书写顺序 按以下的顺序书写sql语句 SELECT 查询列表. FROM 表 1 [连接类型] JOIN 表2 ON 连接条件 WHERE 筛选条件 GROUP BY 分组列表 HAVING 分 ...

  9. [Mysql] SQL的书写顺序与执行顺序

    1.SQL书写顺序 -- 完整的SELECT语句(书写顺序) SELECT [DISTINCT] 字段或表达式列表 FROM 表名 JOIN(LEFT JOIN, RIGHT JOIN) ON 连接条 ...

最新文章

  1. 将指定目录下的sql文件名写入到txt文件中
  2. c# timer 销毁_如果表单应用程序关闭C#,如何防止发生Timer Elapsed事件
  3. python paramiko_python中的paramiko模块
  4. mysql oracle 查询语句执行顺序_MySQL sql语句执行顺序
  5. linux下bochs启动黑屏解决办法
  6. matlab操作入门实验报告,matlab操作实验报告
  7. gzip(来源百度百科)
  8. LightOJ - 1243 Guardian Knights(最小费用最大流+bfs)
  9. 这是我第一题AC的线段树
  10. 文件操作(stat函数)
  11. Spring Security xsd 异常
  12. shallow clone
  13. keras实现DeepDream
  14. android类之间的关系,Android 中Activity,Window和View之间的关系
  15. 经典数据可视化案例-百度迁徙图
  16. qq说说时间轴php实现,qq空间时间轴 PHP实现时间轴函数代码
  17. 传美团支付无证经营被央行叫停 限期三个月整改
  18. VMware Linux虚拟机CPU占用过高
  19. deepin+win10EFI分区删了/开机没有win的启动项解决方法
  20. MySQL练习(一)

热门文章

  1. 遗传算法(一)-- 什么是遗传算法
  2. c++不固定数目的数字的输入
  3. eclipse使用lombok注解不起作用
  4. android 属性翻牌动画,Android自定义动画--卡牌翻牌动画
  5. matlab传播损耗,基于MATLAB语言的电波传播路径损耗的仿真
  6. 中国动画的发展以及对未来的憧憬
  7. Unity DOTS ECS 0.50版本,海浪Demo
  8. 认识并使用 Promise
  9. LC-1237. 找出给定方程的正整数解(相向双指针)
  10. ASL查找成功和查找失败的计算方法