sql使用小技巧之连接( JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL OUTER JOIN) 矫情吗;* 2022-05-14 09:58 203阅读 0赞 先来看两个表的数据: ![70][] ![70 1][] 完事以上述两表为基础,我们来进行说明。 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是相同的,我们来看下逻辑图: ![70 2][] 接下来,我们就通过实例来感受下inner join 的效果: ![70 3][] 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,我们来看下逻辑图: ![70 4][] 我们接下来会以admins为基础来进行和b\_user表的连接查询,所以我们来修改b\_user表中的数据: ![70 5][] 然后嘞,我们就来进行实例操作: ![70 6][] 大家注意红色框框中的数据,和前面的数据对比后大家就会发现不同,那就是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; 来看下逻辑图: ![70 7][] 来看下实例: ![70 8][] 通过对比,咱们会发现,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; 逻辑图如下: ![70 9][] 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; 好啦,本次记录就到这里了。 如果感觉不错的话,请多多点赞支持哦。。。 [70]: /images/20220514/59b5e42d28f545edbbe1db844d72f1e2.png [70 1]: /images/20220514/39a306ea7e204925826800f0febb4f57.png [70 2]: /images/20220514/de50282cafcd46cab18d73902844d4fc.png [70 3]: /images/20220514/793b46f7888442019a2e64ee2107b35d.png [70 4]: /images/20220514/02890e2ce64a4ceeb284c5160ba02efa.png [70 5]: /images/20220514/9f254b45b63d4da9af0d91342981c9a3.png [70 6]: /images/20220514/721b09c5956743e1965a12ba49ac480a.png [70 7]: /images/20220514/7fdb7fe1cd9e45ff915099a1c5505c33.png [70 8]: /images/20220514/aaed1fc2a36e4323bfefed12f475c909.png [70 9]: /images/20220514/3d5b9166e005431fb9bd2375f61e5a81.png
还没有评论,来说两句吧...