sql使用小技巧之连接( JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL OUTER JOIN)

先来看两个表的数据:

 

完事以上述两表为基础,我们来进行说明。

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段,最常见的 JOIN 类型就是SQL INNER JOIN(简单的 JOIN),它用于从多个表中返回满足 JOIN 条件的所有行。来看下我们可以使用的不同的 SQL JOIN 类型:

  • INNER JOIN:如果表中有至少一个匹配,则返回行
  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN:只要其中一个表中存在匹配,则返回行

INNER JOIN 关键字在表中存在至少一个匹配时返回行,语法如下:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

或者

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

从实际意义上来说,inner join 和join是相同的,我们来看下逻辑图:

接下来,我们就通过实例来感受下inner join 的效果:

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL,语法如下:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

或者

SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

有可能在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN,我们来看下逻辑图:

我们接下来会以admins为基础来进行和b_user表的连接查询,所以我们来修改b_user表中的数据:

然后嘞,我们就来进行实例操作:

大家注意红色框框中的数据,和前面的数据对比后大家就会发现不同,那就是LEFT JOIN 关键字从左表(admins)返回所有的行,即使右表(b_user)中没有匹配。

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL,语法如下:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;

或者


SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;

来看下逻辑图:

来看下实例:

通过对比,咱们会发现,RIGHT JOIN 关键字从右表(b_user)返回所有的行,即使左表(admins)中没有匹配。

为了大家更好地理解这个左右连接,咱们来看一段话:

左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。

这段话的来源是《数据库系统原理教程》,王珊,陈红编著,P86。

咱们再来看下在使用 left jion 时,onwhere 条件的区别:

  • 1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
  • 2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。 

详细的信息大家可以自己百度看下,咱这里就不赘述了。之后,咱们来看下FULL OUTER JOIN连接。

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行,它结合了 LEFT JOIN 和 RIGHT JOIN 的结果,来看下语法:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

逻辑图如下:

MySQL中不支持 FULL OUTER JOIN,各位可以在 SQL Server 测试以下实例,sql如下:

select a.title,a.cookies,b.username 
from admins as a 
full outer join b_user as b on a.id=b.password;

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值