SQL中 JOIN 的两种连接类型:内连接(自然连接、自连接、交叉连接)、外连接(左外连接、右外连接、全外连接)
SQL中 JOIN 的两种连接类型:内连接(自然连接、自连接、交叉连接)、外连接(左外连接、右外连接、全外连接)
1. 自然连接(natural join)(内连接)
学生表
mysql> select * from student;
+----+--------+----------+
| id | name | code |
+----+--------+----------+
| 1 | 张三 | 20181601 |
| 2 | 尔四 | 20181602 |
| 3 | 小红 | 20181603 |
| 4 | 小明 | 20181604 |
| 5 | 小青 | 20181605 |
+----+--------+----------+
5 rows in set (0.00 sec)CREATE TABLE `student` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,`code` int DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;INSERT INTO student (name, code) VALUES('张三', 20181601),('尔四', 20181602),('小红', 20181603),('小明', 20181604),('小青', 20181605);
成绩表
mysql> select * from score;
+----+-------+----------+
| id | grade | code |
+----+-------+----------+
| 1 | 55 | 20181601 |
| 2 | 88 | 20181602 |
| 3 | 99 | 20181605 |
| 4 | 33 | 20181611 |
+----+-------+----------+
4 rows in set (0.00 sec)CREATE TABLE `score` (`id` int NOT NULL AUTO_INCREMENT,`grade` int DEFAULT NULL,`code` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;INSERT INTO score (id, grade, code) VALUES
(1, 55, 20181601),
(2, 88, 20181602),
(3, 99, 20181605),
(4, 33, 20181611);
自然连接不用指定连接列,也不能使用ON语句,它默认比较两张表里相同的列。
SELECT * FROM student NATURAL JOIN score;
显示结果如下:
mysql> select * from student natural join score;
+----+----------+--------+-------+
| id | code | name | grade |
+----+----------+--------+-------+
| 1 | 20181601 | 张三 | 55 |
| 2 | 20181602 | 尔四 | 88 |
+----+----------+--------+-------+
2 rows in set (0.00 sec)
–自然连接 natural join
自动判断连接条件完成连接.
–自然内连接 natural inner join
select *|字段列表 from 左表 natural [inner] join 右表;
自然内连接其实就是内连接,这里的匹配条件是由系统自动指定.
–自然外连接 natural outer join
自然外连接分为自然左外连接和自然右外连接.匹配条件也是由系统自动指定.
–自然左外连接 natural left join
select *|字段列表 from 左表 natural left [outer] join 右表;–自然右外连接 natural right join
select *|字段列表 from 右表 natural right [outer] join 左表;
2. 内连接(inner join)
和自然连接区别之处在于内连接可以自定义两张表的不同列字段。
内连接有两种形式:显式和隐式。
1)隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。
SELECT student.name,score.code FROM student,score WHERE score.code=student.code;
2)显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。
SELECT student.name,score.code FROM student INNER JOIN score ON score.code=student.code;
例:以下1)、2)语句执行结果相同。
mysql> SELECT student.name,score.code FROM student,score WHERE score.code=student.code;
mysql> SELECT student.name,score.code FROM student INNER JOIN score ON score.code=student.code;
+--------+----------+
| name | code |
+--------+----------+
| 张三 | 20181601 |
| 尔四 | 20181602 |
| 小青 | 20181605 |
+--------+----------+
3 rows in set (0.00 sec)mysql> select student.*,score.* from student inner join score;
mysql> select student.*,score.* from student inner join score;
+----+--------+----------+----+-------+----------+
| id | name | code | id | grade | code |
+----+--------+----------+----+-------+----------+
| 1 | 张三 | 20181601 | 4 | 33 | 20181611 |
| 1 | 张三 | 20181601 | 3 | 99 | 20181605 |
| 1 | 张三 | 20181601 | 2 | 88 | 20181602 |
| 1 | 张三 | 20181601 | 1 | 55 | 20181601 |
| 2 | 尔四 | 20181602 | 4 | 33 | 20181611 |
| 2 | 尔四 | 20181602 | 3 | 99 | 20181605 |
| 2 | 尔四 | 20181602 | 2 | 88 | 20181602 |
| 2 | 尔四 | 20181602 | 1 | 55 | 20181601 |
| 3 | 小红 | 20181603 | 4 | 33 | 20181611 |
| 3 | 小红 | 20181603 | 3 | 99 | 20181605 |
| 3 | 小红 | 20181603 | 2 | 88 | 20181602 |
| 3 | 小红 | 20181603 | 1 | 55 | 20181601 |
| 4 | 小明 | 20181604 | 4 | 33 | 20181611 |
| 4 | 小明 | 20181604 | 3 | 99 | 20181605 |
| 4 | 小明 | 20181604 | 2 | 88 | 20181602 |
| 4 | 小明 | 20181604 | 1 | 55 | 20181601 |
| 5 | 小青 | 20181605 | 4 | 33 | 20181611 |
| 5 | 小青 | 20181605 | 3 | 99 | 20181605 |
| 5 | 小青 | 20181605 | 2 | 88 | 20181602 |
| 5 | 小青 | 20181605 | 1 | 55 | 20181601 |
+----+--------+----------+----+-------+----------+
20 rows in set (0.00 sec)
拓展
自连接(内连接)
https://baike.baidu.com/item/%E8%87%AA%E8%BF%9E%E6%8E%A5/2556770
新的学生表
CREATE TABLE `new_student` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,`code` int DEFAULT NULL,`grade` int DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;INSERT INTO `test`.`new_student`(`id`, `name`, `code`, `grade`) VALUES (1, '张三', 20181601, 55);
INSERT INTO `test`.`new_student`(`id`, `name`, `code`, `grade`) VALUES (2, '尔四', 20181602, 88);
INSERT INTO `test`.`new_student`(`id`, `name`, `code`, `grade`) VALUES (3, '小红', 20181603, 77);
INSERT INTO `test`.`new_student`(`id`, `name`, `code`, `grade`) VALUES (4, '小明', 20181604, 66);
INSERT INTO `test`.`new_student`(`id`, `name`, `code`, `grade`) VALUES (5, '小青', 20181605, 99);
问题:查询显示成绩小于小明的学生和成绩?
当表中的某一个字段与这个表中另外字段的相关时,我们可能用到 自连接 。
mysql> select * from new_student;
+----+--------+----------+-------+
| id | name | code | grade |
+----+--------+----------+-------+
| 1 | 张三 | 20181601 | 55 |
| 2 | 尔四 | 20181602 | 88 |
| 3 | 小红 | 20181603 | 77 |
| 4 | 小明 | 20181604 | 66 |
| 5 | 小青 | 20181605 | 99 |
+----+--------+----------+-------+
5 rows in set (0.00 sec)mysql> select st2.name, st2.grade from new_student st1, new_student st2 where st1.name='小明' and st1.grade < st2.grade;
+--------+-------+
| name | grade |
+--------+-------+
| 尔四 | 88 |
| 小红 | 77 |
| 小青 | 99 |
+--------+-------+
3 rows in set (0.00 sec)
数据库中自然连接与内连接的区别:
1、自然连接一定是内连接,内连接不一定是自然连接;
2、内连接不把重复的属性除去,自然连接要把重复的属性除去;
3、内连接要求相等的分量,不一定是公共属性,自然连接要求相等的分量必须是公共属性;
4、内连接不把重复的属性除去,自然连接要把重复的属性除去。
3.外连接(outer join)
1)左外连接(left outer join):返回指定左表的全部行+右表对应的行,如果左表中数据在右表中没有与其相匹配的行,则在查询结果集中显示为空值。
例:
SELECT student.name,score.code FROM student LEFT JOIN score ON score.code=student.code;
查询结果如下:
mysql> select student.name,score.code from student left join score on score.code=student.code;
+--------+----------+
| name | code |
+--------+----------+
| 张三 | 20181601 |
| 尔四 | 20181602 |
| 小红 | NULL |
| 小明 | NULL |
| 小青 | 20181605 |
+--------+----------+
5 rows in set (0.00 sec)
2)右外连接(right outer join):与左外连接类似,是左外连接的反向连接。
SELECT student.name,score.codeFROM student RIGHT JOIN score ON score.code=student.code;
mysql> select student.name,score.code from student right join score on score.code=student.code;
+--------+----------+
| name | code |
+--------+----------+
| 张三 | 20181601 |
| 尔四 | 20181602 |
| 小青 | 20181605 |
| NULL | 20181611 |
+--------+----------+
4 rows in set (0.00 sec)
3)全外连接(full outer join):把左右两表进行自然连接,左表在右表没有的显示NULL,右表在左表没有的显示NULL。(MYSQL不支持全外连接,适用于Oracle和DB2。)
在MySQL中,可通过求左外连接与右外连接的合集来实现全外连接。
例:
SELECT student.name,score.code FROM student LEFT JOIN score ON
score.code=student.code UNION SELECT student.name,score.code
FROM student RIGHT JOIN score ON score.code=student.code;
mysql> select student.name,score.code from student left join score on score.code=student.code union select student.name,score.code from student right join score on score.code=student.code;
+--------+----------+
| name | code |
+--------+----------+
| 张三 | 20181601 |
| 尔四 | 20181602 |
| 小红 | NULL |
| 小明 | NULL |
| 小青 | 20181605 |
| NULL | 20181611 |
+--------+----------+
6 rows in set (0.00 sec)
4.交叉连接(cross join):相当与笛卡尔积,左表和右表组合。 (内连接)
SELECT student.name,score.code FROM student CROSS JOIN score ON score.code=student.code;
mysql> select student.name,score.code from student cross join score on score.code=student.code;
+--------+----------+
| name | code |
+--------+----------+
| 张三 | 20181601 |
| 尔四 | 20181602 |
| 小青 | 20181605 |
+--------+----------+
3 rows in set (0.00 sec)mysql> select student.*,score.* from student cross join score on score.code=student.code;
+----+--------+----------+----+-------+----------+
| id | name | code | id | grade | code |
+----+--------+----------+----+-------+----------+
| 1 | 张三 | 20181601 | 1 | 55 | 20181601 |
| 2 | 尔四 | 20181602 | 2 | 88 | 20181602 |
| 5 | 小青 | 20181605 | 3 | 99 | 20181605 |
+----+--------+----------+----+-------+----------+
3 rows in set (0.00 sec)mysql> select student.*,score.* from student cross join score;
+----+--------+----------+----+-------+----------+
| id | name | code | id | grade | code |
+----+--------+----------+----+-------+----------+
| 1 | 张三 | 20181601 | 4 | 33 | 20181611 |
| 1 | 张三 | 20181601 | 3 | 99 | 20181605 |
| 1 | 张三 | 20181601 | 2 | 88 | 20181602 |
| 1 | 张三 | 20181601 | 1 | 55 | 20181601 |
| 2 | 尔四 | 20181602 | 4 | 33 | 20181611 |
| 2 | 尔四 | 20181602 | 3 | 99 | 20181605 |
| 2 | 尔四 | 20181602 | 2 | 88 | 20181602 |
| 2 | 尔四 | 20181602 | 1 | 55 | 20181601 |
| 3 | 小红 | 20181603 | 4 | 33 | 20181611 |
| 3 | 小红 | 20181603 | 3 | 99 | 20181605 |
| 3 | 小红 | 20181603 | 2 | 88 | 20181602 |
| 3 | 小红 | 20181603 | 1 | 55 | 20181601 |
| 4 | 小明 | 20181604 | 4 | 33 | 20181611 |
| 4 | 小明 | 20181604 | 3 | 99 | 20181605 |
| 4 | 小明 | 20181604 | 2 | 88 | 20181602 |
| 4 | 小明 | 20181604 | 1 | 55 | 20181601 |
| 5 | 小青 | 20181605 | 4 | 33 | 20181611 |
| 5 | 小青 | 20181605 | 3 | 99 | 20181605 |
| 5 | 小青 | 20181605 | 2 | 88 | 20181602 |
| 5 | 小青 | 20181605 | 1 | 55 | 20181601 |
+----+--------+----------+----+-------+----------+
20 rows in set (0.00 sec)
参考链接:
自然连接、内连接、外连接(左外连接、右外连接、全外连接)、交叉连接
百科自连接
数据库中自然连接与内连接的区别
MySQL数据库的46种基本语法
MySQL 自连接讲解
相关文章:
SQL中 JOIN 的两种连接类型:内连接(自然连接、自连接、交叉连接)、外连接(左外连接、右外连接、全外连接)
SQL中 JOIN 的两种连接类型:内连接(自然连接、自连接、交叉连接)、外连接(左外连接、右外连接、全外连接) 1. 自然连接(natural join)(内连接) 学生表 mysql> sele…...

微信小程序记住密码,让登录解放双手
密码是用户最重要的数据,也是系统最需要保护的数据,我们在登录的时候需要用账号密码请求登录接口,如果用户勾选记住密码,那么下一次登录时,我们需要将账号密码回填到输入框,用户可以直接登录系统。我们分别…...

国内划片机行业四大企业之博捷芯:技术驱动,领跑未来
在国内划片机行业中,公司以其卓越的技术实力和持续的创新精神,迅速崭露头角。作为国内划片机行业的四大企业之一,公司以其专业、高品质的划片机设备和解决方案,引领着行业的发展。 公司自创立以来,一直专注于划片机设备…...

后端整合Swagger+Knife4j接口文档
后端整合SwaggerKnife4j接口文档 接口文档介绍 什么是接口文档:写接口信息的文档,条接口包括: 请求参数响应参数 错误码 接口地址接口名称请求类型请求格式备注 为什么需要接口文档 who用?后端提供,前后端都需要使用…...

k8s中批量处理Pod应用的Job和CronJob控制器介绍
目录 一.Job控制器 1.简介 2.Jobs较完整解释 3.示例演示 4.注意:如上例的话,执行“kubectl delete -f myJob.yaml”就可以将job删掉 二.CronJob(简写为cj) 1.简介 2.CronJob较完整解释 3.案例演示 4.如上例的话…...

UE5 范围内随机生成
打开插件 BP_Actor...

杂记 | 使用Docker安装并配置MongoDB以支持事务(单副本,并解决了证书文件错误的问题)
文章目录 00 安装前的准备01 创建Docker Compose文件02 设置证书文件03 启动MongoDB04 初始化副本集和创建用户05 验证安装 00 安装前的准备 在开始之前,确保已经安装了Docker,本文基于Docker Compose进行示范,没有装Docker Compose也可将其…...

css三角,鼠标样式,溢出文字
目录 css三角 鼠标样式 例子:页码模块 溢出文字表示方式 margin负值运用 css三角强化 css三角 css三角中:line-height:0和font-size:0是防止兼容性的问题 jd {position: relative;width: 120px;height: 249px;background-…...

远程桌面访问MATLAB 2018B,提示License Manger Error -103,终极解决方案
通过远程桌面方位Windows Server系统下的MATLAB2018B,报错License Manger Error -103,Crack文件夹下的dll文件已经替换,同时也已经输出了lic文件,但是仍然无法打开。但是在本地桌面安装就没有问题。初步怀疑MATLAB的License使用机…...

Jmeter基础和概念
JMeter 介绍: 一个非常优秀的开源的性能测试工具。 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来。 从性能工具的原理划分: Jmeter工具和其他性能工具在原理上完全一致,工具包含4个部分: …...
【Linux 带宽限速】trickle,限制docker 上传速度
限制docker 上传速度 然而,你可以使用第三方工具来实现这个目的。一个常用的工具是 trickle,它可以模拟网络带宽。 首先,你需要安装 trickle。在 Ubuntu 上,可以使用以下命令安装: sudo apt-get install trickle然后…...

MindStudio学习记录三:推理应用开发 acl mindx sdk
1.推理应用流程 1.1.创建工程 1.2.模型转换 1.3代码开发 1.3.1ACL代码 1.3.2MindX SDK开发 可视化模块化设计 中间的图片与处理 是基于AIPP的可视化处理 1.5.编译 交叉编译 1.6.运行与调试 1.7 调优工具 profiling性能分析 2.开发举例 resnet-50 2.1 准备工程 2.2.准备模型…...

【RT-DETR改进】SIoU、GIoU、CIoU、DIoU、AlphaIoU等二十余种损失函数
一、本文介绍 这篇文章介绍了RT-DETR的重大改进,特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体,如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU,还融合了“Alpha”思想,创造了一系列新的损失函数。这些组合形式的…...

【Linux】EVIOCGBIT
EVIOCGBIT(ev, len) 该怎么理解? 我们可以推断出,它是一个宏,它的前两个参数已经确定了,具体的功能由后两个参数(ev,len)来决定。Linux-4.9.88\include\uapi\linux\input.h #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, E, 0x20 …...

鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Extend扩展组件样式与stateStyles多态样式(十一)
一、Extend扩展组件样式 1、作用 前文提到可以使用Styles用于样式的扩展,在Styles的基础上,ArkTS语法还提供了Extend,⽤于扩展原生组件样式,包括Text、Button等等。 2、定义语法 Extend(UIComponentName) function functionNam…...

5V摄像机镜头驱动IC GC6208,可用于摄像机,机器人等产品中可替代AN41908
GC6208是一个镜头电机驱动IC摄像机和安全摄像机。该设备集成了一个直流电机驱动器的Iris的PID控制系统,也有两个通道的STM电机驱动器的变焦和对焦控制。 芯片的特点: 内置用于Iris控制器的直流电机驱动器 内置2个STM驱动程序,用于缩放和…...
PHP echo和print 语句
PHP 是通过 print 和 echo 语句来动态输出 HTML 内容,虽然 print 和 echo 语句两者的功能几乎是完全一样,但是还是有一点差别的。 在 PHP 中有两个基本的输出方式: echo 和 print。 本章节中我们会详细讨论两个语句的用法,并在实…...

ThinkPHP6.1 多应用模式的一些事儿
TP安装就不说了,直接从安装完成开始了。 安装多应用模式扩展 think-multi-app composer require topthink/think-multi-app删除 app 目录下的 controller 文件夹(TP 是根据是否有这个文件夹来判断单应用模式还是多应用模式的)。 创建应用 …...

redis-cluster集群模式
Redis-cluster集群 1 Redis3.0引入的分布式存储方案 2集群由多个node节点组成,redis数据分布在节点之中,在集群之中分为主节点和从节点3集群模式当中,主从一一对应,数据写入和读取与主从模式一样,主负责写,从只能读4集群模式自带哨兵模式,可…...

带你用uniapp从零开发一个仿小米商场_10. 首页开发
图标菜单栏开发 轮播图开发完成后,就是图标菜单栏了 可以看出这些图标都是一样的样式,所以可以勇哥flex布局让他们每个占百分之20 代码如下,既然都是一样的那就直接用个循环嵌套一下 data数据如下 同样,为了能让这段代码能在别的地方也用到,我直接把它封装成组件 <templ…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...