【你也能从零基础学会网站开发】 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 JOINRIGHT 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都给大家介绍了一遍,至于在我们实际开发中,到底用哪个完全取决于现场需求和业务逻辑进行灵活选择, 反正数据库查询这一块大家千万别死记硬背就行了!

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多 好玩 好用 好看的干货教程可以 点击下方关注❤️ 微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/5212.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

高效数据集成:从旺店通到金蝶云

高效数据集成:从旺店通到金蝶云 旺店通旗舰奇门数据集成到金蝶云星空:柏为销售出库单07.25 在现代企业的运营中,数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将分享一个实际案例——如何通过轻易云数据集成平台,将旺…

Python进阶之IO操作

文章目录 一、文件的读取二、文件内容的写入三、之操作文件夹四、StringIO与BytesIO 一、文件的读取 在python里面,可以使用open函数来打开文件,具体语法如下: open(filename, mode)filename:文件名,一般包括该文件所…

Bert框架详解(上)

目录 一、传统的自然语言处理框架存在的问题 1、RNN网络计算时存在的问题 2、传统word2vec存在的问题 二、Bert模型机制 1、编码-解码框架(Encoder-Decoder) (1)、编码器(Encoder) (2&…

SuperMap iDesktop 崖山数据库型的数据源创建

作者:lzzzz 本文主要介绍如何创建崖山数据库型的数据源,使用版本为超图idesktopX:11.2.1 ,使用环境:Windows 10;yashandb:23.2.5.100,使用环境:centos 7.9。 崖山数据库…

今日 AI 简报| Claude 推出 AI 自动化操作电脑功能、浏览器 AI 助手、全栈 AI 应用构建器、全能文档解析工具等

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

VS2022远程连接调试编译Linux环境下的C++代码

工具:VS2022 虚拟机:RHEL 8.0 一、下载必要工具 1.VS2022组件安装 打开VS2022Installer,点击修改下载必要工具。 选择Linux 和嵌入式开发,然后点击右下角的修改! 等待安装........ 安装完成后,创建Linu…

详解Java之Spring MVC篇二

目录 获取Cookie/Session 理解Cookie 理解Session Cookie和Session的区别 获取Cookie 获取Session 获取Header 获取User-Agent 获取Cookie/Session 理解Cookie HTTP协议自身是“无状态”协议,但是在实际开发中,我们很多时候是需要知道请求之间的…

基于SSM的学生考勤管理系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

鸿萌数据迁移服务: 完善的数据迁移策略, 是数据迁移项目成功的保障

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

穿越文化与时空的回响——从廖问洁《红豆诗词选》看当代人文情怀

穿越文化与时空的回响 ——从廖问洁《红豆诗词选》看当代人文情怀 在快节奏的现代生活中,我们时常感到身心的疲惫,渴望找到一种能够洗涤内心的方式。而廖问洁的《红豆诗词选》就如同一股清泉,为我们带来了心灵的洗礼和慰藉。 这位来自94年的…

机器学习—TensorFlow实现

继续运行手写数字识别的示例,识别此图像,一个0还是1,我们所使用的是神经网络架构,其中有一个输入X,然后是第一个隐藏层,有25个单位,第二个隐藏层,有15个单元,然后一个输出…

外包干了两年,快要废了。。。。

先说一下自己的情况,普通本科,在外包干了2年多的功能测试,这几年因为大环境不好,我整个人心惊胆战的,怕自己卷铺盖走人了,我感觉自己不能够在这样蹉跎下去了,长时间呆在一个舒适的环境真的会让一…

基于backtrader实现人工智能LOF的择时,optstrategy实现最优参数搜索(年化从9%提升至15.4%)

原创内容第695篇,专注量化投资、个人成长与财富自由。 今日策略 今天的策略是基于backtrader实现人工智能LOF的择时,通过backtrader的参数优化功能,找到最优参数。 策略主体: 策略有三个参数,一是动量周期&#xff…

autodl怎么清理数据盘垃圾缓存

首先进入到root/autodl-tmp文件夹下,然后执行这个命令 du -h --max-depth1 .查看当前目录下各个子目录占用的内存 可以看到,./.Trash-0 目录下有太多垃圾了。清理 ./.Trash-0 目录,可以使用以下命令来删除该目录中的所有内容 rm -rf ./.Tr…

ctfshow(162)--文件上传漏洞--远程文件包含

Web162 进入界面: 思路 先传个文件测试一下过滤: 过滤了特别多符号,注意过滤了点. 我们的思路还是要先上传.user.ini文件: //修改前 GIF89a auto_prepend_fileshell.png//由于过滤了点,所以修改为 GIF89a auto_prepend_file…

开源IM即时通讯源码 / Java仿微信即时通讯APP源码 + 红包 + 客服 + 禁言 / WebSocket + uniapp框架开发

即时通讯应用已经成为现代社交和工作环境中的重要工具,而IM(即时通讯)系统的设计与开发也逐渐成为开发者关注的重点。本文将介绍一个基于Java开发的开源IM即时通讯系统,模拟微信的即时通讯功能,涵盖了红包、客服、禁言…

拒绝事后背锅:测试项目中的风险管理一定要知道

在博主的公司中,测试经理除了要管理产品线的质量保障和日常部门事务工作外,另一项比较重要的就是测试项目全流程的管理。 今天不聊整体的测试项目流程如何开展,而是想聊一聊在同行中比较高频出现的一个字眼:风险管理。 什么是风…

4.1 WINDOWS XP,ReactOS对象与对象目录----1

系列文章目录 文章目录 系列文章目录4.1 对象与对象目录OBJECT_HEADERObpLookupEntryDirectory()NtCreateTimer() 4.1 对象与对象目录 “对象(Object)”这个词现在大家都已耳熟能详了,但是对象到底是什么呢?广义地说,对象就是“目标”,行为…

数据结构——栈

栈 1. 栈的概念和结构2. 栈的实现2.1 原型声明2.2 初始化和销毁2.3 入栈 出栈2.4 取栈顶数据2.5 判空2.6 获取数据个数 3. 总结 🔥 博客主页: 偷心编程 🎥 系列专栏: 《Java学习》 《C语言学习》 《数据结构C语言版》 ❤️ 感谢大家点赞👍收…

谷歌浏览器中编辑并重发请求

文章目录 1、直接重发请求2、修改传参后重发请求3、可能的报错 有时候,需要调整请求参数后,重新发送请求,查看响应,从浏览器搬到Postman太繁琐,可直接在浏览器进行编辑并重发 1、直接重发请求 F12 > Network >…