`

inner join left join right join on where

 
阅读更多

理解 inner join 和 outer join
inner join :从两个或多个表中,仅返回满足关联条件的行。

left (outer) join :tableA left join tableB 返回表A中所有的记录,对表B中没有符合关联条件的记录返回NULL

full (outer) join:tableA full join tableB 返回表A和B中所有的记录,没有符合关联条件的记录返回NULL。


TABLEA:

C_ID         C_ZT       C_NAME
1            关闭        工单1
2            正常        工单2
3            关闭        工单3
4            正常        工单4


注意:表B中第三条记录的C_NAME为"工单5" 不是"工单3"
TABLEB:

C_ID         C_ZT       C_NAME
1            关闭        工单1
2            正常        工单2
3            关闭        工单5
4            正常        工单4


=================================================

Sql代码 复制代码 收藏代码
  1. select a.*,b.* from tablea a inner join tableb b on (a.c_id=b.c_id and a.c_name = b.c_name)  
select a.*,b.* from tablea a inner join tableb b on (a.c_id=b.c_id and a.c_name = b.c_name)


rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 1 关闭 工单1 1 关闭 工单1
2 2 正常 工单2 2 正常 工单2
3 4 正常 工单4 4 正常 工单4


Sql代码 复制代码 收藏代码
  1. select a.*,b.* from tablea a left join tableb b on (a.c_id=b.c_id and a.c_name = b.c_name)  
select a.*,b.* from tablea a left join tableb b on (a.c_id=b.c_id and a.c_name = b.c_name)


rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 1 关闭 工单1 1 关闭 工单1
2 2 正常 工单2 2 正常 工单2
3 4 正常 工单4 4 正常 工单4
4 3 关闭 工单3 - - -
Sql代码 复制代码 收藏代码
  1. select a.*,b.* from tablea a right join tableb b on (a.c_id=b.c_id and a.c_name = b.c_name)  
select a.*,b.* from tablea a right join tableb b on (a.c_id=b.c_id and a.c_name = b.c_name)


id C_ID   C_ZT      C_NAME        C_ID   C_ZT      C_NAME
1 1 关闭 工单1 1 关闭 工单1
2 2 正常 工单2 2 正常 工单2
3 -     -         3 关闭 工单5
4 4 正常 工单4 4 正常 工单4


Sql代码 复制代码 收藏代码
  1. select a.*,b.*  from tablea a full join tableb b on (a.c_id=b.c_id and a.c_name = b.c_name)  
select a.*,b.*  from tablea a full join tableb b on (a.c_id=b.c_id and a.c_name = b.c_name)


返回五条记录:
第四条是别名为A的记录,由于在别名为B的表中没有找到记录所以B中的字段值返回了空
第四条是别名为B的记录,由于在别名为A的表中没有找到记录所以A中的字段值返回了空

rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 1 关闭 工单1 1 关闭 工单1
2 2 正常 工单2 2 正常 工单2
3 4 正常 工单4 4 正常 工单4
4 3 关闭 工单3 - - -
5 - - - 3 关闭 工单5




如果查询语句为:

Sql代码 复制代码 收藏代码
  1. select gd.*,gd2.* from tableA  gd full join tableB  gd2 on (gd.c_id = gd2.c_id and gd.c_name = '工单5');  
select gd.*,gd2.* from tableA  gd full join tableB  gd2 on (gd.c_id = gd2.c_id and gd.c_name = '工单5');


输出结果为:

rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 1 关闭 工单1 -     - -
2 2 正常 工单2 -     - -
3 3 关闭 工单3 -     - -
4 4 正常 工单4 -     - -
5 -    -   -   1 关闭 工单1  
6 -    -   -   2 正常 工单2
7 -   -    -   3 关闭 工单5
8 -   -    -   4 正常 工单4


注意是8行。

Sql代码 复制代码 收藏代码
  1. select gd.*,gd2.* from tableA  gd full join tableB  gd2 on (gd.c_id = gd2.c_id and gd2.c_name = '工单5');  
select gd.*,gd2.* from tableA  gd full join tableB  gd2 on (gd.c_id = gd2.c_id and gd2.c_name = '工单5');

 

rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 3 关闭 工单3 3 关闭 工单5
2 1 关闭 工单1 - - -
3 4 正常 工单4 - - -
4 2 正常 工单2 - - -
5 - - - 1 关闭 工单1
6 - - - 2 正常 工单2
7 - - - 4 正常 工单4



注意是7行。

再看下面的:

Sql代码 复制代码 收藏代码
  1. select gd.*,gd2.* from tableA  gd left join tableB  gd2 on (gd.c_id = gd2.c_id and gd.c_name = '工单5');  
select gd.*,gd2.* from tableA  gd left join tableB  gd2 on (gd.c_id = gd2.c_id and gd.c_name = '工单5');


rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 1 关闭 工单1 - - -
2 2 正常 工单2 - - -
3 3 关闭 工单3 - - -
4 4 正常 工单4 - - -


Sql代码 复制代码 收藏代码
  1. select gd.*,gd2.* from tableA  gd left join tableB  gd2 on (gd.c_id = gd2.c_id and gd2.c_name = '工单5');  
select gd.*,gd2.* from tableA  gd left join tableB  gd2 on (gd.c_id = gd2.c_id and gd2.c_name = '工单5');

 

rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 3 关闭 工单3 3 关闭 工单5
2 1 关闭 工单1 - -   -     
3 4 正常 工单4 - - -
4 2 正常 工单2           -       - -


Sql代码 复制代码 收藏代码
  1. select gd.*,gd2.* from tableA  gd left join tableB  gd2 on (gd.c_id = gd2.c_id and gd.c_name = '工单2');  
select gd.*,gd2.* from tableA  gd left join tableB  gd2 on (gd.c_id = gd2.c_id and gd.c_name = '工单2');

 

rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 1 关闭 工单1 - - -
2 2 正常 工单2 2 正常 工单2
3 3 关闭 工单3 - - -
4 4 正常 工单4           -        - -




以前我一值会记录on中的条件和where中一样,会对最终的结果做过滤,实际上是理解错了。
比如A left join B 无论在ON 子句中加什么条件去过滤A表中的记录是不可能的,都会输出A表中所有的记录,唯一有区别的时,如果在做两个表关联的记录时,如果找不到对应的关联记录就对B表中的字符赋予NULL。

效果等同于,先对两个条进行内联接,然后都对A表中没有匹配上的记录全部输出,对应B中的字段赋予NULL。

where 子句中的条件是会对联接后的记录做过滤的。比如:

Sql代码 复制代码 收藏代码
  1. select gd.*,gd2.* from tableA gd left join tableB gd2 on (gd.c_id = gd2.c_id ) where gd.c_name = '工单2';  
select gd.*,gd2.* from tableA gd left join tableB gd2 on (gd.c_id = gd2.c_id ) where gd.c_name = '工单2';



只会查询到一条记录,并不是四条记录

rownum C_ID   C_ZT    C_NAME         C_ID   C_ZT    C_NAME
1 2 正常 工单2 2 正常 工单2

 

分享到:
评论

相关推荐

    Mysql之innerjoin,leftjoin,rightjoin详解.pdf

    Mysql 之 inner join、left join、right join 详解 Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner ...

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

    SELECT * FROM t_institution i RIGHT OUTER JOIN t_teller t ON i.inst_no = t.inst_no WHERE i.inst_no = "5801" 全外连接(Full Outer Join) 全外连接是将左、右两个表的全部行连接起来,例如: SELECT * ...

    join on 语句及扩展

    这里我们将深入探讨几种JOIN类型及其使用,以及ON和WHERE子句的区别。 1. INNER JOIN: INNER JOIN返回两个表中匹配的记录。这意味着如果某个记录在其中一个表中没有对应的匹配项,那么这个记录就不会出现在结果集中...

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

    SQL 外链接操作小结 inner join left join right join SQL 外链接操作是关系型数据库管理系统中的一种基本操作,用于从多个表中检索数据。外链接操作可以分为三种:inner join、left join 和 right join。 inner ...

    SQL表连接查询(inner join、full join、left join、right join)1

    在SQL中,主要有四种类型的连接查询:内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。下面将详细解释这四种连接方式。 1. 内连接(INNER JOIN): 内连接返回两个表中...

    关于SQL 中的inner join的使用

    RIGHT JOIN 与 LEFT JOIN 相反,它以右表为基础,即使左表中没有对应的记录,也会显示右表的所有记录,并且左表中对应的列显示为 NULL。 #### 八、总结 本文详细介绍了 SQL 中 INNER JOIN 的基本概念、语法结构...

    sql语句join中on和where的区别

    3. **FULL JOIN ON**: 返回两个表中的行,相当于LEFT JOIN + RIGHT JOIN。它会显示两个表中所有记录,无论是左表还是右表中的记录,只要有一个表中有对应记录就会显示出来。 - **示例**: 查询资产类型和资产类型组...

    SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化

    例如,如果LEFT JOIN后的WHERE子句限制了JOIN条件,使得所有生成的NULL行都不满足,那么可以将LEFT JOIN简化为INNER JOIN。 嵌套循环JOIN算法: 嵌套循环JOIN是最基础的JOIN算法,它依次遍历每个表,找到匹配的行。...

    Left join优化规则的研究

    当 Left Join 可以被转化为 Inner Join 时,通常是因为在 WHERE 子句中存在关于右表的非 NULL 条件。这允许数据库跳过对左表中无匹配项的记录,从而提高查询速度。 2.1 条件转化 对于以下 Left Join 查询: ```sql ...

    SQL _join on 和where的执行顺序1

    对于LEFT JOIN、RIGHT JOIN和FULL JOIN,ON条件的过滤是在生成中间表时进行的,而WHERE是在中间表生成后应用。而对于INNER JOIN,由于它只返回匹配的记录,所以ON和WHERE在功能上是等价的。理解这些概念对于优化SQL...

    left join 过滤条件写在on后面和写在where 后面的区别

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

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

    当我们涉及到LEFT JOIN时,可能会遇到使用ON和WHERE子句的情况,两者虽然都可以用来指定条件,但在语义上有所区别。 首先,ON子句是在生成联接结果集(临时表)时应用的条件。无论ON条件是否为真,都会返回左表的...

    hive sql + left join 数据缺失

    LEFT JOIN DBS c ON a.DB_ID = c.DB_ID WHERE b.TBL_ID IS NULL AND c.NAME = 'dw'; ``` 2. **优化TEZ参数配置**: - 调整TEZ引擎的相关参数,比如增大允许的输入数据大小等,以避免数据丢失的问题。 - 可以...

    inner join-outer join-cross join查询方式总结

    根据连接方式的不同,可以分为内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN 和 FULL JOIN)以及交叉连接(CROSS JOIN)。下面我们将详细探讨每种连接方式的特点、适用场景及其具体的实现方法。 #### 内...

    解析sql语句中left_join、inner_join中的on与where的区别

    这意味着在LEFT JOIN中,WHERE子句的条件会减少最终结果中的行数,而在INNER JOIN中,WHERE子句的条件与ON子句的效果相同,因为它们都在连接时应用。 在性能方面,虽然SQL语句6和7的逻辑效果相同,但它们的执行计划...

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

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

    SQL联合查询inner join、outer join和cross join的区别详解

    在SQL查询中,联合查询是将两个或多个表格的数据结合在一起的一种方法,主要涉及三种类型的联合:INNER JOIN、OUTER JOIN(包括LEFT JOIN、RIGHT JOIN和FULL JOIN)以及CROSS JOIN。理解这些概念对于数据库开发人员...

    pcw0118#ZXBlog#七种inner join1

    第一种inner join: 第二种left join: 第三种right join: 第四种left join where b.id is null: 第五种

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

    在多表查询时,如果连接条件影响到连接的结果,必须将它们放在`ON`后面,以确保`LEFT JOIN`或`RIGHT JOIN`的正确行为。对于不影响连接的条件,放在`ON`或`WHERE`后面都可以,但这不会改变连接类型的效果。 总结一下...

Global site tag (gtag.js) - Google Analytics