关于SQL JOIN相关条件语句的理解

一。各种 join 的概念和作用#

关于SQL JOIN相关语句的理解

  • inner join: 内连接 , 只返回两个表中符合条件的记录.
  • left join: 左连接 , 返回左表中所有记录及右表中符合条件的记录.
  • right join: 右连接 , 返回右表中所有记录及左表中符合条件的记录.
  • full join: 外连接 , 返回两个表中的记录 (left join+right join).

二.sql 语句 join 中的 on 和 where 关键字#

1.left/right join 中 on 和 where 的区别#

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用 left jion 时,on 和 where 条件的区别如下:

  1. on 条件是生成临时表使用的条件,on 中的条件决定了两表中的记录是否与另一个表交叉连接,但保留基准表 (左表) 中不符合条件的记录.
  2. where 条件则是对生成好的临时表进行过滤的条件,这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

2. 示例#

例表如下:
A 表:
关于SQL JOIN相关语句的理解
B 表:
关于SQL JOIN相关语句的理解

sql 语句 1:

select * from a,b;

sql 语句 2:

select * from a inner join b;

sql 语句 3:

select * from a left join b on a.id is not null;

sql 语句 4:

select * from a right join b on a.id is not null;

结果都是一样的,返回 a,b 表的交叉连接表
关于SQL JOIN相关语句的理解

on 条件示例#

sql 语句 5:

select * from a left join b on a.id > 1;

sql 语句 6:

select * from b left join a on a.id > 1;

sql 语句 5 执行结果:
关于SQL JOIN相关语句的理解
sql 语句 6 执行结果:
关于SQL JOIN相关语句的理解
sql 语句 5 可见不符合 a.id > 1 条件的记录不参与两表的交叉连接,但是 a 表为基准表,所以仍然保留显示不符合条件的记录.
sql 语句 6 不符合 a.id > 1 条件的记录同样不参与两表的交叉连接,但 a 表作为连接表不符合条件的记录则不会保留.

where 条件示例#

基于语句 5 和语句 6 添加 where 条件
sql 语句 7:

select * from a left join b on a.id > 1 where a.id < 3;

sql 语句 8:

select * from b left join a on a.id > 1 where a.id < 3;

sql 语句 7 执行结果:
关于SQL JOIN相关语句的理解
sql 语句 8 执行结果:
关于SQL JOIN相关语句的理解
由 sql 语句 7 和 8, 结合前面 on 条件的两个例子可知 where 条件基于 on 条件生成的临时表进行过滤.

本作品采用《CC 协议》,转载必须注明作者和本文链接