【MySQL】增删改查-进阶(二)
目录
🌴新增
🎄查询
🚩聚合查询
🏀聚合函数
🏀group by子句
🏀HAVING
🚩联合查询
🏀内连接
🏀外连接
🏀自连接
🏀子查询
🏀合并查询
🌲MySQL增删改查总结
🌴新增
插入和查询结果:把一个表的查询结果插入到另一个表中
将表名2的查询结果插入表名1中
insert into 表名1 select * from 表名2
需要查询到的结果集合的类型和列数,要和带插入的表的列数和类型匹配以及顺序也要匹配,列名无所谓。
🎄查询
🚩聚合查询
前面谈到表达式查询,主要运算列和列之间,还有情况需要行和行之间的运算,就需要聚合查询
如创建一个考试成绩表:算某个学科的平均成绩,总成绩
🏀聚合函数
常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:
注意:在sql语句中,聚合运算遇到NULL会直接跳过!函数中的distinct(去重)可写可不写
案例举例:
- COUNT
全列查询:
查询指定列:
- SUM
- AVG
- MAX
- MIN
🏀group by子句
SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。
创建一个员工表:
我们就可以按照岗位这一列进行分组
查询每个岗位下分别有多少人:
按照每个岗位,计算同一岗位的工资均值:
🏀HAVING
GROUP BY 子句进行分组之前,需要对表中结果去除时,使用where,放在group by之前
出去张三之外,查询每个岗位的平均工资:
GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING,放在group by后面
查询每个岗位的平均工资,除去平均工资超过两万的:
上述两种条件同时存在:计算每个岗位的平均工资,但是除去张三和平均工资超过两万的
🚩联合查询
上述介绍的都是单表查询,实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积。
那什么是笛卡尔积呢?看下图:由第一张表中的第一条数据与第二张表中的第一条数据拼接放到一个大表当中,再由第一张表中的第一条数据与第二张表中第二条数据拼接,依次进行排列组合。通过这样的排列组合得到一张更大的表,这就是笛卡尔积,它的列数由原来两张表的列数之和,行数为原来两张表行数之积。
在SQL中,可以通过select很方便的完成笛卡尔积
select * from 表1, 表2;
创建两个表:
笛卡尔积:
上述结果中,存在一部分无效数据,也就是不符合客观情况,例如第二条数据。这是由于笛卡尔积是全排列的过程,会枚举出所有可能的情况,自然会产生一些不符合实际情况的数据。
去掉无效数据:只需要两列的classId相等即可,注意条件不能写classId = classId,它是分不清哪个是哪个的classId,只需显示加上表名即可。这种专门来筛选出有效数据的条件也称为"连接条件"
联合查询具体使用:
首先我们先初始化一些数据,方便后续查询
所创建表结构如下:
接下来我们插入一些数据:
插入数据后表结构如下:
上述4张表,有3个实体:学生,班级,课程,score为学生和课程的关联表,顺带上分数。
接下来进行我们的查询操作
🏀内连接
内连接也称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据。也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表行,必须满足ON子句中的搜索条件。作为对照,如果在源表中的行在另一表中没有对应(相关)的行,则该行就被过滤掉,不会包括在结果表中。内连接使用比较运算符来完成。
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
案例:
- 查询'许仙"同学的成绩
写法一:
确定信息来自哪张表,在进行笛卡尔积
指定连接条件(由某个列在两个表中同时存在),去掉无效数据
只显示"许仙"同学的成绩
写法二:join on
- 查询所有同学的总成绩,及同学的个人信息(学生名字)
求总成绩是行和行之间的运算,需要使用聚合函数,且要针对学号/名字进行分组,再求和。
针对学生表和分数表进行笛卡尔积
指定连接条件
按照学生/姓名进行分组,求和
- 查询所有同学的名字,课程的名字,以及课程的成绩
此时就涉及到三张表的联合查询。
方法一:
对学生表,课程表,分数表进行笛卡尔积
指定连接条件,三个表需要两个连接条件
不需要补充其他条件,只需显示出所需要的
方法二:使用join on
🏀外连接
外连接和内连接一样,都是基于笛卡尔积的方式来计算的,但是对于空值/不存在的值处理的方式有区别!
创建一个数据库:
上述这两个表是"一对一"的关系,学生名字和分数都是通过id关联起来的,任何一个学生数据,都是能够在分数表中找到分数结果,任何一个分数结果,都是能够在学生表中找到名字信息。
在数据"一一对应"的情况下,进行内连接和外连接结果都是一样的。
内连接:
外连接只能使用join on的方式来写,可以给join 前头加上left/right关键字,为"左外连接"和"右外连接"
左外连接:
右外连接:
针对上述数据进行调整,使其不在"一一对应"
修该:
内连接:
左外连接:以左侧的表为基准(student join score,student为左侧表),保证左侧表每个数据一定会存在,左侧表数据在右侧表中不存在的部分(列),会使用NULL
右外连接:以右侧表为基准
以集合的角度来看待几种连接:
🏀自连接
同一个表,自己和自己计算笛卡尔积(自连接很少见到,属于处理特定问题的特殊技巧)
还是使用上述4张表(学生,班级,课程,分数)
- 显示所有同一学生计算机原理成绩比Java成绩高的成绩信息
查看课程表和分数表之后,发现一个问题,score表在表示不同科目分数的时候,是通过不同的行来表示的,而前面进行各种的条件的查询,都是基于列和列之间进行比较,无法直接对行和行进行比较,注聚合查询是针对行和行之间的计算,而并非比较!!
需要把行之间的关系转为列之间的关系(自连接就可以完成这样的操作)
指定连接条件,精简一下:
指定连接条件,只显示左侧表课程id为3,右侧表课程id为1的数据:
显示计算机原理大于Java的成绩:
小结:可以把行之间的关系转为列之间的关系,但是自连接为了转换成上述列之间的关系,产生的大部分中间结果都是不必要的,对于体积比较大的表,自连接操作要慎用
🏀子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询(实际开发中,更要慎重使用)
- 单行子查询:返回一行记录的子查询
案例:查询与“不想毕业” 同学的同班同学(还是上述4张表)
正常查询:
子查询:第一条sql语句写到第二条sql的条件中
- 多行子查询:返回多行记录的子查询
案例为:查询“语文”或“英文”课程的成绩信息
使用[NOT] IN关键字:
🏀合并查询
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL时,前后查询的结果集中,字段需要一致。
- union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
案例:查询id小于3,或者名字为“英文”的课程:
- union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
案例如下:
查询id小于3,或者名字为“Java”的课程
🌲MySQL增删改查总结
- 数据库约束
- 表的关系
- 一对一:
- 一对多:
- 多对多:需要创建中间表来映射两张表的关系
- 新增
INSERT INTO table_name [(column [, column ...])] SELECT ...
- 查询
聚合函数:MAX、MIN、AVG、COUNT、SUM
select ... from 表1,表2 where 条件
-- inner可以缺省
select ... from 表1 join 表2 on 条件 where 其他条件
分组查询:GROUP BY… HAVING …
select ... from 表1 left/right join 表2 on 条件 where 其他条件
内连接
select ... from 表1,表2 where 条件
-- inner可以缺省
select ... from 表1 join 表2 on 条件 where 其他条件
外连接:
select ... from 表1,表1 where 条件
select ... from 表1 join 表1 on 条件
子查询:
-- 单行子查询
select ... from 表1 where 字段1 = (select ... from ...);-- [NOT] IN
select ... from 表1 where 字段1 in (select ... from ...);-- [NOT] EXISTS
select ... from 表1 where exists (select ... from ... where 条件);-- 临时表:form子句中的子查询
select ... from 表1, (select ... from ...) as tmp where 条件
合并查询
-- UNION:去除重复数据
select ... from ... where 条件
union
select ... from ... where 条件-- UNION ALL:不去重
select ... from ... where 条件
union all
select ... from ... where 条件-- 使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致
SQL查询中各个关键字的执行先后顺序: from > on> join > where > group by > with > having >select > distinct > order by > limit
相关文章:

【MySQL】增删改查-进阶(二)
目录 🌴新增 🎄查询 🚩聚合查询 🏀聚合函数 🏀group by子句 🏀HAVING 🚩联合查询 🏀内连接 🏀外连接 🏀自连接 🏀子查询 🏀…...

cefsharp79.1.360(Chromium 79.0.3945.130)支持H264视频播放-PDF预览 老版本回顾系列体验
一、关于此版本 版本:Cef 79.1.36/CefSharp 79.1.360/Chromium 79.0.3945.130/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 运行环境需要 visual c++ 2015不支持xp/vista/2003/2008默认不支持h264(版权问题)支持打印预览 print preview已知问题…...

【Linux】main函数的参数列表从何而来?
Linux系统进程通过exec系列函数启动新程序时,argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数,显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中,main函数的标准参数列表通常如下所示: in…...
缓冲区类QBuffer
1、QBuffer继承自QIODevice 2、是一种随机设备 3、和QFile类似, 4、有了 QBuffer,你可以把 QByteArray 当成文件一样来操作 其主要作用就是像QFile操作文件一样来操作一块QByteArray(内存区域),比如读和写 常用方…...

从一个事故中理解 Redis(几乎)所有知识点
作者:看破 一、简单回顾 事故回溯总结一句话: (1)因为大 KEY 调用量,随着白天自然流量趋势增长而增长,最终在业务高峰最高点期占满带宽使用 100%。   (2ÿ…...

MySQL程序介绍<二>
目录 mysqlcheck - 表维护程序 Mysqldump - 数据库备份程序 mysqladmin - MySQL 服务器管理程序 mysqlshow - 显⽰数据库、表和列信息 mysqldumpslow - 总结慢查询⽇志⽂件 编辑 mysqlbinlog - 处理⼆进制⽇志⽂件 mysqlslap - 负载仿真客⼾端 接着上篇继续介绍MySQL…...

Java项目实战II基于Spring Boot的毕业就业信息管理系统设计与实现(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着高校扩…...
LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目
题目: 给你一个整数数组 arr 和两个整数 k 和 threshold 。 请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。 思路:定长滑动窗口 入 更新 出 代码: class Solution {public int numOfSubarrays(int[] arr, int k, int t…...

【电商项目】1分布式基础篇
1 项目简介 1.2 项目架构图 1.2.1 项目微服务架构图 1.2.2 微服务划分图 2 分布式基础概念 3 Linux系统环境搭建 查看网络IP和网关 linux网络环境配置 补充P123(修改linux网络设置&开启root密码访问) 设置主机名和hosts映射 主机名解析过程分析&…...
PHP嵌套函数
PHP嵌套函数(Nested Functions)在标准的PHP语法中并不直接支持,也就是说,你不能在一个函数内部直接定义另一个函数。然而,可以通过闭包(Closures)和匿名函数(Anonymous Functions&am…...

外包干了2个月,技术明显退步
回望过去,我是一名普通的本科生,于2019年通过校招有幸加入了南京某知名软件公司。那时的我,满怀着对未来的憧憬和热情,投入到了功能测试的岗位中。日复一日,年复一年,转眼间,我已经在这个岗位上…...

kaptcha依赖maven无法拉取的问题
老依赖了,就是无法拉取,也不知道为什么,就是用maven一直拉去不成功,还以为是魔法的原因,试了好久发现不是,只好在百度寻求帮助了,好在寻找到了这位大佬的文章Maven - 解决无法安装 Kaptcha 依赖…...
48.旋转图像
秋招未止脚步不止,大厂,我一定要上大厂! 题目链接 . - 力扣(LeetCode) 自己的思路 感觉好难,想不出来. 噫噫噫,我想着想着又想出来了。 //发现规律了,先左右对称, 再…...
每天5分钟玩转C#/.NET之goto跳转语句
前言 在我们日常工作中常用的C#跳转语句有break、continue、return,但是还有一个C#跳转语句很多同学可能都比较的陌生就是goto,今天大姚带大家一起来认识一下goto语句及其它的优缺点。 goto语句介绍 goto 语句由关键字 goto 后跟一个标签名称组成&…...
Java处理大数据小技巧:深入探讨与实践
引言 一、选择合适的数据结构 1. 使用高效的集合 2. 并发安全的数据结构 二、内存管理 1. JVM参数调优 2. 避免内存泄漏 三、并行计算与分布式处理 1. 利用Java并发API 2. 分布式框架 四、数据压缩与序列化 1. 数据压缩 2. 高效序列化 五、外部存储与缓存 1. NoS…...
我开源了Go语言连接数据库和一键生成结构体的包【实用】
项目地址:https://gitee.com/zht639/my_gopkg autosql autosql 是一个简化数据库使用的模块,支持常见的数据库(MySQL、PostgreSQL、SQLite、SQL Server)。该模块不仅提供了数据库连接函数,还能自动生成数据表对应的结…...

Sentinel 快速入门
前置推荐阅读:Sentinel 介绍-CSDN博客 前置推荐阅读:Nacos快速入门-CSDN博客 快速开始 欢迎来到 Sentinel 的世界!这篇新手指南将指引您快速入门 Sentinel。 Sentinel 的使用可以分为两个部分: 核心库(Java 客户端):…...

基于SpringBoot健康生活助手微信小程序【附源码】
基于SpringBoot健康生活助手微信小程序 效果如下: 管理员登录界面 管理员主界面 用户管理界面 健康记录管理界面 健康目标管理界面 微信小程序首页界面 活动信息界面 留言反馈界面 研究背景 近年来,由于计算机技术和互联网技术的飞速发展,…...

功能安全实战系列-软件FEMA分析与组件鉴定
本文框架 前言1. 功能安全分析1.1 Why1.2 What?1.3 How?1.3.1 分析范围确定1.3.2 失效模式分析1.3.3 安全措施制定1.3.4 确认是否满足功能安全目标2. 软件组件鉴定2.1 Why2.2 How?前言 在本系列笔者将结合工作中对功能安全实战部分的开发经验进一步介绍常用,包括Memory(Fl…...

【数据结构与算法】链表(上)
记录自己所学,无详细讲解 无头单链表实现 1.项目目录文件 2.头文件 Slist.h #include <stdio.h> #include <assert.h> #include <stdlib.h> struct Slist {int data;struct Slist* next; }; typedef struct Slist Slist; //初始化 void SlistI…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...