`

left join on and

 
阅读更多
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
      在使用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中,返回的结果集是相同的。
分享到:
评论

相关推荐

    left_join_on_and与left_join_on_where的区别

    left_join_on_and与left_join_on_where的区别

    hive sql + left join 数据缺失

    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参数配置**: ...

    Left join优化规则的研究

    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 后面的区别

    ### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...

    from 多张表 等于 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表中的匹配...

    深入Oracle的left join中on和where的区别详解

    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='...

    SQL中的left outer join,inner join,right outer join用法详解

    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) 右外连接是将右边表的全部行与左边表中的匹配行连接起来,例如: ...

    SQL _join on 和where的执行顺序1

    2. SELECT * FROM tab1 LEFT JOIN tab2 ON (tab1.size = tab2.size AND tab2.name='AAA') 在这个查询中,ON条件同时考虑了tab1.size = tab2.size和tab2.name='AAA',因此在生成中间表时就已经过滤了一部分记录。...

    MySQL left join操作中on和where放置条件的区别介绍

    LEFT JOIN table2 b ON (a.No = b.No) AND b.name = 'aaa'; ``` 这样,我们得到的结果将包括所有`table1`的行,即使在`table2`中没有`name='aaa'`的匹配项。 然而,如果我们将条件移到`WHERE`子句中: ```sql ...

    MySQL IF、 Bewteen、 AS、 Date_Format、Left join on等关键字实例

    本文将通过一个实例来讲解MySQL中的几个关键关键字:IF、BETWEEN、AS、DATE_FORMAT以及LEFT JOIN ON的用法。 首先,我们来看`IF`关键字。IF语句在SQL中常用于条件判断,它允许你在查询中根据条件返回不同的值。在给...

    mysql多个left join连接查询用法分析

    MySQL中的LEFT JOIN是一种关联多个表的方法,用于返回左表的所有记录以及右表匹配的记录。在某些场景下,我们可能需要连接多个表来获取全面的数据信息。本篇文章将深入探讨MySQL多个LEFT JOIN连接查询的用法,通过...

    解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题

    在这个Laravel的查询示例中,我们通过闭包函数传递给`leftJoin`方法,在闭包内部使用`on`方法来添加所有必要的连接条件。这样可以确保即使在筛选条件下,左表的记录也会被返回,而右表中不符合条件的记录则会显示为...

    SQL 外链接操作小结 inner join left join right join

    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表、...

    ThinkPHP采用原生query实现关联查询left join实例

    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 使用详解

    MySQL 的 LEFT JOIN 是一种用于联接两个或更多表的 SQL 操作,它返回左表(即在 JOIN 语句左侧的表)的所有记录,以及右表(JOIN 语句右侧的表)与左表匹配的记录。如果右表中没有匹配的记录,结果集中的相应列将...

    inner join 内联与left join 左联的实例代码

    本篇文章将深入探讨两种常见的JOIN类型:INNER JOIN(内联)和LEFT JOIN(左联),并结合实例代码来解析它们的工作原理和用法。 INNER JOIN,也称为内连接,返回的是两个表中满足特定条件的匹配行。换句话说,只有...

    sql join on 用法

    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) ...

    LINQ to SQL语句之Join和Order By

    [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...

    SQL中JOIN的使用详解

    本文将详细介绍五种主要的`JOIN`类型:`CROSS JOIN`、`LEFT JOIN`、`RIGHT JOIN`、`INNER JOIN`、`SELF JOIN`以及`FULL JOIN`。 #### 1. CROSS JOIN (交叉连接) `CROSS JOIN`也称为交叉连接,它的作用是返回两个表...

Global site tag (gtag.js) - Google Analytics