【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 浅谈SQL JOIN多表查询之FULL JOIN 全连接查询
🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注
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
都给大家介绍了一遍,至于在我们实际开发中,到底用哪个完全取决于现场需求和业务逻辑进行灵活选择, 反正数据库查询这一块大家千万别死记硬背就行了!
"👍点赞" "✍️评论" "收藏❤️"
欢迎一起交流学习❤️❤️💛💛💚💚
好玩 好用 好看
的干货教程可以
点击下方关注❤️
微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇