关于SQL JOIN相关条件语句的理解
一。各种 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 条件的区别如下:
- on 条件是生成临时表使用的条件,on 中的条件决定了两表中的记录是否与另一个表交叉连接,但保留基准表 (左表) 中不符合条件的记录.
- where 条件则是对生成好的临时表进行过滤的条件,这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
2. 示例#
例表如下:
A 表:
B 表:
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 表的交叉连接表
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 语句 6 执行结果:
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 语句 8 执行结果:
由 sql 语句 7 和 8, 结合前面 on 条件的两个例子可知 where 条件基于 on 条件生成的临时表进行过滤.
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: