sql join 与where的区别

简介: 转载自:http://blog.chinaunix.net/uid-27570589-id-3771152.html今天在分析一个sql语句的时候 发现 left join 与where a=b(+) 产生的执行计划不一样 而且效率也是不一样的到底怎么回事 我在网上找了篇文章分享

(1.)select语句的执行顺序

SELECT 语句的处理顺序

下面是SELECT语句的执行顺序

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, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据. 

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

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

(2) 那 on 和where 哪个更高效呢


如果是inner join, 放on和放where产生的结果一样, 但没说哪个效率速度更高?

如果有outer join (left or right), 就有区别了,

因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后.

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


先笛卡尔积, 然后再on过滤, 如果join是inner的, 就继续往下走,

如果join 是left join, 就把on过滤掉的左主表中的数据再添加回来;

然后再执行where里的过滤;

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


只有当使用外连接(left, right)时, on 和 where 才有这个区别,

如果用inner join, 在哪里制定都一样, 因为on 之后就是where, 中间没有其它步骤.

相关文章
|
1月前
|
SQL 关系型数据库 MySQL
7种SQL Join语句
7种SQL Join语句
18 1
|
4月前
|
SQL
sql 各种join 对比
sql 各种join 对比
30 0
|
4月前
|
SQL 数据库
SQL 查询优化指南:SELECT、SELECT DISTINCT、WHERE 和 ORDER BY
SQL的SELECT语句用于从数据库中选择数据。SELECT语句的基本语法如下:
57 1
|
6月前
|
SQL 数据库
04SQL - SQL连接 left join
04SQL - SQL连接 left join
25 0
|
29天前
|
SQL 缓存 算法
SQL 语句不要过多的 join
SQL 语句不要过多的 join
18 1
|
6月前
|
SQL Java 数据库连接
MyBatis之动态SQL、#与$的区别和结果映射
MyBatis之动态SQL、#与$的区别和结果映射
62 0
|
6月前
|
SQL 安全 Java
Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)
Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)
27 0
|
3月前
|
SQL Java 数据库连接
这个问题是由于Flink在执行SQL语句时,无法找到合适的表工厂来处理JOIN操作。
【1月更文挑战第17天】【1月更文挑战第85篇】这个问题是由于Flink在执行SQL语句时,无法找到合适的表工厂来处理JOIN操作。
23 8
|
3月前
|
SQL 流计算
在Flink SQL中,如果在使用表别名后,WHERE子句中使用了别名,可能会出现找不到表的问题
【1月更文挑战第4天】【1月更文挑战第18篇】在Flink SQL中,如果在使用表别名后,WHERE子句中使用了别名,可能会出现找不到表的问题
32 1
|
4月前
|
SQL 数据库
SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
SQL RIGHT JOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。
65 0