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…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
