当前位置: 首页 > news >正文

【MySQL】联合查询、子查询、合并查询

这里提供了三个表:
表1:
mysql> select * from class;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 一班   |
|    2 | 二班   |
|    3 | 三班   |
+------+--------+
3 rows in set (0.01 sec)

表2:

mysql> select * from student;
+------+--------+----------+
| id   | name   | class_id |
+------+--------+----------+
|    1 | 张三   |        1 |
|    2 | 李四   |        1 |
|    3 | 王五   |        2 |
|    4 | 赵六   |        2 |
|    5 | 小七   |        3 |
|    6 | 周八   |        3 |
|    7 | 老九   |        3 |
+------+--------+----------+
7 rows in set (0.00 sec)

表3:

mysql> select * from score;
+------+------------+-------+
| id   | student_id | score |
+------+------------+-------+
|    1 |          1 |   100 |
|    2 |          2 |    94 |
|    3 |          3 |    95 |
|    4 |          4 |    96 |
|    5 |          8 |    97 |
+------+------------+-------+
5 rows in set (0.01 sec)

接下来就针对这三个表来进行联合查询~

目录

♫笛卡尔积

♫联合查询

♪内连接

♪外连接

♪自连接

 ♫子查询

♪单行子查询

♪多行子查询

♫合并查询

♪union

♪union all


我们在实际开发过程中,数据往往来自不同的表,所以需要多表联合查询。联合查询就是对多张表的数据取笛卡尔积,故这里先简单介绍一下笛卡尔积:

♫笛卡尔积

笛卡尔积(Cartesian product),也称为直积,是指两个集合中每个元素之间所有可能的组合。 (如:假设集合A ={1, 2},集合B ={a, b, c}。则集合A与集合B的笛卡尔积为{(1,a), (1,b), (1,c), (2,a), (2,b), (2,c)})

♫联合查询

联合查询分为内连接和外连接,我们先来看看内连接的写法。

♪内连接

内连接有两种写法:

语法1:select * from 表名1,表名2;

mysql> select * from student,class;
+------+--------+----------+------+--------+
| id   | name   | class_id | id   | name   |
+------+--------+----------+------+--------+
|    1 | 张三   |        1 |    1 | 一班   |
|    1 | 张三   |        1 |    2 | 二班   |
|    1 | 张三   |        1 |    3 | 三班   |
|    2 | 李四   |        1 |    1 | 一班   |
|    2 | 李四   |        1 |    2 | 二班   |
|    2 | 李四   |        1 |    3 | 三班   |
|    3 | 王五   |        2 |    1 | 一班   |
|    3 | 王五   |        2 |    2 | 二班   |
|    3 | 王五   |        2 |    3 | 三班   |
|    4 | 赵六   |        2 |    1 | 一班   |
|    4 | 赵六   |        2 |    2 | 二班   |
|    4 | 赵六   |        2 |    3 | 三班   |
|    5 | 小七   |        3 |    1 | 一班   |
|    5 | 小七   |        3 |    2 | 二班   |
|    5 | 小七   |        3 |    3 | 三班   |
|    6 | 周八   |        3 |    1 | 一班   |
|    6 | 周八   |        3 |    2 | 二班   |
|    6 | 周八   |        3 |    3 | 三班   |
|    7 | 老九   |        3 |    1 | 一班   |
|    7 | 老九   |        3 |    2 | 二班   |
|    7 | 老九   |        3 |    3 | 三班   |
+------+--------+----------+------+--------+
21 rows in set (0.00 sec)

语法2:select * from 表名1 inner join 表名2;

mysql> select * from student inner join class;
+------+--------+----------+------+--------+
| id   | name   | class_id | id   | name   |
+------+--------+----------+------+--------+
|    1 | 张三   |        1 |    1 | 一班   |
|    1 | 张三   |        1 |    2 | 二班   |
|    1 | 张三   |        1 |    3 | 三班   |
|    2 | 李四   |        1 |    1 | 一班   |
|    2 | 李四   |        1 |    2 | 二班   |
|    2 | 李四   |        1 |    3 | 三班   |
|    3 | 王五   |        2 |    1 | 一班   |
|    3 | 王五   |        2 |    2 | 二班   |
|    3 | 王五   |        2 |    3 | 三班   |
|    4 | 赵六   |        2 |    1 | 一班   |
|    4 | 赵六   |        2 |    2 | 二班   |
|    4 | 赵六   |        2 |    3 | 三班   |
|    5 | 小七   |        3 |    1 | 一班   |
|    5 | 小七   |        3 |    2 | 二班   |
|    5 | 小七   |        3 |    3 | 三班   |
|    6 | 周八   |        3 |    1 | 一班   |
|    6 | 周八   |        3 |    2 | 二班   |
|    6 | 周八   |        3 |    3 | 三班   |
|    7 | 老九   |        3 |    1 | 一班   |
|    7 | 老九   |        3 |    2 | 二班   |
|    7 | 老九   |        3 |    3 | 三班   |
+------+--------+----------+------+--------+
21 rows in set (0.00 sec)

注:此处的inner可以省略掉

虽然上面通过联合查询得到了两张表的笛卡尔积的结果,但是该结果有许多不恰当的数据,我们可以通过添加条件筛选出正确的数据:

语法1:select * from 表名1 ,表名2 where 指定条件;

mysql> select * from student,class where student.class_id=class.id;
+------+--------+----------+------+--------+
| id   | name   | class_id | id   | name   |
+------+--------+----------+------+--------+
|    1 | 张三   |        1 |    1 | 一班   |
|    2 | 李四   |        1 |    1 | 一班   |
|    3 | 王五   |        2 |    2 | 二班   |
|    4 | 赵六   |        2 |    2 | 二班   |
|    5 | 小七   |        3 |    3 | 三班   |
|    6 | 周八   |        3 |    3 | 三班   |
|    7 | 老九   |        3 |    3 | 三班   |
+------+--------+----------+------+--------+
7 rows in set (0.01 sec)

语法1:select * from 表名1 inner join 表名2 on 指定条件;

mysql> select * from student join class on student.class_id=class.id;
+------+--------+----------+------+--------+
| id   | name   | class_id | id   | name   |
+------+--------+----------+------+--------+
|    1 | 张三   |        1 |    1 | 一班   |
|    2 | 李四   |        1 |    1 | 一班   |
|    3 | 王五   |        2 |    2 | 二班   |
|    4 | 赵六   |        2 |    2 | 二班   |
|    5 | 小七   |        3 |    3 | 三班   |
|    6 | 周八   |        3 |    3 | 三班   |
|    7 | 老九   |        3 |    3 | 三班   |
+------+--------+----------+------+--------+
7 rows in set (0.00 sec)

注:为了包证代码的可读性和避免两个表的列名冲突,写指定条件时列名前要加上表名.,以表示该列是哪个表的列

当要连接的两个表里的数据不是一一对应的,内连接只会查询互相对应的数据:

-- student.id有但student_id没有的和student.id有但student_id没有的数据不会出现
mysql> select * from student join score on student.id=score.student_id;
+------+--------+----------+------+------------+-------+
| id   | name   | class_id | id   | student_id | score |
+------+--------+----------+------+------------+-------+
|    1 | 张三   |        1 |    1 |          1 |   100 |
|    2 | 李四   |        1 |    2 |          2 |    94 |
|    3 | 王五   |        2 |    3 |          3 |    95 |
|    4 | 赵六   |        2 |    4 |          4 |    96 |
+------+--------+----------+------+------------+-------+
4 rows in set (0.03 sec)

♪外连接

外连接分为左外连接和右外连接。

♩左外连接

左外连接返回左表中的所有行以及右表中符合条件的行:

语法1:selecct * from 表名1 left join 表名2 on 指定条件;

-- 左表(student)全打印
mysql> select * from student left join score on student.id=score.student_id;
+------+--------+----------+------+------------+-------+
| id   | name   | class_id | id   | student_id | score |
+------+--------+----------+------+------------+-------+
|    1 | 张三   |        1 |    1 |          1 |   100 |
|    2 | 李四   |        1 |    2 |          2 |    94 |
|    3 | 王五   |        2 |    3 |          3 |    95 |
|    4 | 赵六   |        2 |    4 |          4 |    96 |
|    5 | 小七   |        3 | NULL |       NULL |  NULL |
|    6 | 周八   |        3 | NULL |       NULL |  NULL |
|    7 | 老九   |        3 | NULL |       NULL |  NULL |
+------+--------+----------+------+------------+-------+
7 rows in set (0.00 sec)

♩右外连接

右外连接返回右表中的所有行以及左表中符合条件的行:

语法1:selecct * from 表名1 right join 表名2 on 指定条件;

-- 右表(score)全打印
mysql> select * from student right join score on student.id=score.student_id;
+------+--------+----------+------+------------+-------+
| id   | name   | class_id | id   | student_id | score |
+------+--------+----------+------+------------+-------+
|    1 | 张三   |        1 |    1 |          1 |   100 |
|    2 | 李四   |        1 |    2 |          2 |    94 |
|    3 | 王五   |        2 |    3 |          3 |    95 |
|    4 | 赵六   |        2 |    4 |          4 |    96 |
| NULL | NULL   |     NULL |    5 |          8 |    97 |
+------+--------+----------+------+------------+-------+
5 rows in set (0.00 sec)

♪自连接

自连接是指同一张表自己进行联合查询,通过自连接可以把表的行转换成列,间接实现行与列的条件比较:

语法1:selecct * from 表名1 as 别名1, 表名1 as 别名2 where 指定条件;

mysql> select * from class as c1,class as c2 where c1.id=c2.id;
+------+--------+------+--------+
| id   | name   | id   | name   |
+------+--------+------+--------+
|    1 | 一班   |    1 | 一班   |
|    2 | 二班   |    2 | 二班   |
|    3 | 三班   |    3 | 三班   |
+------+--------+------+--------+
3 rows in set (0.00 sec)

注:自连接需要起别名,不然表名重复会报错

 ♫子查询

子查询是指嵌入在其他 sql 语句中的 select 语句,子查询可以分为单行子查询和多行子查询:

♪单行子查询

返回一条记录的子查询:
语法1: selecct * from 表名 where 列名=子查询语句;
-- 根据子查询获得的李四id查询李四所在班级的学生信息
mysql> select * from student where class_id = (select class_id from student where name="李四");
+------+--------+----------+
| id   | name   | class_id |
+------+--------+----------+
|    1 | 张三   |        1 |
|    2 | 李四   |        1 |
+------+--------+----------+
2 rows in set (0.03 sec)

♪多行子查询

返回多条记录的子查询:
语法1: selecct * from 表名 where 列名 in (子查询语句);
-- 根据子查询获得的李四和王五id查询李四和王五所在班级的学生信息
mysql> select * from student where class_id in (select class_id from student where name="李四" or name="王五");
+------+--------+----------+
| id   | name   | class_id |
+------+--------+----------+
|    1 | 张三   |        1 |
|    2 | 李四   |        1 |
|    3 | 王五   |        2 |
|    4 | 赵六   |        2 |
+------+--------+----------+
4 rows in set (0.00 sec)

♫合并查询

在实际应用中,为了合并多个 select 的执行结果,可以使用集合操作符 union union all 。使用 union和union all 时,前后查询的结果集中,字段需要一致。

♪union

union操作符用于取得两个结果集的并集,当使用该操作符时,会自动去掉结果集中的重复行:
mysql> select * from student where class_id=1 union select * from student where name="李四";
+------+--------+----------+
| id   | name   | class_id |
+------+--------+----------+
|    1 | 张三   |        1 |
|    2 | 李四   |        1 |
+------+--------+----------+
2 rows in set (0.00 sec)

♪union all

union all操作符用于取得两个结果集的并集,当使用该操作符时,不会去掉结果集中的重复行:
mysql> select * from student where class_id=1 union all select * from student where name="李四";
+------+--------+----------+
| id   | name   | class_id |
+------+--------+----------+
|    1 | 张三   |        1 |
|    2 | 李四   |        1 |
|    2 | 李四   |        1 |
+------+--------+----------+
3 rows in set (0.00 sec)

相关文章:

【MySQL】联合查询、子查询、合并查询

这里提供了三个表: 表1: mysql> select * from class; -------------- | id | name | -------------- | 1 | 一班 | | 2 | 二班 | | 3 | 三班 | -------------- 3 rows in set (0.01 sec) 表2: mysql> select * fro…...

小程序中如何设置所服务地区的时区

在全球化的背景下,小程序除了在中国使用外,还为海外的华人地区提供服务。例如我们采云小程序为泰国、阿根廷、缅甸等国家的商家就提供过微信小程序。这些商家开通小程序,为本地的华人提供服务。但通常小程序的开发者/服务商位于中国&#xff…...

Linux环境安装mysql8.0

1个人习惯我喜欢给软件安装在/use/local下,我使用的finalshell软件,直接手动新建一个文件夹名字为mysql 2下载mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz 3解压文件 tar -xvf mysql-8.0.2…...

STM32_DMA_多通道采集ADC出现错位现象

STM32_DMA_多通道采集ADC出现错位现象 问题描述: adcSensorValue[0],adcSensorValue[3],adcSensorValue[6]… //存储通道1数据 adcSensorValue[1],adcSensorValue[4],adcSensorValue[7]… //存储通道2数据 adcSensorValue[2],adcSensorValue[5],adcSensorValue[8]……...

Linux内存管理 (2):memblock 子系统的建立

前一篇:Linux内存管理 (1):内核镜像映射临时页表的建立 文章目录 1. 前言2. 分析背景3. memblock 简介3.1 memblock 数据结构3.2 memblock 接口 4. memblock 的构建过程 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者…...

创新学习方式,电大搜题助您迈向成功之路

近年来,随着信息技术的发展,互联网在教育领域发挥的作用越来越显著。贵州开放大学作为国内首家电视大学,一直致力于创新教学模式,帮助学生更好地获取知识。在学习过程中,学生常常遇到疑难问题,而解决这些问…...

Mybatis整理

Mybatis 定义 Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵…...

pytorch定义datase多次重复采样

有的时候训练需要对样本重复抽样为一个batch,可以按如下格式定义: class TrainLoader(Dataset):def __init__(self, fns, repeat1):super(TrainLoader, self).__init__()self.length len(fns) # 数据数量self.repeat repeat # 数据重复次数def __getitem__(self,…...

自动化测试 —— Pytest fixture及conftest详解!

前言 fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似u…...

Nginx解析漏洞

常见的解析漏洞&#xff1a; IIS 5.x/6.0解析漏洞 IIS 7.0/IIS 7.5/ Nginx <0.8.3畸形解析漏洞 Nginx <8.03 空字节代码执行漏洞 Apache解析漏洞 Nginx文件解析漏洞 对于任意文件名&#xff0c;例如:cd.jpg在后面添加/x.php后&#xff0c;即可将文件作为php解析。 原理…...

【机器学习】决策树原理及scikit-learn使用

文章目录 决策树详解ID3 算法C4.5算法CART 算法 scikit-learn使用分类树剪枝参数重要属性和接口 回归树重要参数&#xff0c;属性及接口交叉验证代码示例 一维回归的图像绘制 决策树详解 决策树&#xff08;Decision Tree&#xff09;是一种非参数的有监督学习方法&#xff0c;…...

#基于一个小车项目的FREERTOS分析(一)系统时钟

系统时钟 //初始化延迟函数 //SYSTICK的时钟固定为AHB时钟&#xff0c;基础例程里面SYSTICK时钟频率为AHB/8 //这里为了兼容FreeRTOS&#xff0c;所以将SYSTICK的时钟频率改为AHB的频率&#xff01; //SYSCLK:系统时钟频率 /* 系统定时器是一个 24bit 的向下递减的计数器&…...

ubuntu mmdetection配置

mmdetection配置最重要的是版本匹配&#xff0c;特别是cuda&#xff0c;torch与mmcv-full 本项目以mmdetection v2.28.2为例介绍 1.查看显卡算力 因为gpu的算力需要与Pytorch依赖的CUDA算力匹配&#xff0c;低版本GPU可在相对高的CUDA版本下运行&#xff0c;相反则不行 算力…...

嵌入式面试常见问题(一)

目录 1.什么情况下会出现段错误&#xff1f; 2.swap() 函数为什么不能交换两个变量的值 3.一个函数有六个参数 分别放在哪个区&#xff1f; 4.定义一个变量&#xff0c;赋初值和不赋初值分别保存在哪个区&#xff1f; 5.linux查看端口状态的命令 6.结构体中->和.的区…...

docker批量删除本地镜像

docker rmi -f $(docker images|grep docker|awk {print $3})...

数据结构(一)—— 数据结构简介

文章目录 一、基本概念和术语&#xff1f;1.1、数据1.2、数据元素1.3、数据项&#xff08;属性、字段&#xff09;1.4、数据对象1.5、数据结构 二、逻辑结构和物理结构&#xff08;存储结构&#xff09;2.1、逻辑结构1、定义2、分类&#xff08;线性结构和非线性结构&#xff0…...

Ubuntu输入正确密码重新跳到登录界面

Ubuntu输入正确密码重新跳到登录界面 问题描述 输入正确的密码登录后闪一下又回到锁屏界面 输入正确的密码后还是回到这个界面 产生的原因 /etc/profile或者/etc/enviroment出现了问题,导致无法正常登录 该错误产生的原因不止一个 这里是因为/etc/profile或者/etc/enviromen出…...

TCP/IP(十四)流量控制

一 流量控制 说明&#xff1a; 本文只是原理铺垫,没有用tcpdumpwiresahrk鲜活的案例讲解,后续补充 ① 基本概念 流量控制: TCP 通过接受方实际能接收的数据量来控制发送方的窗口大小 ② 正常传输过程 背景:1、客户端是接收方,服务端是发送方 --> 下载2、假设接收窗…...

CSS网页标题图案和LOGO SEO优化

favicon图标 将网页的头名字旁边放入一个图案 想将想要的图案切成png图片 然后把png图片转换成ico图案可以借助进行访问 将语法引用到head里面 SEO译为搜索引擎优化。是一种利用搜索引擎的规则提高网站有关搜索引擎的自然排名的方式 SEO的目的是对网站进行深度的优化&…...

机器人制作开源方案 | 双轮提升搬运小车

1. 功能描述 双轮提升搬运小车是一种用于搬运和移动物体的机械设备&#xff0c;它通常采用双轮驱动和提升装置。一般具备以下特点&#xff1a; ① 双轮驱动&#xff1a;该小车配备两个驱动轮&#xff0c;通过电动机或其它动力源驱动&#xff0c;提供足够的动力和扭矩&#xff0…...

保姆级教程:在OpenEuler 22.03 LTS-SP4上,用cephadm搞定Ceph Pacific集群部署

在OpenEuler 22.03 LTS-SP4上部署Ceph Pacific集群的完整指南 OpenEuler作为国产操作系统的代表&#xff0c;凭借其高性能和安全性&#xff0c;正逐渐成为企业级应用的首选。而Ceph作为开源的分布式存储解决方案&#xff0c;以其高可靠性和可扩展性赢得了广泛认可。本文将详细介…...

量子机器学习在医疗影像中的技术迷思与测试验证陷阱

当量子计算遭遇医学影像近年来&#xff0c;"量子赋能医疗影像"成为热门概念&#xff0c;宣称通过量子算法&#xff08;如QSVM、量子卷积&#xff09;可大幅提升病灶识别精度和图像重建效率。然而&#xff0c;作为软件测试从业者&#xff0c;我们需警惕技术炒作背后的…...

5分钟掌握:PowerToys Image Resizer让图片批量处理效率提升10倍

5分钟掌握&#xff1a;PowerToys Image Resizer让图片批量处理效率提升10倍 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_Trending/po/…...

开源吐槽大会:技术圈的幽默自省

开源项目吐槽大会技术文章大纲主题与目的开源项目吐槽大会旨在通过幽默、犀利的视角&#xff0c;揭示开源生态中的常见问题&#xff0c;促进开发者反思与改进。文章将从技术、社区、维护等角度展开&#xff0c;兼顾娱乐性与建设性。核心内容结构技术层面的经典槽点 依赖地狱&am…...

基于S7-200 PLC与组态王技术的温室大棚控制方案:包含梯形图原理图、IO分配及组态画面详解

基于S7-200 PLC和组态王温室大棚控制 我们主要的后发送的产品有&#xff0c;带解释的梯形图接线图原理图图纸&#xff0c;io分配&#xff0c;组态画面菜农张叔上周还给我打电话吐槽&#xff1a;“小王啊&#xff0c;上周那场降温加突然转晴&#xff0c;我三点爬起来盖半层棉被…...

Ostrakon-VL零售AI降本方案:替代人工巡检,单店年省8万元

Ostrakon-VL零售AI降本方案&#xff1a;替代人工巡检&#xff0c;单店年省8万元 1. 零售巡检的痛点与AI解决方案 在传统零售运营中&#xff0c;门店巡检是一项耗时耗力的日常工作。店长或督导人员需要每天检查&#xff1a; 商品陈列是否整齐货架缺货情况价签是否正确店铺环境…...

Ostrakon-VL 模型推理加速实战:使用 .accelerate 库优化扫描速度

Ostrakon-VL 模型推理加速实战&#xff1a;使用 .accelerate 库优化扫描速度 1. 效果惊艳的开场 最近在测试Ostrakon-VL模型时&#xff0c;我发现了一个令人惊喜的事实&#xff1a;通过.accelerate库的几项简单优化&#xff0c;模型推理速度可以提升3倍以上&#xff0c;同时显…...

告别重复编码:用Copaw结合快马平台,自动化生成你的常用工具模块

作为一名经常需要整理会议纪要的开发者&#xff0c;我一直在寻找能提升效率的工具。最近尝试用Copaw结合InsCode(快马)平台做了一个会议纪要自动生成器&#xff0c;效果出乎意料地好。整个过程几乎没写代码&#xff0c;却实现了核心功能&#xff0c;分享下具体实现思路&#xf…...

IQR四分位数法是什么?

一、核心概念&#xff1a;四分位数与IQR1. 四分位数&#xff08;Quartiles&#xff09;将一组有序数据&#xff08;从小到大排列&#xff09;划分为4个相等部分的三个关键分割点&#xff0c;分别记为&#xff1a;Q1&#xff08;第一四分位数&#xff0c;25%分位数&#xff09;&…...

论文AI率高怎么降最安全?2026保姆级降AIGC工作流:实测权威指令揭秘与3款工具横评

辛辛苦苦肝了三个月的论文&#xff0c;可是一经过学校的AI检测系统&#xff0c;却给我标了个醒目的65%&#xff01;这我真是百口莫辩&#xff01;明明每一个观点、每一处引用&#xff0c;都是我一点点阅读文献琢磨出来的&#xff01; 为了把要命的 AI率 打下来&#xff0c;我之…...