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

【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增删改查总结

  • 数据库约束

  • 表的关系
  1. 一对一:
  2. 一对多:
  3. 多对多:需要创建中间表来映射两张表的关系
  • 新增

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 🚩联合查询 🏀内连接 🏀外连接 🏀自连接 🏀子查询 &#x1f3c0…...

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&#xff…...

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 客户端)&#xff1a…...

基于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…...

【数据结构与算法】链表(上)

记录自己所学&#xff0c;无详细讲解 无头单链表实现 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…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...