先来看两个表的数据:
完事以上述两表为基础,我们来进行说明。
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 时,on 和 where 条件的区别:
- 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;
好啦,本次记录就到这里了。
如果感觉不错的话,请多多点赞支持哦。。。