【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…...
小程序中如何设置所服务地区的时区
在全球化的背景下,小程序除了在中国使用外,还为海外的华人地区提供服务。例如我们采云小程序为泰国、阿根廷、缅甸等国家的商家就提供过微信小程序。这些商家开通小程序,为本地的华人提供服务。但通常小程序的开发者/服务商位于中国ÿ…...
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解析漏洞
常见的解析漏洞: IIS 5.x/6.0解析漏洞 IIS 7.0/IIS 7.5/ Nginx <0.8.3畸形解析漏洞 Nginx <8.03 空字节代码执行漏洞 Apache解析漏洞 Nginx文件解析漏洞 对于任意文件名,例如:cd.jpg在后面添加/x.php后,即可将文件作为php解析。 原理…...
【机器学习】决策树原理及scikit-learn使用
文章目录 决策树详解ID3 算法C4.5算法CART 算法 scikit-learn使用分类树剪枝参数重要属性和接口 回归树重要参数,属性及接口交叉验证代码示例 一维回归的图像绘制 决策树详解 决策树(Decision Tree)是一种非参数的有监督学习方法,…...
#基于一个小车项目的FREERTOS分析(一)系统时钟
系统时钟 //初始化延迟函数 //SYSTICK的时钟固定为AHB时钟,基础例程里面SYSTICK时钟频率为AHB/8 //这里为了兼容FreeRTOS,所以将SYSTICK的时钟频率改为AHB的频率! //SYSCLK:系统时钟频率 /* 系统定时器是一个 24bit 的向下递减的计数器&…...
ubuntu mmdetection配置
mmdetection配置最重要的是版本匹配,特别是cuda,torch与mmcv-full 本项目以mmdetection v2.28.2为例介绍 1.查看显卡算力 因为gpu的算力需要与Pytorch依赖的CUDA算力匹配,低版本GPU可在相对高的CUDA版本下运行,相反则不行 算力…...
嵌入式面试常见问题(一)
目录 1.什么情况下会出现段错误? 2.swap() 函数为什么不能交换两个变量的值 3.一个函数有六个参数 分别放在哪个区? 4.定义一个变量,赋初值和不赋初值分别保存在哪个区? 5.linux查看端口状态的命令 6.结构体中->和.的区…...
docker批量删除本地镜像
docker rmi -f $(docker images|grep docker|awk {print $3})...
数据结构(一)—— 数据结构简介
文章目录 一、基本概念和术语?1.1、数据1.2、数据元素1.3、数据项(属性、字段)1.4、数据对象1.5、数据结构 二、逻辑结构和物理结构(存储结构)2.1、逻辑结构1、定义2、分类(线性结构和非线性结构࿰…...
Ubuntu输入正确密码重新跳到登录界面
Ubuntu输入正确密码重新跳到登录界面 问题描述 输入正确的密码登录后闪一下又回到锁屏界面 输入正确的密码后还是回到这个界面 产生的原因 /etc/profile或者/etc/enviroment出现了问题,导致无法正常登录 该错误产生的原因不止一个 这里是因为/etc/profile或者/etc/enviromen出…...
TCP/IP(十四)流量控制
一 流量控制 说明: 本文只是原理铺垫,没有用tcpdumpwiresahrk鲜活的案例讲解,后续补充 ① 基本概念 流量控制: TCP 通过接受方实际能接收的数据量来控制发送方的窗口大小 ② 正常传输过程 背景:1、客户端是接收方,服务端是发送方 --> 下载2、假设接收窗…...
CSS网页标题图案和LOGO SEO优化
favicon图标 将网页的头名字旁边放入一个图案 想将想要的图案切成png图片 然后把png图片转换成ico图案可以借助进行访问 将语法引用到head里面 SEO译为搜索引擎优化。是一种利用搜索引擎的规则提高网站有关搜索引擎的自然排名的方式 SEO的目的是对网站进行深度的优化&…...
机器人制作开源方案 | 双轮提升搬运小车
1. 功能描述 双轮提升搬运小车是一种用于搬运和移动物体的机械设备,它通常采用双轮驱动和提升装置。一般具备以下特点: ① 双轮驱动:该小车配备两个驱动轮,通过电动机或其它动力源驱动,提供足够的动力和扭矩࿰…...
高效视频帧提取终极指南:为深度学习构建专业数据集
高效视频帧提取终极指南:为深度学习构建专业数据集 【免费下载链接】video2frame Yet another easy-to-use tool to extract frames from videos, for deep learning and computer vision. 项目地址: https://gitcode.com/gh_mirrors/vi/video2frame 在计算机…...
Unity游戏开发集成MCP协议:AI助手自动化操作指南
1. 项目概述:Unity游戏开发中的MCP革命如果你是一名Unity开发者,最近可能已经注意到一个名为“CoderGamester/mcp-unity”的项目在GitHub上悄然走红。这不仅仅是一个普通的插件或工具包,它代表了一种全新的工作流范式,旨在将大型语…...
AI驱动全栈开发:Cursor集成模板与高效协作实践
1. 项目概述:当AI代码助手遇上全栈开发最近在GitHub上看到一个挺有意思的项目,叫“Cursor-FullStack-AI-App”。光看名字,你大概能猜到它和Cursor这个AI编程工具,以及全栈应用开发有关。作为一个在前后端都摸爬滚打过多年的开发者…...
Ruby专属LLM应用框架ruby_llm:从基础集成到生产部署实战
1. 项目概述:一个为Ruby语言量身打造的LLM应用框架如果你是一名Ruby开发者,最近被各种大语言模型(LLM)的应用搞得心痒痒,但看着满世界的Python库和框架感到无从下手,那么crmne/ruby_llm这个项目可能就是你在…...
从理论到实践:三维形状上下文(3DSC)如何构建鲁棒的点云局部描述符
1. 为什么我们需要三维形状上下文(3DSC) 想象一下你正在玩一个拼图游戏,但所有碎片都被随机撒上了胡椒粉,有些碎片还被书本盖住了一角。这就是计算机处理含噪声、遮挡的点云数据时的真实处境。在机器人导航、自动驾驶或者工业质检中,我们经常…...
Cursor编辑器状态快照插件开发:一键保存与恢复工作区
1. 项目概述:一个专为开发者设计的“后悔药”如果你是一名重度使用 Cursor 编辑器的开发者,那么你一定经历过这样的场景:在沉浸式编码时,为了快速定位或修改,你可能会频繁地使用CtrlClick跳转到函数定义,或…...
大语言模型长上下文建模:从注意力优化到Mamba架构的工程实践
1. 项目概述:为什么长上下文建模是LLM的“圣杯”?如果你在过去一年里深度使用过任何主流的大语言模型,无论是ChatGPT、Claude还是开源的Llama、Qwen,一个共同的痛点一定让你印象深刻:“它好像不记得我们之前聊了什么”…...
FinalBurn Neo:终极开源街机模拟器技术深度解析
FinalBurn Neo:终极开源街机模拟器技术深度解析 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo FinalBurn Neo(简称FBNeo)是一款专业级的开源街机模拟器,…...
2026 私域救命玩法!90% 的老板赚不到钱,根本不是产品不行
我在杭州做电商、做私域、做投资这么多年,见过各行各业的起起伏伏。这些年接触过的实体老板,没有一百也有八十。手里握着工厂的、拿着自主知识产权的、有正规生产资质的,比比皆是。但 90% 的人都在亏钱。他们天天抱怨流量太贵、同行乱价、客户…...
基于Adafruit Audio FX的智能穿戴音频系统设计与实现
1. 项目概述:一件会“捧场”的智能夹克你有没有想过,你的衣服可以成为你专属的喜剧演员、气氛组或者随身音效库?想象一下,在朋友聚会时,一个恰到好处的罐头笑声从你的口袋响起;或者在你做出一个帅气动作时&…...
