理解 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 |
=================================================
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 |
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 | - | - | - |
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 |
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 |
如果查询语句为:
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行。
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行。
再看下面的:
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 | - | - | - |
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 | - | - | - |
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 子句中的条件是会对联接后的记录做过滤的。比如:
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 之 inner join、left join、right join 详解 Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner ...
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和WHERE子句的区别。 1. INNER JOIN: INNER JOIN返回两个表中匹配的记录。这意味着如果某个记录在其中一个表中没有对应的匹配项,那么这个记录就不会出现在结果集中...
SQL 外链接操作小结 inner join left join right join SQL 外链接操作是关系型数据库管理系统中的一种基本操作,用于从多个表中检索数据。外链接操作可以分为三种:inner join、left join 和 right join。 inner ...
在SQL中,主要有四种类型的连接查询:内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。下面将详细解释这四种连接方式。 1. 内连接(INNER JOIN): 内连接返回两个表中...
RIGHT JOIN 与 LEFT JOIN 相反,它以右表为基础,即使左表中没有对应的记录,也会显示右表的所有记录,并且左表中对应的列显示为 NULL。 #### 八、总结 本文详细介绍了 SQL 中 INNER JOIN 的基本概念、语法结构...
3. **FULL JOIN ON**: 返回两个表中的行,相当于LEFT JOIN + RIGHT JOIN。它会显示两个表中所有记录,无论是左表还是右表中的记录,只要有一个表中有对应记录就会显示出来。 - **示例**: 查询资产类型和资产类型组...
例如,如果LEFT JOIN后的WHERE子句限制了JOIN条件,使得所有生成的NULL行都不满足,那么可以将LEFT JOIN简化为INNER JOIN。 嵌套循环JOIN算法: 嵌套循环JOIN是最基础的JOIN算法,它依次遍历每个表,找到匹配的行。...
当 Left Join 可以被转化为 Inner Join 时,通常是因为在 WHERE 子句中存在关于右表的非 NULL 条件。这允许数据库跳过对左表中无匹配项的记录,从而提高查询速度。 2.1 条件转化 对于以下 Left Join 查询: ```sql ...
对于LEFT JOIN、RIGHT JOIN和FULL JOIN,ON条件的过滤是在生成中间表时进行的,而WHERE是在中间表生成后应用。而对于INNER JOIN,由于它只返回匹配的记录,所以ON和WHERE在功能上是等价的。理解这些概念对于优化SQL...
### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...
当我们涉及到LEFT JOIN时,可能会遇到使用ON和WHERE子句的情况,两者虽然都可以用来指定条件,但在语义上有所区别。 首先,ON子句是在生成联接结果集(临时表)时应用的条件。无论ON条件是否为真,都会返回左表的...
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)、外连接(LEFT JOIN、RIGHT JOIN 和 FULL JOIN)以及交叉连接(CROSS JOIN)。下面我们将详细探讨每种连接方式的特点、适用场景及其具体的实现方法。 #### 内...
这意味着在LEFT JOIN中,WHERE子句的条件会减少最终结果中的行数,而在INNER JOIN中,WHERE子句的条件与ON子句的效果相同,因为它们都在连接时应用。 在性能方面,虽然SQL语句6和7的逻辑效果相同,但它们的执行计划...
本篇文章将深入探讨两种常见的JOIN类型:INNER JOIN(内联)和LEFT JOIN(左联),并结合实例代码来解析它们的工作原理和用法。 INNER JOIN,也称为内连接,返回的是两个表中满足特定条件的匹配行。换句话说,只有...
在SQL查询中,联合查询是将两个或多个表格的数据结合在一起的一种方法,主要涉及三种类型的联合:INNER JOIN、OUTER JOIN(包括LEFT JOIN、RIGHT JOIN和FULL JOIN)以及CROSS JOIN。理解这些概念对于数据库开发人员...
第一种inner join: 第二种left join: 第三种right join: 第四种left join where b.id is null: 第五种
在多表查询时,如果连接条件影响到连接的结果,必须将它们放在`ON`后面,以确保`LEFT JOIN`或`RIGHT JOIN`的正确行为。对于不影响连接的条件,放在`ON`或`WHERE`后面都可以,但这不会改变连接类型的效果。 总结一下...