【MySQL】进阶查询-聚合查询和联合查询

news2024/10/3 21:21:30

文章目录

  • 1. 前言
  • 2. 表的设计
    • 2.1 一对一
    • 2.2 一对多
    • 2.3 多对多
  • 3.将查询结果放到另一个表中
  • 4. 聚合查询
    • 4.1 聚合函数
    • 4.2 GROUP BY
    • 4.3 HAVING
  • 5. 联合查询(多表查询)
    • 5.1 内连接
    • 5.2 外连接
    • 5.3 自连接
    • 5.4 子查询
    • 5.5 合并查询
  • 6. 总结

1. 前言

文章主要围绕着以下三个问题:

  1. group by的作用
  2. where与having的区别
  3. 表的连接分为哪些,分别是什么作用

2. 表的设计

在创建数据表时,我们通常时根据需求找到"实体", 梳理"实体"之间的关系,从而进行创建.
"实体"之间可能会有以下几种关系:1.没关系 2.一对一 3.一对多 4.多对多.
没关系应该是最好理解的,就是单独的一张表,并不涉及到其它的表.

2.1 一对一

一对一的关系在生活中是很常见的,例如每个学生都有属于自己的学号,每个学号就只对应一个学生. 类似于这样的情况,就是一对一的关系.
此时就可以创建两张表,一个是学生表,另一个是学号表. 学生表里的学号就可以和学号表中的学号关联起来.

2.2 一对多

学生在学校上课时,会有一个班级. 但是一个班级可以有多个学生. 这就是一对多的关系.

2.3 多对多

举个例子,我们在学习课程时,可以选择多门课程进行学习,而课程也可以被多个学生进行选择. 这就是多对多的关系.
多对多的关系,在创建表时,可以使用"关联表" 将两个实体联系起来.

如果在设计数据库表时,场景很复杂,可以使用ER图帮助我们更好的创建数据库表.

3.将查询结果放到另一个表中

insert into2 select 字段 from1;
# 表2 是要存放查询结果的表
# 表1 是要查询的表
# 查询结果的列要和表2的列相匹配!
# 也可以将查询结果存放在表2的指定列中

示例:
下面这个"student1"这个表中,有三条数据.
在这里插入图片描述
接下来我们把查询结果放到一张新的 "student2"这个表中
在这里插入图片描述

4. 聚合查询

聚合查询可以进行"行"与"行"之间的运算

4.1 聚合函数

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总数
AVG([DISTINCT] expr)返回查询到的数据的 平均值
MAX([DISTINCT] expr)返回查询到的数据的 最大值
MIN([DISTINCT] expr)返回查询到的数据的 最小值
  • count函数 可以对行进行计算,也可以对列进行计算.

示例:
在这里插入图片描述
这里有一张学生表,里面有学生的id,姓名,语数英三科的成绩.
在这里插入图片描述

  • sum,avg,max和min 都是只对数字生效,如果不是数字则没有意义

sum函数的用法和count函数类似. 不过只能计算"列",如果这一列存在"null",则不会参与运算
avg,max,min的用法 和 sum 类似,就不一一介绍了

4.2 GROUP BY

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

例如:
在这里插入图片描述
在我的学生表中有这样一些数据.现在我要对语文成绩进行分组
使用group by之后,我们可以看到这已经以语文成绩进行分组了
在这里插入图片描述
成绩为57的有一个,69的有两个,82的有三个

需要注意的是:在进行查询分组的时候,只有分组的这一列,可以查询,其它列必须搭配聚合函数来进行查询

4.3 HAVING

分组查询还可以指定条件,这里的只当条件可以分组之前指定还可以分组之后指定 分组前进行筛选使用的是where 分组后进行筛选使用的则是having SQL 中增加 HAVING 子句原因就是因为WHERE 关键字无法与合计函数一起使用。
去除id=1的语文成绩后进行分组
在这里插入图片描述
分组之后筛选出语文成绩>60分的学生数量
在这里插入图片描述
where 关键字虽然无法与合计函数一起使用,但是可以和having一起使用

5. 联合查询(多表查询)

联合查询一般是在多表之间建立连接后查询的过程.其实就是计算"笛卡尔积"的过程
但是当表很大的时候,如果进行联合查询,效率就会特别低.因为"笛卡尔积"就是简单的排列组合,有些数据是"合理"的,有些数据是"不合理"的.所以我们就要把"有效"的数据筛选出来.因此联合查询通常需要加连接条件和其它筛选条件

5.1 内连接

内连接得到的是两张表中都存在的数据
两种写法:

select 字段 from1,2;
select 字段 from1 join2 on 条件;

举个例子:
学生表:
在这里插入图片描述
班级表:
在这里插入图片描述
要求查询"王五"的班级的名字.
这就涉及到了两张表,就需要使用联合(多表)查询.

1.首先进行笛卡尔积
在这里插入图片描述
其实就是学生表和班级表进行排列组合,里面有很多无效的数据.
2. 添加连接条件
在这里插入图片描述
注意这里的条件写法,应该是表名.字段名,因为涉及到多个表,多个表中的字段名可能相同,因此需要使用 表名.字段 表明是哪个表中的字段.当然如果这个列名是唯一的,也可以不加 表名.

在这里插入图片描述
刚才的结果还是太多了,我们也可以加上指定列进行查询,同样需要使用表名.字段的形式进行查询

使用join on也可以实现相同的效果,同样是刚才的例子
使用join on的方式来完成
1.首先进行笛卡尔积
在这里插入图片描述
2. 添加条件
在这里插入图片描述
直接写join或者inner join就是内连接
join on不仅可以实现内连接,还可以实现外连接

5.2 外连接

外连接分为左外连接(left join)和右外连接(right join)
还是刚才的学生表:
在这里插入图片描述
但班级表中多有两条数据
在这里插入图片描述
进行笛卡尔积后得到的结果
在这里插入图片描述
这是内连接得到的结果:
在这里插入图片描述
这个是进行右连接得到的结果
在这里插入图片描述
右连接会把右侧表中的数据都获取到,即使左边的值是NULL,也会显示出来
左连接也是类似,会把左侧表中的数据都获取到,即使右边的值是NULL,也会显示出来.

如果两张表中的数据,在对方表中都有,那么此时内外连接是没有区别的,如果两张表中的数据只有一部分在对方的表中,内连接就是获取两张表的"交集",如果是外连接,那么获取到的值就是一侧表的全部记录.

还有一种连接是"全外连接",但是在MySQL中并不支持

5.3 自连接

自连接就是和自己进行笛卡尔积
在条件查询中,只是"列"和"列"之间的比较,但是有的地方需要用的 "行"和"行"之间的比较,就需要使用自连接,将"行"转为"列"再进行比较

例如这里有一张成绩表
在这里插入图片描述
如果要查询数学成绩比语文成绩高的同学的名字,就需要使用自连接.因为如果进行比较,那么就是"行"和"行"进行的比较
在这里插入图片描述
可以看到,如果是直接进行连接,那么是会报错的.
Not unique table/alias: 'grades': 这句话告诉我们不是唯一的表,但是可以起别名

在这里插入图片描述
通过起别名的方式,成功进行自连接
加上连接条件,先筛选出一部分记录,此时我们可以看到语文成绩和数学成绩就在两列了
在这里插入图片描述
将条件补全,就可以得到我们想要的结果了
在这里插入图片描述

5.4 子查询

子查询本质就是将多个查询语组合成一个SQL语句,例如在查询得到的临时表上再次进行查询

例如:在班级表中,找到与"张三"班级相同的同学
在这里插入图片描述
查到"张三"的班级id这个想必大家都会
在这里插入图片描述
我们要将得到的这个结果继续参与查询:
在这里插入图片描述
此时就得到"李四"同学的这条记录了,因为这里的班级id就只有一个,所以后面使用的是 = ,但是如果这个的临时表数据有多条,就可以使用 in 来完成

5.5 合并查询

合并查询是把两个查询的结果集合合并到一起,使用的是union 和union all 这两个关键字

  • union: 如果有重复的数据,就会去重
  • union all: 如果有重复的数据,则不会去重

还是刚才的分数表
在这里插入图片描述
如果我们要查询数学成绩>90和英语成绩<60的人的姓名,就可以使用合并查询在这里插入图片描述

6. 总结

在SQL语句中,查询数据的操作与其它操作语句相比还是有一些难度的,主要涉及到一些多表查询等操作.对于里面涉及到的一些关键字,连接类型要熟练掌握

感谢你的观看!希望这篇文章能帮到你!
专栏:《速通MySQL》在不断更新中,欢迎订阅!
“愿与君共勉,携手共进!”
在这里插入图片描述

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

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

相关文章

zookeeper介绍和搭建

zookeeper介绍和搭建一、zookeeper简介二、zookeeper工作机制三、zookeeper集群部署3.1 实验准备3.2 修改配置文件3.3 创建目录以及拷贝文件3.4 配置Zookeeper启动脚本3.5 查看启动状态一、zookeeper简介 1、zookeeper概念 ZooKeeper是一种为分布式应用所设计的高可用、高性能…

尚融宝20-实现用户注册和用户认证

目录 一、需求 二、前端整合发送验证码 三、实现用户注册 1、创建VO对象 2、定义常量 3、引入MD5工具类 4、Controller 5、Service 6、前端整合 四、实现用户登录 1、后端整合JWT 2、前端整合 五、校验用户登录 1、后端 2、前端 一、需求 二、前端整合发送验证码…

数据结构———一万字手撕八大排序算法

常见的排序算法1.排序算法的作用1.1列如我们在购物时1.2玩游戏时英雄战力的排行&#xff0c;都得用到排序算法2.常见排序算法的实现2.1冒泡排序时间复杂度计算&#xff1a;2.2直接插入排序时间复杂度计算&#xff1a;2.3选择排序时间复杂度计算&#xff1a;2.4希尔排序⭐时间复…

Qt音视频开发28-ffmpeg解码本地摄像头(yuv422转yuv420)

一、前言 一开始用ffmpeg做的是视频流的解析,后面增加了本地视频文件的支持,到后面发现ffmpeg也是支持本地摄像头设备的,只要是原则上打通的比如win系统上相机程序、linux上茄子程序可以正常打开就表示打通,整个解码显示过程完全一样,就是打开的时候要传入设备信息,而且…

Prophet学习(五)季节性、假日效应和回归因子

​ 编辑目录 假期和特殊事件建模&#xff08;Modeling Holidays and Special Events&#xff09; 内置国家假日&#xff08;Built-in Country Holidays&#xff09; 季节性的傅里叶级数&#xff08;Fourier Order for Seasonalities&#xff09; 指定自定义季节&#xff08…

启动neo4j备忘录

做个备忘录 Neo4j下载、安装、环境配置 优秀教程&#xff1a;https://blog.csdn.net/zeroheitao/article/details/122925845 Neo4j环境变量配置 1、安装JDK 由于Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。配置…

【数据结构】反射

文章目录&#x1f337; 1 定义&#x1f337; 2 用途(了解)&#x1f337; 3 反射基本信息&#x1f337; 4 反射相关的类&#x1f333; 4.1 Class类(反射机制的起源)Class类中的相关方法&#x1f333; 4.2 反射示例4.2.1 获得Class对象的三种方式4.2.2 反射的使用⭐️反射使用1&a…

3个宝藏级软件,每一个都超级好用,少装一个跟你急

分区助手 下载地址&#xff1a;https://www.disktool.cn/ 很多新手小白使用电脑都不懂&#xff0c;把所有软件都安装到了C盘&#xff0c;时间久了储存的东西变多&#xff0c;C盘空间着实不够用&#xff0c;这个免费的工具可以帮你重新分区&#xff0c;无损数据地执行。除了无损…

腾讯云8核16G18M轻量服务器CPU带宽流量性能测评

腾讯云轻量应用服务器8核16G18M带宽&#xff0c;18M公网带宽下载速度峰值可达2304KB/秒&#xff0c;相当于2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;3500GB月流量&#xff0c;折合每天116GB流量。腾讯云百科分享腾讯云轻量服务器8核16G18M配置、CPU型号、公网带宽月…

ChatGPT资讯—2023.4.3

一、 最新资讯 1. UC伯克利开源大语言模型Vicuna又来了 Vicuna-13b只需要花费300美刀&#xff08;比Alpaca的600美元便宜一半&#xff09;就能搞出来接近ChatGPT的水平。如何用小资源大模型让个人普通者与中小微企业也能用上高科技一直是开源社区孜孜追求的目标 Vicuna开源代…

ERP与CRM、MRP、PLM、APS、MES、WMS、SRM的关系

数字化转型中少不了ERP系统的存在&#xff0c;CRM/MRP/PLM/APS/MES/WMS/SRM这些都需要一起上吗&#xff1f; 如下图所示&#xff0c;是某企业IT系统集成架构流图。 先了解一下ERP是做什么的&#xff0c;ERP就是企业资源管理系统&#xff0c;从企业的价值链分析&#xff0c;企业…

用机器学习sklearn+opencv-python过古诗文网4位数字+字母混合验证码

目录 获取验证码图片 用opencv-python处理图片 制作训练数据集 训练模型 识别验证码 编写古诗文网的登录爬虫代码 总结与提高 源码下载 在本节我们将使用sklearn和opencv-python这两个库过掉古诗文网的4位数字字母混合验证码&#xff0c;验证码风格如下所示。 验证码获…

分库分表介绍以及shardingjdbc实现分库分表

分库分表概念 一、什么是分库分表 分库分表是在海量数据下&#xff0c;由于单库、表数据量过大&#xff0c;导致数据库性能持续下降的问题&#xff0c;演变出的技术方案。 分库分表是由分库和分表这两个独立概念组成的&#xff0c;只不过通常分库与分表的操作会同时进行&…

还不懂怎么设计超时关单?一文告诉你!

背景介绍 ​ 提交订单&#xff0c;是交易领域避不开的一个话题。在提交订单设计时&#xff0c;会涉及到各种资源的预占&#xff1a;如商品库存、优惠券数量等等。但是&#xff0c;下单的流程并不能总是保证成功的&#xff0c;如商品库存异常的时候被拦截、优惠券数量不足的时候…

3月更新 | Visual Studio Code Python

我们很高兴地宣布&#xff0c;2023年3月版 Visual Studio Code Python 和 Jupyter 扩展现已推出&#xff01; 此版本包括以下改进&#xff1a; 后退按钮和取消功能添加到创建环境命令默认情况下&#xff0c;Python 扩展不再附带 isortJupyter 笔记本中内核选择的改进Python P…

Modbus 协议详解

Modbus 协议详解 通信协议是指双方实体完成通信或服务所必须遵循的规则和约定&#xff0c;例如我们为实现人与人之间的交流需要约定统一的语言&#xff0c;统一的文字&#xff0c;规定语速等等。 而对于设备之间&#xff0c;协议定义了数据单元使用的格式&#xff08;例如大端…

四、数组、切片,映射

一、一维数组 //声明一个包含5个元素的整型数组 var array [5]int //具体数值填充数组 array : [5]int{1, 2, 3, 4, 5} //容量由初始化值的数量决定 array : [...]int{1, 2, 3, 4, 5) //只初始化索引为1和2的元素 array : [5]int{1: 10, 2: 20} //修改索引为2的元素的值 array…

Linux文件系统、虚拟内存、进程与线程、锁

文章目录文件系统suLinux 中默认没有 super 命令/proc/etc/var/root/home/bin/dev/lib/sbintmp句柄maxfdPWDpathhomeexportwdfdu虚拟内存jobsLinux下一切皆文件swaponmkswap进程与线程nohup子进程与父进程unix进程间的通信方式线程的同步方式sedtarhistory硬链接ln&#xff08;…

Go分布式爬虫笔记(二十一)

文章目录21 切片和哈希表切片底层结构截取扩容哈希表原理哈希碰撞拉链法开放寻址法&#xff08;Open Addressing&#xff09;读取重建原理删除原理思考题Go 的哈希表为什么不是并发安全的&#xff1f;在实践中&#xff0c;怎么才能够并发安全地操作哈希表&#xff1f;拉链法开放…

软件设计师笔记-----程序设计语言与语言处理程序基础

文章目录七、程序设计语言与语言处理程序基础7.1、编译与解释&#xff08;低频&#xff09;7.2、文法&#xff08;低频&#xff09;7.3、有限自动机与正规式&#xff08;几乎每次都会考到&#xff09;有限自动机正规式7.4、表达式&#xff08;偶尔考到&#xff09;7.5、传值和传…