【MYSQL】MYSQL 的学习教程(二)之 MYSQL 的七种连接

在这里插入图片描述

1. 概述

在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。一个业务都会对应多张表,比如:学生和班级,起码两张表

①:连接分类(功能划分):

  1. 交叉连接:笛卡尔积
  2. 内连接:等值连接、非等值连接、自连接
  3. 外连接:左(外)连接、左(外)连接特殊情况、右(外)连接、右(外)连接特殊情况、全连接、全外连接

②:连接分类(年代划分):

  • SQL 92 年语法(仅仅支持内连接)
SELECT *
FROM TEST1, TEST2
WHERE TEST1.SId = TEST2.sId
  • SQL 99 年语法 (推荐使用)
SELECT *
FROM TAB_TEST1 test1
INNER JOIN TAB_TEST2 test2
ON test1.sId = test2.sId

③:内连接和外连接的区别:

假设 A 和 B 表进行连接

  • 内连接:凡是 A 表和 B 表能够匹配上的记录,都查询出来。A、B 两张表没有主副之分,两张表是平等的
  • 外连接:A、B 两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表。当副表中的数据没有和主表中的数据匹配上,副表自动模拟出 NULL 与之匹配

测试数据

# 构建表
CREATE TABLE `student`  (
  `id` int NOT NULL,
  `name` char(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `age` int NOT NULL,
  `teacher_id` int NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

CREATE TABLE `teacher`  (
  `id` int NOT NULL,
  `name` char(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `age` int NOT NULL,
  `class_id` int NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

# 插入数据
INSERT INTO `student` VALUES (1, '刘峰', 20, 1);
INSERT INTO `student` VALUES (2, '李福', 22, 2);
INSERT INTO `student` VALUES (3, '王紫', 21, 3);
INSERT INTO `student` VALUES (4, '赵兰', 24, 3);

INSERT INTO `teacher` VALUES (1, '夏晴', 36, 1);
INSERT INTO `teacher` VALUES (2, '李淳', 32, 2);
INSERT INTO `teacher` VALUES (3, '张叶', 34, 3);

在这里插入图片描述在这里插入图片描述

2. 交叉连接(笛卡尔积):CROSS JOIN

假设集合 A = {a,b},集合 B = {0,1,2},则两个集合的笛卡尔积为 {(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。如果 A 表示某学校学生的集合,B 表示该学校所有教师的集合,则 A 与 B 的笛卡尔积表示学生选择老师所有可能的情况

笛卡尔积特点:它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行 一 一 匹配

案例:

查询学生对应的老师

对应的 SQL 语句如下:

SELECT * FROM student CROSS JOIN teacher;

或者:

SELECT * FROM student, teacher;

结果如下:学生表 中数据每 1 个学生都和 教师表 中的 所有教师 都匹配一次

在这里插入图片描述

问题:

当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。这就是笛卡尔积现象。 查询出来的结果是两张表的记录的乘积 4 * 3 = 12,许多数据是无效数据。如何避免笛卡尔积现象?

解决方案:

增加条件进行过滤,但只会显示有效记录

案例:

根据教师 id 查询学生对应的选课老师

对应的 SQL 语句如下:

SELECT st.*,th.* FROM student st ,teacher th WHERE st.teacher_id = th.id

结果如下:

在这里插入图片描述

3. 内连接:INNER JOIN(INNER 可以省略)

3.1 等值连接

等值连接:条件是等量关系

案例:

根据教师 id 查询学生对应的选课老师

对应的 SQL 语句如下:

SELECT st.*,th.* FROM student st JOIN teacher th ON st.teacher_id = th.id;
等值连接与自然连接的区别

等值连接:当条件为“=”的连接为等值连接,是连接属性值相等的那些元组

在这里插入图片描述

自然连接:自然连接不仅要求连接的两个字段必须同名,还要求将结果中重复的属性列去掉

在这里插入图片描述

上面的等值连接进行比较的都是 B 属性, 但还可以进行 R.B = S.E 等值连接, 而自然连接只能是同名属性组

3.2 非等值连接

非等值连接:条件不是等量关系

案例:

查询教师 id 在 1-2 之间所教的学生和老师信息

对应的 SQL 语句如下:

SELECT st.*,th.* FROM student st JOIN teacher th ON st.teacher_id = th.id AND th.id BETWEEN 1 AND 2;

3.3 自连接

自连接:就是一张表看做两张表,自己连接自己

案例:

查询学生 id 和教师 id 相同的学生

对应的 SQL 语句如下:

 SELECT s.*,st.teacher_id FROM student s, student st WHERE s.id = st.teacher_id;

4. 外连接:OUTER JOIN(OUTER 可以省略)

4.1 左外连接:LEFT JOIN

①:左外连接:左边的是主表,左表数据全部显示,右表显示符合 ON 后的条件的数据,不符合的用 NULL 代替

在这里插入图片描述

SELECT * FROM student st LEFT JOIN teacher th ON st.teacher_id = th.id;

②:左外特殊情况:返回没有匹配的记录

案例:

查询没有教师的学生信息

对应的 SQL 语句如下:

SELECT * FROM student st LEFT JOIN teacher th ON st.teacher_id = th.id WHERE th.id IS NULL;

4.2 右外连接:RIGHT JOIN

①:右外连接:右边的是主表,右表数据全部显示,左表显示符合 ON 后的条件的数据,不符合的用 NULL 代替
在这里插入图片描述

SELECT * FROM student st RIGHT JOIN teacher th ON st.teacher_id = th.id;

②:右外特殊情况:

在这里插入图片描述

SELECT * FROM student st RIGHT JOIN teacher th ON st.teacher_id = th.id WHERE st.teacher_id IS NULL;

4.3 全外连接: FULL OUT JOIN(OUT 可以省略)

全外连接:Mysql 不支持,可以使用 union 组合并去重实现

全外接查询:就是 左表独有的数据 加上 右表独有的数据
在这里插入图片描述

SELECT * FROM student st LEFT JOIN teacher th ON st.teacher_id = th.id WHERE th.id IS NULL
UNION
SELECT * FROM student st RIGHT JOIN teacher th ON st.teacher_id = th.id WHERE st.teacher_id IS NULL

4.4 全连接

全连接查询的是 左表所有的数据 加上 右表所有的数据 并去重。

在这里插入图片描述

SELECT * FROM student st LEFT JOIN teacher th ON st.teacher_id = th.id
UNION
SELECT * FROM student st RIGHT JOIN teacher th ON st.teacher_id = th.id

Mysql中的七种常用查询连接详解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漏洞复现-云安宝-云匣子Fastjson命令执行(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

(第18天)RMAN Duplicate 异机复制 Oracle 数据库

RMAN Duplicate 异机复制 Oracle 数据库(第18天) RMAN Duplicate 是从 Oracle 10G 开始出现的功能,但是在 11G 时增加了很多功能,可以通过 Active Database Duplicate 和 Backup-based Duplicate 两种方法实现。 Active database duplicate 功能更加强大,不需要先对源端…

每日一题 2048. 下一个更大的数值平衡数(枚举)

乍一看没什么想法,但它的 x 是有限的,而题目规定的数值平衡数的要求很严格,相对来说只有少部分数满足要求,所以想到了枚举的方法通过寻找所有在范围内的全排列中满足数值平衡数的要求的数,找到最接近 n 的一个官方给出…

事件驱动架构 vs. RESTful架构:通信模式对比与选择

1. 通信风格 事件驱动架构(EDA) 是一种异步通信风格,组件之间通过产生和消费事件进行通信。 事件是表示系统中重大变化或事件的消息,并分发给感兴趣的组件。这种通信模型允许系统的不同部分之间进行解耦和动态交互。 组件充当事件…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建 (new)

0 背景 开发工具idea代码管理mavenjdk1.8webdriver chrome 1 chromedriver & chrome chromedriver和chrome要对应上: chomedriver下载地址:淘宝镜像 这里用的是 chromedriver88-0-4324-96.zipchrome下载地址:如何降级和安装旧版本的C…

使用node实现链接数据库并对数据库进行增删改查的后端接口

环境 node npm 编辑器 vscode 项目配置 新建目录 用vscode打开 终端输入 npm init -y npm install mysql npm install express 代码 安装好之后的代码页面 新建 在根目录新建api.js文件 const express require(express); const db require(./db/index); const app…

windows获取app备案的公钥和md5的值

app现在需要备案才能上架了 但是备案却需要填app的公钥和md5值,无论是ios还是android都需要填,那么为什么我们以前没有了解过公钥是什么呢?突然这个公钥和md5就难倒了很多ios或者android专家,android公钥是什么?ios公…

Ubuntu系统关闭防火墙的正确方式

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

自动化测试基础知识:什么是自动化测试?需要学习哪些知识与工具!

1、自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常, 在设计了测试用例并通过评审之后,由测 试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。简言之,自动化测试…

模块二——滑动窗口:3.无重复字符的最长子串

文章目录 题目描述算法原理解法⼀:暴⼒求解(不会超时,可以通过)解法二:滑动窗口 代码实现解法⼀:暴⼒求解(时间复杂度为O(N^2^),空间复杂度为O(1))解法二:滑动窗口(时间复杂度为O(N)…

如何将html网页免费转为excel?

一、直接复制。 直接复制是最简单有效、快捷的解决方案,操作方法如下: 1、用鼠标像平常复制文本一样,将整个网页表格选中。 2、点击右键,点击“复制”。 3、打开excel软件,鼠标点击任意单元格。 4、点击右键&#…

4.数据库

目录 一、数据库的基本信息 1.1 数据库的定义 1.2数据库的分类 1.2.1 关系型数据库 1.2.2 非关系型数据库 1.3 SQL介绍 1.3.1 概念 1.3.2 SQl语言分类 1.3.3 SQL注释 1.3.4 数据库操作命令DDL 1.3.5 数据表操作命令DDL 1.3.6 数据表操作命令DML 1.3.7 数据表中内容…

详解TCP报文格式以及TCP相关特性

✏️✏️✏️今天给大家分享的是TCP报文格式的解释以及TCP协议的一些重要特性。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! ✈️✈️✈…

PPT制作的几个注意事项

PPT制作的几个注意事项 字数不可过多字体大小字体颜色排版问题PPT篇末致谢什么是好的PPT关于演讲不要念PPT说话时面向观众。讲话的时候抖腿其他 事先声明: 以下展示的PPT就PPT制作技巧而言,与其内容无关。 字数不可过多 做PPT最忌讳的就是满篇全是文字&…

NCNN 源码学习【二】:模型加载

​ 正文 这次先来看一段NCNN应用代码中,最先出现的部分,模型加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_v1.1.bin");首先我们可以看到一个 ncnn的类Net&am…

【C语言】结构体实现位段

引言 对位段进行介绍,什么是位段,位段如何节省空间,位段的内存分布,位段存在的跨平台问题,及位段的应用。 ✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,…

鸿蒙系统扫盲(五):再谈鸿蒙开发用什么语言?

前段时间,发表了鸿蒙系统扫盲(三):鸿蒙开发用什么语言?这篇文章,收到一些网友的提问,一一解答了,还有网友对我进行了严厉的批评和尖锐的指责,说我有点颠倒是非&#xff0…

集成开发之如何用好明道云

内容来自演讲:张嵩 | 苏州睿能科技有限公司 | 公司负责人 摘要 这篇文章介绍了作者所在公司如何利用明道云进行集成开发,并分享了四个实际案例。在第一个数字化实验室项目中,该公司使用明道云取代现有的STARLIMS商业软件,并实现…

sleep和wait区别,并且查看线程运行状态

一、sleep和wait区别 区别一:语法使用不同 wait 方法必须配合 synchronized 一起使用,不然在运行时就会抛出 IllegalMonitorStateException 的异常 而 sleep 可以单独使用,无需配合 synchronized 一起使用。 区别二:所属类不同…

【Spring教程26】Spring框架实战:从零开始学习SpringMVC 之 bean加载控制

目录 1 问题分析2 思路分析3 环境准备4 设置bean加载控制5 知识点1:ComponentScan 欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装…