1.笛卡尔积(Cartesian product)

顾名思义, 这个概念得名于笛卡儿. 在数学中,两个集合 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)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。

2.Join类型

cross join 是笛卡儿乘积就是一张表的行数乘以另一张表的行数.
inner join 只返回两张表连接列的匹配项.
left join 第一张表的连接列在第二张表中没有匹配是,第二张表中的值返回null.
right join 第二张表的连接列在第一张表中没有匹配是,第一张表中的值返回null. 
full join 返回两张表中的行 left join+right join.

3.在对两表进行各种类型的join (cross, left, right, full, inner)时, 都需要构造笛卡尔积.

有时想想不可思议, 若两个特大表进行join, 难道sql就直接上笛卡尔积吗? 难道不事前进行on的条件过滤吗? 那数据量得多大?

4.查一下MSDN就清楚了整个SQL的执行顺序.

http://msdn.microsoft.com/en-us/library/ms189499(v=SQL.100).aspx

Processing Order of the SELECT statement
The following steps show the processing order for a SELECT statement.

1.FROM

2.ON

3.JOIN

4.WHERE

5.GROUP BY

6.WITH CUBE or WITH ROLLUP

7.HAVING

8.SELECT

9.DISTINCT

10.ORDER BY

11.TOP

也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据.

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

如果没有在查询中指定某一子句,将跳过相应的步骤。

下面是<<Inside Microsoft SQL Server 2008 T-SQL Querying>>一书中给的一幅SQL 执行顺序的插图.

5.On的其余过滤条件放Where里效率更高还是更低?

select * from table1 as a

inner join table2 as b on a.id=b.id and a.status=1

select * from table1 as a

inner join table2 as b on a.id=b.id

where a.status=1

查查MSDN就清楚了. http://msdn.microsoft.com/en-us/library/ms189499(v=SQL.100).aspx

There can be predicates that involve only one of the joined tables in the ON clause. Such predicates also can be in the WHERE clause in the query. Although the placement of such predicates does not make a difference for INNER joins, they might cause a different result when OUTER joins are involved. This is because the predicates in the ON clause are applied to the table before the join, whereas the WHERE clause is semantically applied to the result of the join.

翻译之后是, 如果是inner join, 放on和放where产生的结果一样, 但没说哪个效率速度更高? 如果有outer join (left or right), 就有区别了, 因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后.

综合一下, 感觉还是放在on里更有效率, 因为它先于where执行.

听说可以通过sql的查询计划来判别实际的结果, 明天再研究, 欢迎高手给与批评指正.

********************************************************************************************************

2011/11/21 最新体会

刚看到<<Microsoft SQL Server 2008技术内幕: T-SQL查询>>一书中对于连接的描述和我先前理解的不太一样;

Itzib在书上说先笛卡尔积, 然后再on过滤, 如果join是inner的, 就继续往下走, 如果join 是left join, 就把on过滤掉的左主表中的数据再添加回来; 然后再执行where里的过滤;

on中不是最终过滤, 因为后面left join还可能添加回来, 而where才是最终过滤.

只有当使用外连接(left, right)时, on 和 where 才有这个区别, 如果用inner join, 在哪里制定都一样, 因为on 之后就是where, 中间没有其它步骤.

转载于:https://www.cnblogs.com/lihongda/p/9053678.html

带left join 的sql的执行顺序相关推荐

  1. 2021-07-01带Left Join的SQL语句的执行顺序

    select a.name,b.name from T_left a            //1 Left Join T_Right b   //3 ON  a.id = b.id         ...

  2. 带Left Join的SQL语句的执行顺序

    基础的SQL执行顺序 SQL语句执行的时候是有一定顺序的.理解这个顺序对SQL的使用和学习有很大的帮助. 1.from 先选择一个表,或者说源头,构成一个结果集. 2.where 然后用where对结 ...

  3. mysql oracle 查询语句执行顺序_MySQL sql语句执行顺序

    (8)     DISTINCT (1)     FROM (3)      JOIN (2)     ON (4)     WHERE (5)     GROUP BY (6)     HAVING ...

  4. 25、Sql语句执行顺序

    sql语句定义和执行顺序 摘自<MySQL技术内幕:SQL编程> sql语句定义的顺序 (1) SELECT (2)DISTINCT<select_list> (3) FROM ...

  5. 【转】SQL 语句执行顺序

    From:http://www.jellythink.com/archives/924 Oracle-SQL语句执行原理和完整过程详解:https://wenku.baidu.com/view/398 ...

  6. SQL 语句执行顺序

    From:http://www.jellythink.com/archives/924 Oracle-SQL语句执行原理和完整过程详解:https://wenku.baidu.com/view/398 ...

  7. MySQL join 与where的执行顺序

    MySQL join 与where的执行顺序 -- 写法ok 先过滤后join select * from(select * from u1 where u1.id=3)t join u2 on t. ...

  8. mysql 执行顺序 SQL语句执行顺序分析

    最近在做一个数据库的大作业,算是复习了下MySql里面比较复杂的一些语句的用法,如Left Join之类的.在这里就不对具体语法进行记录了,希望能在以后经常用到,而不是隔好长时间用一次.在这里就记录下 ...

  9. sql语句执行顺序及简单优化

    SQL的执行顺序 (1)from    (表关联,是从后往前.从右到左解析的 ) 所以尽量把数据量大的表放在最左边来进行关联 (2) on     需要从哪个数据表检索数据 (3) join   多表 ...

最新文章

  1. win7 storm搭建
  2. RHEL5.4配置apxs扩展工具
  3. python image模块安装_python之PIL库(Image模块)
  4. 【Java核心面试宝典(1),程序员Javaweb源码
  5. mysql 主从复制优化、并行复制
  6. Linux 下解压文件命令大全
  7. DCMTK:验证服务类用户(C-ECHO操作)
  8. 企业必须关注的IPv6网络安全25问
  9. Jaxb对xml报文头的小修小改
  10. mysql反模式_MongoDB报表实例 -- 标签成员方案
  11. SAP 电商云 Spartacus UI 3.4.5 版本引入的对并发 SSR 请求的支持
  12. 隐藏SAP CRM WebClient UI personalization 里某个field
  13. MFC多文档应用程序同时显示两个视图
  14. vivi eboot wince 烧写
  15. 聚类分析(一)基本思想
  16. 蜗牛导航网站模板+随机壁纸+天气插件
  17. 苹果Swift语言入门教程【中文版】
  18. [转] C++中 const, volatile, mutable用法
  19. Spring Boot 问题记录
  20. mac terminal终端快速打开指定文件夹

热门文章

  1. 【Linux】一步一步学Linux——logout命令(209)
  2. 【Linux】一步一步学Linux——groupmod命令(89)
  3. 【Android】Intent介绍及Intent在Activity中的使用方法
  4. matlab 滤掉高斯噪声吗,我想问一下:怎么用matlab编写函数对图像进行高斯滤波以去除噪声...
  5. 每天一道LeetCode-----链表插入排序
  6. hadoop(3)——yarn查看方式
  7. 比特位计数—leetcode338
  8. 此域的推荐安全级别是“安全级-高”的解决办法
  9. Java批量完成对文件夹下全部的css与js压缩,利用yuicompressor
  10. 电路知识--认识原理图(四)