MySQL - 左连接、右连接、内连接、完全外连接、交叉连接 一对多、多对一、多对多 联合连接

前言

做服务端接口开发时,经常对数据库进行查询操作,了解并掌握数据库的左连接、右连接、内连接、完全外连接、交叉连接,一对多、多对一、多对多,联合连接等概念和使用就很重要了。

首先给出两个数据表,分别为学生表和课程表,假设一个学生只能选一门课程。

表1:Student
-------------
| ID | Name |
-------------
| 1  | 阿猫 |
| 2  | 阿狗 |
| 3  | 阿猪 |
-------------表2:Course
-------------
| ID | Cname|
-------------
| 1  | 篮球 |
| 2  | 足球 |
| 4  | 排球 |
-------------

一、外连接(左外连接、右外连接、完全外连接)

 1.左外连接,简称左连接

语法:left join 或 left outer join
语句:

select * 
from student
left join course on student.ID=course.ID

特点:取两表交集且并保留左表
结果:

--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1  | 阿猫 | 1  | 篮球 |
| 2  | 阿狗 | 2  | 足球 |
| 3  | 阿猪 |NULL| NULL |
--------------------------

  2.右外连接,简称右连接

语法:right join 或 right outer join
语句:

select * 
from student
right join course on student.ID=course.ID

特点:取两表交集且并保留右表
结果:

--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1  | 阿猫 | 1  | 篮球 |
| 2  | 阿狗 | 2  | 足球 |
|NULL| NULL | 4  | 排球 |
--------------------------

 3.完全外连接,简称全连接

语法:full join 或 full outer join
语句:

select * 
from student
full join course on student.ID=course.ID

特点:包含左右两表中所有的行
结果:

--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1  | 阿猫 | 1  | 篮球 |
| 2  | 阿狗 | 2  | 足球 |
| 3  | 阿猪 |NULL| NULL |
|NULL| NULL | 4  | 排球 |
--------------------------

二、内连接

 1.内连接

语法:join 或 inner join
语句:

select * 
from student 
inner join course on student.ID=course.ID

特点:显示两张表所有记录一一对应,没有对应上的将会被过滤
结果:

--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1  | 阿猫 | 1  | 篮球 |
| 2  | 阿狗 | 2  | 足球 |
--------------------------

三、交叉连接

 1.交叉连接

语法:cross join
语句:

select * 
from student 
cross join course

特点:对两个或者多个表进行笛卡儿积操作
结果:

--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1  | 阿猫 | 1  | 篮球 |
| 2  | 阿狗 | 1  | 篮球 |
| 3  | 阿猪 | 1  | 篮球 |
| 1  | 阿猫 | 2  | 足球 |
| 2  | 阿狗 | 2  | 足球 |
| 3  | 阿猪 | 2  | 足球 |
| 1  | 阿猫 | 4  | 排球 |
| 2  | 阿狗 | 4  | 排球 |
| 3  | 阿猪 | 4  | 排球 |
--------------------------

技巧:如果我们在此时给这条语句加上`where`子句的时候,比如【select * from student cross join course where student.ID = course.ID】,结果和inner join所示执行结果一样

四、联合连接

 1.联合连接

语法:union 或 union all
语句:

select ... from table1
union
select ... from table2

特点:两个或多个的表,相同字段合并起来

五、一对多、多对一、多对多

疑问:当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
解答:其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。

---------------------
|      student      |
---------------------
| Sno | Name | Cno |
----------------------------------------
|     classes     |
-------------------
|  Cno  |  CName  |

1.一对多

场景:一个班级可以有多个学生
语句:

select * from classes where Cno = 1;

结果: 查询班级为一班的所有学生

2.多对一

场景:多个学生属于某个班级
语句:

select c.CName 
FROM classes as c
JOIN student as s ON s.Cno = c.Cno 
WHERE s.Name in ('小明', '小花', '小白', '小红');

结果: 查询这几个学生所在的班级的名称

3.多对多

场景:一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系
技巧:当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容

---------------
|   student   |
---------------
| Sno | Name |
-------------------------------
|    course    |
----------------
| Cno | Cname |
------------------------------
|     SC     |
--------------
| Sno | Cno |
--------------

语句:

selects.Name, c.Cname 
from student_course as sc 
left join student as s on s.Sno = sc.Sno 
left join course as c on c.Cno = sc.Cno

结果: 查询每个学生的姓名,以及所在的班级的名称

六、说明

(1)在MySQL数据库中,left join、right join、full join、inner join的执行速度是怎样的?
答:left join、right join、full join、inner join的执行速度取决于多个因素,包括表的大小、索引的使用情况、查询条件等等。一般来说,inner join的执行速度最快,因为它只返回两个表中匹配的行,而不返回任何不匹配的行。left join和right join的执行速度通常比inner join慢一些,因为它们需要返回匹配和不匹配的行。full join的执行速度通常是最慢的,因为它需要返回两个表中所有的行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】可交互讲解图神经网络GNN

在正式开始前,先找准图神经网络GNN(Graph Neural Network)的位置。 图神经网络GNN是深度学习的一个分支。 深度学习的四个分支对应了四种常见的数据格式,前馈神经网络FNN处理表格数据,表格数据可以是特征向量,卷积神经网络CNN处理…

Spring,SpringMVC,SpringBoot中注解讲解

文章目录 1 Spring和SpringMVC 注解1.1 SpringMVC 注解1.1.1 RequestMapping1.1.2 RequestBody1.1.3 GetMapping1.1.4 PostMapping1.1.5 PutMapping1.1.6 DeleteMapping1.1.7 PatchMapping1.1.8 ControllerAdvice1.1.9 ResponseBody1.1.10 ExceptionHandler1.1.11 ResponseStat…

嵌入式软件工程师面试题——2025校招社招通用(十四)

说明: 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要…

Java 入门基础题

目录 1.输出一个整数的每一位 2.判定素数 3.求最大值方法的重载 4.输出闰年 5.打印 X 图形 6.数字9 出现的次数 7.计算分数的值 8. 模拟登陆 9.使用函数求最大值 10.斐波那契数列 星光不负赶路人,加油铁子们!!! 1…

Elasticsearch 在 Java 开发中的应用

Elasticsearch 在 Java 开发中的应用 Elasticsearch 是一个开源的分布式搜索引擎,广泛应用于全文搜索、日志分析等场景。本文将介绍 Elasticsearch 在 Java 开发中的基本使用和一些实际场景中的应用。 1. 引入 Elasticsearch 依赖 首先,需要在 Maven 或…

RT-DETR算法优化改进:Backbone改进 | VanillaNet一种新视觉Backbone,极简且强大!华为诺亚2023

💡💡💡本文独家改进: VanillaNet助力RT-DETR ,替换backbone,简到极致、浅到极致!深度为6的网络即可取得76.36%@ImageNet的精度,深度为13的VanillaNet甚至取得了83.1%的惊人性能。 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/cat…

11-13 /11-14代理模式 AOP

调用者 代理对象 目标对象 代理对象除了可以完成核心任务,还可以增强其他任务,无感的增强 代理模式目的: 不改变目标对象的目标方法的前提,去增强目标方法 分为:静态代理,动态代理 静态代理 有对象->前提需要有一个类,那么我们可以事先写好一个类&a…

【Python基础篇】字面量

博主:👍不许代码码上红 欢迎:🐋点赞、收藏、关注、评论。 格言: 大鹏一日同风起,扶摇直上九万里。 文章目录 一 Python中字面量的定义二 常见的字面量类型1 数字(Number)2 字符串(String)3 列表(List)4 元…

微信小程序:仅前端实现对象数组的模糊查询

效果 核心代码 //对数组进行过滤&#xff0c;返回数组中每一想满足name值包括变量query的 let result array.filter(item > { return item.name.includes(query); }); 完整代码 wxml <input type"text" placeholder"请输入名称" placeholder-styl…

前端工具nvm实现node自由

node的自由之路 前言 大家使用vue框架开发的朋友可能会遇到首次运行公司项目环境的时候&#xff0c;会出现使用npm install命令安装依赖包的时候出现各种各样的问题&#xff0c;其中很重要的一个错误原因就是因为你的nodejs版本和当时搭建环境的版本不一致造成的。今天就来给…

R语言——taxize(第一部分)

ropensci 系列之 taxize &#xff08;中译手册&#xff09; taxize 包1. taxize支持的网络数据源简介目前支持的API&#xff1a;针对Catalogue of Life&#xff08;COL&#xff09; 2. 浅尝 taxize 的一些使用例子2.1. **从NCBI上获取唯一的分类标识符**2.2. **获取分类信息**2…

网络安全基础之php开发文件上传的实现

前言 php是网络安全学习里必不可少的一环&#xff0c;简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中&#xff0c;文件的功能是必不可少&#xff0c;比如我们在论坛的头像想更改时就涉及到文件的上传等等文件功能。但也会出…

基于SpringBoot+Vue的宿舍管理系统

基于SpringBootVue的学生宿舍管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宿舍公告 登录界面 管理员界面 维修人员 商家界面 学生界面 摘要 摘…

Azure 机器学习:在 Azure 机器学习中使用 Azure OpenAI 模型

目录 一、环境准备二、Azure 机器学习中的 OpenAI 模型是什么&#xff1f;三、在机器学习中访问 Azure OpenAI 模型连接到 Azure OpenAI部署 Azure OpenAI 模型 四、使用自己的训练数据微调 Azure OpenAI 模型使用工作室微调微调设置训练数据自定义微调参数部署微调的模型 使用…

Python---集合中的交集 、并集 | 与差集 - 特性

用 & 来求两个集合的交集&#xff1a;-----键盘上的7上的符号&#xff0c;shift 7 同时按 用 | 来求两个集合的并集&#xff1a; -----键盘上的7上的符号&#xff0c;shift 同时按&#xff08;就是enter键上面那个|\ &#xff09; 用 - 来求两个集合的差集&#xff…

linux查看端口被哪个进程占用

linux查看端口被哪个进程占用 1、lsof -i:端口号 sudo lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 661 root 3u IPv4 13882 0t0 TCP *:ssh (LISTEN) sshd 661 root 4u IPv6 13893 0t0 TCP *:ssh (LISTEN) ssh…

mysql核心知识整理

目录 聚簇索引与非聚簇索引&#xff1b; 聚簇索引&#xff1a;找到了索引就找到了需要的数据&#xff0c;那么这个索引就是聚簇索引&#xff0c;所以主键就是聚簇索引&#xff0c;修改聚簇索引其实就是修改主键。 非聚簇索引&#xff1a;索引的存储和数据的存储是分离的&#…

抖斗音_快块手直播间获客助手+采集脚本+引流软件功能介绍

软件功能&#xff1a; 支持同时采集多个直播间&#xff0c;弹幕&#xff0c;关*注&#xff0c;礼*物&#xff0c;进直播间&#xff0c;部分用户手*号,粉*丝团采集 不支持采集匿*名直播间 设备需求&#xff1a; 电脑&#xff08;win10系统&#xff09; 文章分享者&#xff1…

Kerberos认证系统

文章目录 前提知识原理第一次对话第二次对话第三次对话 总结发现 前提知识 KDC&#xff1a;由AS、TGS&#xff0c;还有一个Kerberos Database组成。 Kerberos Database用来存储用户的密码或者其他所有信息&#xff0c;请求的时候需要到数据库中查找。 AS&#xff1a;为客户端提…

WebSphere Liberty 8.5.5.9 (三)

WebSphere Liberty 8.5.5.9 将资源先下载&#xff0c;后期本地安装 下载 passwordUtilities-1.0 D:\wlp-webProfile7-java8-8.5.5.9\wlp\bin>installUtility find password 正在建立与已配置存储库的连接... 此过程可能要花几分钟完成。已成功连接至所有已配置的存储库。…