博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
外连接 ON 条件的三个作用及与 WHERE 的区别
阅读量:4219 次
发布时间:2019-05-26

本文共 2223 字,大约阅读时间需要 7 分钟。

SELECT *

  FROM a LEFT JOIN b ON a.id=b.id

    AND a.id=1 AND b.id=2

这里 ON 中有三个条件,其意义分别为:

  • a.id=b.id 两个表的连接条件,只有 a.id 与 b.id 相同的记录才进行匹配。
  • a.id=1 符合这个条件的记录被另一个表匹配。
  • b.id=2 符合这个条件的记录去匹配另一个表。

可以看到 a.id=b.id 指定如何匹配;a.id=1 表示谁被匹配(不表示最终结果的筛选条件);b.id=2 表示用谁去匹配(不表示最终结果的筛选条件)。

实例

表 a:

id    v

----

1     a1

2     a2

3     a3

4     a4

5     a5

表 b:

id    v

----

1     b1

2     b2

3     b3

4     b4

5     b5

SQL 语句:

SELECT *

  FROM a LEFT JOIN b ON a.id=b.id

    AND a.id=1 AND b.id=2

结果:

1 a1 NULL NULL

2 a2 NULL NULL

3 a3 NULL NULL

4 a4 NULL NULL

5 a5 NULL NULL 

为什么会有这样的结果呢,据条件可知:a 表只有第一条记录被匹配,后面的记录都不被匹配;b 表只拿第二条记录去匹配 a 表的第二条记录,可是 a 表的第二条记录不参加匹配,所以 b 表结果全部为 NULL。

我们再看看把条件写在 WHERE 中的结果

SQL 语句:

SELECT *

  FROM a LEFT JOIN b ON a.id=b.id

  WHERE a.id=1 AND b.id=2

结果:

结果是零条记录,什么也没有,本来连接后结果为:

1 a1 1 b1

2 a2 2 b2

3 a3 3 b3

4 a4 4 b4

5 a5 5 b5

可是并没有符合 a.id=1 且 b.id=2 的记录,所以为零条记录。

再回顾一下 WHERE 中的三个条件。下面的示例演示了:a 表中只有 a.id>1 的记录才参加匹配(但要全部选出来,因为它是左连接的左边的表),b 表中只有 b.id=2 的记录才参加匹配(只有它才有被选出来的机会,因为它是左连接的右边的表)

SQL 语句:

SELECT *

  FROM a LEFT JOIN b ON a.id=b.id

    AND a.id>1 AND b.id=2

结果:

1 a1 NULL NULL

2 a2 2    b2

3 a3 NULL NULL

4 a4 NULL NULL

5 a5 NULL NULL 

另外我又试了其它几个sql语句结果如下:

SQL 语句:

SELECT a.*,b.*

 
FROM a LEFT JOIN b ON a.id=b.id

    
AND a.id=1

结果:

1
a1        
1
b1        
2
a2        
NULL
NULL
3
a3        
NULL
NULL
4
a4        
NULL
NULL
5
a5        
NULL
NULL

SQL 语句:

SELECT a.*,b.*

 
FROM a LEFT JOIN b ON a.id=b.id

    
AND a.id=18

结果:

1
a1        
NULL
NULL
2
a2        
NULL
NULL
3
a3        
NULL
NULL
4
a4        
NULL
NULL
5
a5        
NULL
NULL
SQL 语句:

SELECT a.*,b.*

 
FROM a LEFT JOIN b ON a.id=b.id

    
AND b.id=2 

结果:

1
a1        
NULL
NULL
2
a2        
2
b2        
3
a3        
NULL
NULL
4
a4        
NULL
NULL
5
a5        
NULL
NULL
SQL 语句:

SELECT a.*,b.*

 
FROM a LEFT JOIN b ON a.id=b.id

    
AND b.id=18

结果:

1
a1        
NULL
NULL
2
a2        
NULL
NULL
3
a3        
NULL
NULL
4
a4        
NULL
NULL
5
a5        
NULL
NULL
SQL 语句:

SELECT a.*,b.*

 
FROM a LEFT JOIN b ON a.id=b.id

    
AND a.id=2 
AND b.id=2

结果:

1
a1        
NULL
NULL
2
a2        
2
b2  
3
a3        
NULL
NULL
4
a4        
NULL
NULL
5
a5        
NULL
NULL

SQL 语句:

SELECT a.*,b.*

 
FROM a LEFT JOIN b ON a.id=b.id

    
AND a.id=18 
AND b.id=2

结果:

1
a1        
NULL
NULL
2
a2        
NULL
NULL
3
a3        
NULL
NULL
4
a4        
NULL
NULL
5
a5        
NULL
NULL

SQL 语句:

SELECT a.*,b.*

 
FROM a LEFT JOIN b ON a.id=b.id

    
AND a.id=2 
AND b.id=18

结果:

1
a1        
NULL
NULL
2
a2        
NULL
NULL
3
a3        
NULL
NULL
4
a4        
NULL
NULL
5
a5        
NULL
NULL

RIGHT JOIN

RIGHT JOIN 和 LEFT JOIN 类似,只是颠倒一下“主表”和“辅表”,如下 SQL 语句

SELECT *

  FROM a RIGHT JOIN b 

转载地址:http://bflmi.baihongyu.com/

你可能感兴趣的文章
UVM:7.7.1 使用reg_predictor
查看>>
UVM:7.7.2 使用UVM_PREDICT_DIRECT功能与mirror 操作
查看>>
UVM:7.7.3 寄存器模型的随机化与update
查看>>
UVM:7.7.4 扩展位宽
查看>>
UVM:7.8.1 get_root_blocks
查看>>
UVM:7.8.2 get_reg_by_offset 函数
查看>>
UVM:8.1.1 任务与函数的重载
查看>>
UVM:8.1.2 约束的重载
查看>>
UVM:8.2.2 重载的方式及种类
查看>>
UVM:8.2.3 复杂的重载
查看>>
UVM:8.2.4 factory 机制的调试
查看>>
UVM:8.3.1 重载transaction
查看>>
UVM:8.3.2 重载sequence
查看>>
leetcode171.[math] Excel Sheet Column Number
查看>>
Log4j配置
查看>>
java发送https请求
查看>>
java发送https请求证书问题
查看>>
js新消息提醒
查看>>
js窗体消息提醒
查看>>
深入Hibernate映射文件(二)——<hibernate-mapping>的属性
查看>>