前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >数据库的左右连接和内连接_数据库各种连接的区别

数据库的左右连接和内连接_数据库各种连接的区别

作者头像
全栈程序员站长
发布2022-11-04 21:24:49
发布2022-11-04 21:24:49
4K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

原英文文章链接:https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins 准备 表A:

代码语言:javascript
代码运行次数:0
复制
-- auto-generated definition
CREATE TABLE table_a ( PK INT(10) NOT NULL PRIMARY KEY, Value VARCHAR(25) NULL ) COMMENT '表A';

表B:

代码语言:javascript
代码运行次数:0
复制
-- auto-generated definition
CREATE TABLE table_b ( PK INT(10) NOT NULL PRIMARY KEY, Value VARCHAR(50) NULL ) COMMENT '表B';

表A数据

表B数据:

下面是各种连接的韦恩图:

详细分析 1.INNER JOIN (内连接) 内连接是一种一一映射关系,就是两张表都有的才能显示出来 用韦恩图表示是两个集合的交集,如图:

实现代码:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value FROM table_a A INNER JOIN table_b B ON A.PK = B.PK;

查询结果:

2.LEFT JOIN (左连接) 左连接是左边表的所有数据都有显示出来,右边的表数据只显示共同有的那部分,没有对应的部分只能补空显示,所谓的左边表其实就是指放在left join的左边的表 用韦恩图表示如下:

实现代码:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value FROM table_a A LEFT JOIN table_b B ON A.PK = B.PK;

查询结果:

3.RIGHT JOIN(右连接) 右连接正好是和左连接相反的,这里的右边也是相对right join来说的,在这个右边的表就是右表 用韦恩图表示如下:

实现代码:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value FROM table_a A RIGHT JOIN table_b B ON A.PK = B.PK;

查询结果:

4.OUTER JOIN(外连接、全连接) 查询出左表和右表所有数据,但是去除两表的重复数据 韦恩图表示如下:

实现代码:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value FROM table_a A FULL JOIN table_b B ON A.PK = B.PK;

上面代码在mysql执行是报错的,因为mysql不支持全连接,只能用以下代码实现效果,含义是左连接+右连接+去重=全连接:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value FROM table_a A LEFT JOIN table_b B ON A.PK = B.PK UNION SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value FROM table_a A RIGHT JOIN table_b B ON A.PK = B.PK;

查询结果:

5.LEFT JOIN EXCLUDING INNER JOIN(左连接不包含内连接) 这个查询是只查询左边表有的数据,共同有的也不查出来 韦恩图表示如下:

实现代码:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A LEFT JOIN Table_B B ON A.PK = B.PK WHERE B.PK IS NULL

查询结果:

6.RIGHT JOIN EXCLUDING INNER JOIN(右连接不包含内连接) 这个查询是只查询右边表有的数据,共同有的也不查出来 韦恩图表示如下:

实现代码:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK, A.Value AS A_Value, B.PK AS B_PK, B.Value AS B_Value FROM Table_A A RIGHT JOIN Table_B B ON A.PK = B.PK WHERE A.PK IS NULL

查询结果:

7.OUTER JOIN EXCLUDING INNER JOIN(外连接不包含内连接) 意思就是查询左右表各自拥有的那部分数据 韦恩图表示如下:

实现代码:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A FULL OUTER JOIN Table_B B ON A.PK = B.PK WHERE A.PK IS NULL OR B.PK IS NULL

由于mysql不支持full join,只能通过下面代码模拟实现:

代码语言:javascript
代码运行次数:0
复制
SELECT A.PK AS A_PK, A.Value AS A_Value, B.PK AS B_PK, B.Value AS B_Value FROM table_a A LEFT JOIN table_b B ON A.PK = B.PK WHERE B.PK IS NULL UNION ALL SELECT * FROM table_a A RIGHT JOIN table_b B ON A.PK = B.PK WHERE A.PK IS NULL;

查询结果:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/191698.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月19日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档