🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注
FULL JOIN 全连接查询概述
FULL JOIN
查询又叫全连接查询
它的查询流程是当执行A表 FULL JOIN B表
时,结果集将包括A表
和B表
中的所有记录
。
对于A表
中的每条记录,如果在B表
中存在一条或多条可以进行条件匹配数据,这些记录将被包括在结果集中~ 同理,对于B表
中的每条记录,如果在A表
中存在进行条件匹配数据,那么它们也将被包括在结果集中。
如果某条记录在A表
中没有可以进行条件匹配数据,但它在B表
中有,那么结果集中,这条记录的A表
部分将显示为NULL
,反之亦然!
语法规则如下
SELECT [字段..*] FROM 表A FULL OUTER JOIN 表B ON 表A.关联字段 = 表B.关联字段;
我们在SQL Server 2000
中也可以省略OUTER
关键字
如下
SELECT [字段..*] FROM 表A FULL JOIN 表B ON 表A.关联字段 = 表B.关联字段;
应用场景
我们还是以之前的案例 公司表和员工表
SQL如下
CREATE TABLE Company(cid int PRIMARY KEY IDENTITY,cname VARCHAR(255) NOT NULL,cmsg VARCHAR(255),Address VARCHAR(255),NumberPeople INT
)CREATE TABLE Employee(eid int PRIMARY KEY IDENTITY,ename VARCHAR(255) NOT NULL,eage TINYINT,esaley INT,epart VARCHAR(255) NOT NULL,ephone VARCHAR(255) NOT NULL,cid INT,
)INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('重庆新俊方','科技企业','重庆市渝中区',5000);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('成都水刚','制造企业','成都庆阳',8000);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('重庆欧元','金融企业','重庆市杨家平',450);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('重庆万科集团','房地产企业','重庆市江北',876);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('香港时代证券','金融企业','香港九龙',100);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('贵州圣烟','烟草企业','贵州山脉',682);INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('张军',26,3600,'开发部门','333-222-777',5);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('王辉',30,5600,'技术部门','111-000-888',4);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('张三进',21,2301,'市场部门','666-777-111',2);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('杨小明',26,4520,'开发部门','888-999-000',3);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('刘罗戈',19,7800,'新媒体部门','111-111-111',4);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('毛利兰',22,3000,'市场部门','999-999-321',1);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('詹华',22,8000,'运营部门','999-888-321',8);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('何林',37,2500,'制造部门','100-888-321',9);
我们可以先用FULL JOIN
把这两个表连接起来看看效果!
如下
SELECT * FROM Employee AS c FULL JOIN Company AS e
ON c.cid = e.cid
如图
我们从结果集
上其实就可以看出一个特点,FULL JOIN
其实就是LEFT JOIN
和RIGHT JOIN
的组合形式!
就像上面这个查询~
我们可能有一个包含所有员工记录的表和一个公司表, 如果我们想要生成一份报告,显示出所有员工的信息 , 包括没有员工的公司信息, 那么我们就可以使用FULL JOIN
来连接这两个表。
这样,我们就可以在结果集中看到所有员工信息,以及它们对应的公司信息,或者NULL值, 相反在公司表中也是一样,显示出所有公司,以及对应的员工信息, 我们从结果集中就很容易看到,哪些公司没有员工,哪些员工没有等级注册公司!~
我们再举个例子
比如我们有一家在线书店,有两个重要的数据表:books(书籍表)
和 sales(销售记录表)
books表
包含所有书籍的信息,如: 书籍ID、书名、作者
等等 …
sales表
包含所有销售记录的信息,如: 销售ID、书籍ID、销售数量
等等 …
那么我们先把数据表和数据创建到数据库!~
SQL如下
CREATE TABLE books (book_id INT PRIMARY KEY,title VARCHAR(255) NOT NULL,author VARCHAR(255) NOT NULL
)CREATE TABLE sales (sale_id INT PRIMARY KEY,book_id INT,num INT NOT NULL
)INSERT INTO books (book_id, title, author) VALUES (1, '机器学习', '张三');
INSERT INTO books (book_id, title, author) VALUES (2, 'AI人工智能', '李四');
INSERT INTO books (book_id, title, author) VALUES (3, '三天学会编程开发', '王五');INSERT INTO sales (sale_id, book_id, num) VALUES (101, 1, 130);
INSERT INTO sales (sale_id, book_id, num) VALUES (102, 2, 100);
INSERT INTO sales (sale_id, book_id, num) VALUES (103, 4, 66);
如图
注意
:这里的 book_id = 4
这个值 在 books 表
中不存在,我们用于测试 FULL JOIN
场景需求
那么现在我们想要生成一份报告,显示出所有书籍名称
以及它们的销售记录
!
由于有些书籍可能还没有被销售,而有些销售记录中可能对应着已经不存在的书籍,这完全也是有可能例如,书籍可能被下架或删除,那么销售记录中也可能保留了此书的销售记录,对吧!
这个时候,我们就使用FULL JOIN
来确保结果集
中包含所有书籍名称
和销售记录
,即使它们之间没有直接的匹配关系!
SQL如下
SELECT * FROM books AS b FULL JOIN sales AS s ON b.book_id = s.book_id;
那这里我们能不能提几个问题?
查询哪些书籍可能还没有被销售?
SELECT b.title FROM books AS b FULL JOIN sales AS s ON b.book_id = s.book_id WHERE s.num IS NULL
被下架的书籍ID是多少?
SELECT s.book_id FROM books AS b FULL JOIN sales AS s ON b.book_id = s.book_id WHERE b.book_id IS NULL
怎么样,有了FULL JOIN
是不是很方便了!
不过到底要在什么样子的场景下使用FULL JOIN
跟其他查询方式一样,都是要看具体的需求和逻辑决定的!
如下所示
我们可以清晰的看到,所有书籍名称,以及被删除的书籍对应的书籍ID,以及它的销售记录, 还有没有开始销售的书籍名称!
SELECT b.title,s.book_id,s.num FROM books AS b FULL JOIN sales AS s ON b.book_id = s.book_id
FULL JOIN 与 INNER JOIN 的区别
其实FULL JOIN
的效果正好与INNER JOIN内连接
相反, 这主要体现在它们如何处理两个表中不匹配的数据记录!
INNER JOIN
只会返回两个表
中具有条件匹配关系
的记录,通俗的说只有当两个表中的记录在连接条件上相匹配
时,这些数据记录
才会被包含在结果集中! 明白这个意思吧!
如果某个表中的记录在另一个表中没有匹配的行,则这些记录根本不会出现在结果集
中。
所以我们通常都是在说INNER JOIN
的结果集
是两个表的交集
!~
相反的FULL JOIN
会返回两个表中所有的数据记录
,无论它们是否匹配。
对于在两个表中都存在的匹配记录,FULL JOIN
会在结果集中包含这些行, 对于只存在于一个表中的记录, 即便是没有条件匹配的记录,FULL JOIN
也会在结果集
中显示这些数据记录,但会将缺失的部分填充为NULL
那么FULL JOIN
的结果集是两个表的并集
,并包含了所有不满足查询条件的数据记录,这些不匹配的记录在另一个表的相应字段中会以NULL值
填充~~
最后
差不多讲到这里,这几天我把INNER JOIN、LEFT JOIN 、RIGHT JOIN、FULL JOIN
都给大家介绍了一遍,至于在我们实际开发中,到底用哪个完全取决于现场需求和业务逻辑进行灵活选择, 反正数据库查询这一块大家千万别死记硬背就行了!
"👍点赞" "✍️评论" "收藏❤️"
欢迎一起交流学习❤️❤️💛💛💚💚
好玩 好用 好看
的干货教程可以 点击下方关注❤️ 微信公众号❤️ 说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇