当前位置: 首页 > 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…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...