【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)

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

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

相关文章

TCP/IP(十四)流量控制

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

【0227】smgr设计机制之新建一个磁盘表文件

相关阅读: 【0222】存储管理器smgr设计机制,及SMgrRelation、SMgrRelationData的作用(1) 【0223】源码剖析smgr底层设计机制(3) 【0224】smgr设计机制之通过RelFileNode访问磁盘表文件(2) 【0225】源码分析postgres磁盘块(disk block)定义 【0226】smgr设计机制中,s…

OpenCV4(C++)——模板匹配

matchTemplate 模板匹配和卷积运算大致相同,模板图类似于卷积核,从原图的左上角开始进行滑动窗口的操作,最后得到一个特征图,这个特征图里的数值就是每次计算得到的相似度,通用匹配方式,相似值是&#xff…

强制结束subprocess.Popen开启的任务

强制结束subprocess.Popen开启的任务 需要使用到psutil库,可以通过pip安装 import subprocessimport psutildef kill(proc_pid):process psutil.Process(proc_pid)for proc in process.children(recursiveTrue):proc.kill()process.kill()proc subprocess.Popen([…

浅谈高速公路服务区分布式光伏并网发电

前言 今年的国家经济工作会议提出:将“做好碳达峰、碳中和工作”作为 2021年的主要任务之一,而我国高速公路里程 15.5万公里,对能源的需求与日俱增,碳排放量增速明显。 为了实现采用减少碳排放量,采用清洁能源替代的…

【Java 进阶篇】JavaScript 与 HTML 的结合方式

JavaScript是一种广泛应用于Web开发中的脚本语言,它与HTML(Hypertext Markup Language)结合使用,使开发人员能够创建交互式和动态的网页。在这篇博客中,我们将深入探讨JavaScript与HTML的结合方式,包括如何…

第一个 Python 程序

三、第一个 Python 程序 好了,说了那么多,现在我们可以来写一下第一个 Python 程序了。 一开始写 Python 程序,个人不太建议用专门的工具来写,不方便熟悉语法,所以这里我先用 Sublime Text 来写,后期可以…

RobotFramework自动化测试框架的基础关键字

1.1.1 如何搜索RobotFramework的关键字 有两种方式可以快速的打开RIDE的关键字搜索对话框 1、选择菜单栏Tools->Search Keywords,然后会出现如下的关键字搜索对话框,这个对话框就类似提供了一个关键字的API的功能,提供了关键字的…

如何建立线上线下相结合的数字化新零售体系?

身处今数字化时代,建立线上线下相结合的数字化新零售体系是企业成功的关键。蚓链数字化营销系统致力于帮助企业实现数字化转型,打通线上线下销售渠道,提升品牌影响力和用户黏性,那么具体是如何建立的? 1. 搭建数字化中…

P1886 滑动窗口 /【模板】单调队列

题目: P1091 [NOIP2004 提高组] 合唱队形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) n 位同学站成一排,音乐老师要请其中的 �−�n−k 位同学出列,使得剩下的 �k 位同学排成合唱队形。 合唱队形是指这…

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

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

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

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

26、类型别名

类型别名 顾名思义,其实就是类型类型起别名(新起一个名字) demo: type Name string; type NameConsole () > string; type NameUnite Name | NameConsole; function getName(n: NameUnite): Name {if( typeof n string)…

vue3+ts项目03 element-plus、vue-router、pinia

yarn add element-plus yarn add element-plus/icons-vue修改main.ts import { createApp } from vue import App from ./App.vueimport ElementPlus from element-plus import element-plus/dist/index.css import zhCn from element-plus/dist/locale/zh-cn.mjsconst app c…

Mac上brew切换国内源【极简方案】

前言 下载一些开源包如telnet时,通过brew下载经常由于网络不通,导致下载失败。所以mac用户最好一次性设置brew为国内源。 方案 极简四步,换Homebrew的镜像源为阿里云镜像,依次在终端执行以下几步: 1、cd “$(brew …

【MySQL】MySQL分区表详解

原创不易,注重版权。转载请注明原作者和原文链接 文章目录 分区表介绍表分区的优缺点和限制 分区适用场景分区方式分区策略RANGE 分区LIST 分区HASH 分区KEY 分区COLUMNS 分区 常见分区命令是否支持分区创建分区表向分区表添加新的分区删除指定的分区重新组织分区合…

#力扣:344. 反转字符串@FDDLC

344. 反转字符串 一、Java class Solution {public void reverseString(char[] s) {for (int l 0, r s.length - 1; l < r; l, r--) {s[l] ^ s[r];s[r] ^ s[l];s[l] ^ s[r];}} } 二、C #include <vector> using namespace std; class Solution { public:void re…

vue七牛云视频直传

完成后样式&#xff1a; 下面的代码是我自己项目里面用到的&#xff0c;一些判断看自己情况去掉&#xff0c;用的是element-ui组件 安装 uuid 库。你可以使用 npm 或 yarn 来完成安装。在终端中执行以下命令&#xff1a; npm install uuidhtml部分 <el-upload class&quo…

【python】time

文章目录 【calendar】是否闰年星期英文缩写今天星期几打印日历 【datetime】今天星期几 【time】当前时间 【pandas】当前时间文件修改的时间 【日历】 【calendar】 是否闰年 import calendar print(calendar.isleap(2000))out True星期英文缩写 print(calendar.weekhead…

TCP/IP(十三)滑动窗口

一 滑动窗口 通信双方要读懂对方的反馈信息,并进行调整 TCP滑动窗口原理终于清楚了 TCP Window Full 和 TCP Zero Window "特殊的场景" 1、TCP Window Full 是站在发送端角度说的特点&#xff1a; 表示发送端不能再发数据给对方,除非发送的数据包得到ACK响应2、…