数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
CREATE TABLE t1 ( id INT, SIZE INT ) CREATE TABLE t2 ( id INT, NAME VARCHAR(10) ) INSERT INTO t1 VALUES (1,10),(2,20),(3,30) INSERT INTO t2 VALUES (10,'AAA'),(20,'BBB'),(20,'CCC') 表1 tab1: id size 1 10 2 20 3 30 表2 tab2: size name 10 AAA 20 BBB 20 CCC 两条SQL: 1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’ 2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’) 第一条SQL的过程: 1、中间表 on条件: tab1.size = tab2.size tab1.id tab1.size tab2.size tab2.name 1 10 10 AAA 2 20 20 BBB 2 20 20 CCC 3 30 (null) (null) 2、再对中间表过滤 where 条件: tab2.name=’AAA’ tab1.id tab1.size tab2.size tab2.name 1 10 10 AAA 第二条SQL的过程: 1、中间表 on条件: tab1.size = tab2.size and tab2.name=’AAA’ (条件不为真也会返回左表中的记录) tab1.id tab1.size tab2.size tab2.name 1 10 10 AAA 2 20 (null) (null) 3 30 (null) (null) 第三条SQL语句: SELECT * FROM T1 LEFT JOIN T2 ON T1.SIZE=T2.id 结果集: 1 10 10 AAA 2 20 20 BBB 2 20 20 CCC 3 30 NULL NULL 如果改为inner join and(where) 情况如下 SELECT * FROM T1 INNER JOIN T2 ON T1.SIZE=T2.id AND T2.[NAME]='AAA' id SIZE id NAME 1 10 10 AAA
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
发表评论
-
转:避免全表扫描的sql优化
2015-02-05 16:37 1318http://tech.diannaodian.com/dw/ ... -
给表加上聚集索引和非聚集索引
2014-12-11 17:28 696创建简单非聚集索引 以下示例为 Purchasing.Pro ... -
查看表中索引语句
2014-12-11 10:37 674SELECT object_name(object_id) ... -
SQL2008一行转多行的精典写法
2013-08-28 12:06 413--创建测试表 create table t1( id ... -
在sql server中利用with as实现递归功能
2013-06-25 10:48 530在sqlserver2005之前,要实现递归功能比较麻烦,比如 ... -
SQL 2005 with(nolock)详解
2013-06-17 17:03 578大家在写查询时, ... -
用SQL语句查询每门成绩都大于80的学生姓名
2013-05-29 10:39 1718昨天遇到的一个SQL面试题,感觉很有趣。 表名stu 结构 ... -
SqlServer强制断开数据库已有连接的方法
2013-02-22 11:03 1619在master数据库中执行如下代码 declare @i IN ... -
Sql获取第一天、最后一天
2013-01-03 14:56 9671① 本月第一天(--减去今天再加上1天) SELECT DAT ... -
表函数与游标
2012-12-25 16:07 740--建立数据源 create table tb1(zm ch ... -
sql server 2005 输出表的函數用法
2012-12-25 16:02 832view sourceprint? 01 --sql ser ... -
SQL杂谈
2012-12-14 17:33 7191、如何用convert什么的把带有时分秒的日期转为时分秒都0 ... -
用FOR XML PATH将查询结果以XML输出
2012-09-20 17:54 1038本文从此而来 http://www.cnblogs.com/d ... -
筛选索引简单使用
2012-08-17 11:29 1149对于在强制实施数据完整性时的一种常见需求,也可以用筛选索引来解 ... -
排名函数(ROW_NUMBER、RANK、DENSE_RANK)及OVER子句
2012-08-10 10:36 6626--在部门内新水排名(如果有相同名次,用dense_rank) ... -
SQL SERVER 中行列转换 PIVOT UNPIVO
2012-08-18 15:34 2327PIVOT用于将列值旋转为列名、同时执行聚合运算(即行转列), ... -
Apply简单使用举例
2012-08-09 17:20 1024APPLY APPLY运算符把右表表达式应用左输入中 ... -
SQL Server 2008语句大全完整版
2012-08-09 10:39 1389--======================== ... -
Not Exists练习
2012-07-23 14:40 886IF OBJECT_ID(N'a') IS NOT NU ... -
Exists练习查找最小缺失值(Missing Value)
2012-07-17 09:34 991第一种方法 USE tempdb; GO IF OBJE ...
相关推荐
left_join_on_and与left_join_on_where的区别
LEFT JOIN TABLE_PARAMS b ON a.TBL_ID = b.TBL_ID AND b.PARAM_KEY = 'bucketing_version' LEFT JOIN DBS c ON a.DB_ID = c.DB_ID WHERE b.TBL_ID IS NULL AND c.NAME = 'dw'; ``` 2. **优化TEZ参数配置**: ...
SELECT * FROM t1 LEFT JOIN t2 ON t1.c1 = t2.d2 WHERE condition1 [AND conditionN]; ``` 若 `conditionK` 涉及到右表 `t2` 的列,并且不是 `t2.column IS NULL` 类型的条件,那么可以优化为 Inner Join: ```sql ...
### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...
LEFT JOIN KCSW ON KCSW_WLID = WL_WLID LEFT JOIN KC ON KC_KCBH = KCSW_KCBH ``` 这部分代码展示了如何使用LEFT JOIN来连接表。首先,它以WL表为基准,然后尝试通过KCSW_WLID = WL_WLID的条件找到KCSW表中的匹配...
2. `SELECT * FROM tab1 LEFT JOIN tab2 ON (tab1.size = tab2.size AND tab2.name='AAA')` 在这种情况下,条件`tab1.size = tab2.size AND tab2.name='AAA'`会同时在生成中间表时应用,这意味着即使`tab2.name='...
SELECT * FROM t_institution i LEFT OUTER JOIN t_teller t ON i.inst_no = t.inst_no WHERE i.inst_no = "5801" 右外连接(Right Outer Join) 右外连接是将右边表的全部行与左边表中的匹配行连接起来,例如: ...
2. SELECT * FROM tab1 LEFT JOIN tab2 ON (tab1.size = tab2.size AND tab2.name='AAA') 在这个查询中,ON条件同时考虑了tab1.size = tab2.size和tab2.name='AAA',因此在生成中间表时就已经过滤了一部分记录。...
LEFT JOIN table2 b ON (a.No = b.No) AND b.name = 'aaa'; ``` 这样,我们得到的结果将包括所有`table1`的行,即使在`table2`中没有`name='aaa'`的匹配项。 然而,如果我们将条件移到`WHERE`子句中: ```sql ...
本文将通过一个实例来讲解MySQL中的几个关键关键字:IF、BETWEEN、AS、DATE_FORMAT以及LEFT JOIN ON的用法。 首先,我们来看`IF`关键字。IF语句在SQL中常用于条件判断,它允许你在查询中根据条件返回不同的值。在给...
MySQL中的LEFT JOIN是一种关联多个表的方法,用于返回左表的所有记录以及右表匹配的记录。在某些场景下,我们可能需要连接多个表来获取全面的数据信息。本篇文章将深入探讨MySQL多个LEFT JOIN连接查询的用法,通过...
在这个Laravel的查询示例中,我们通过闭包函数传递给`leftJoin`方法,在闭包内部使用`on`方法来添加所有必要的连接条件。这样可以确保即使在筛选条件下,左表的记录也会被返回,而右表中不符合条件的记录则会显示为...
LEFT JOIN ((ctarticle AS a LEFT JOIN ctclass AS b ON a.classid = b.classid) LEFT JOIN ctnclass AS c ON a.nclassid = c.nclassid) ON d.articleid = a.articleid; ``` 这个语句将查询cttag表、ctarticle表、...
ON v.attr_id = a.id AND v.site_id = '$site_id' WHERE a.type_id = " . intval($type_id) ." OR a.type_id = 0 ORDER BY a.listorder, a.attr_type, a.id, v.attr_price, v.id"; $row = $Model->query($sql);...
MySQL 的 LEFT JOIN 是一种用于联接两个或更多表的 SQL 操作,它返回左表(即在 JOIN 语句左侧的表)的所有记录,以及右表(JOIN 语句右侧的表)与左表匹配的记录。如果右表中没有匹配的记录,结果集中的相应列将...
本篇文章将深入探讨两种常见的JOIN类型:INNER JOIN(内联)和LEFT JOIN(左联),并结合实例代码来解析它们的工作原理和用法。 INNER JOIN,也称为内连接,返回的是两个表中满足特定条件的匹配行。换句话说,只有...
3. SELECT * FROM a LEFT JOIN b ON a.id = b.id AND b.id = 1 4. SELECT * FROM a LEFT JOIN b ON a.id = 1 ``` 结果分别是: ``` id name id name ----------- ----------- ----------- 1 10 1 10 (1 row(s) ...
[t0].[Discontinued] FROM [dbo].[Products] AS [t0] LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID] WHERE ([t1].[Country] = @p0) AND ([t0].[UnitsInStock] = @p1) -- @p0...
本文将详细介绍五种主要的`JOIN`类型:`CROSS JOIN`、`LEFT JOIN`、`RIGHT JOIN`、`INNER JOIN`、`SELF JOIN`以及`FULL JOIN`。 #### 1. CROSS JOIN (交叉连接) `CROSS JOIN`也称为交叉连接,它的作用是返回两个表...