MySQL表的高级增删改查

news2024/12/24 8:55:18

在这里插入图片描述

文章目录

  • 一、聚合查询
  • 二、分组查询
  • 三、联合查询
    • 内连接
    • 外连接
    • 自连接
  • 四、合并查询
  • 五、子查询

一、聚合查询

聚合查询是针对行与行之间的计算,常见的聚合函数有:

函数作用
COUNT(expr)查询数据的数量
SUM(expr)查询数据的总和
AVG(expr)查询数据的平均值
MAX(expr)查询数据的最大值
MIN(expr)查询数据的最小值
create table stu(id int primary key,name varchar(50),math int,english int);
insert into stu values
(001,"张三",80,90),
(002,"李四",75,80),
(003,"王五",85,90),
(004,"小王",90,80),
(005,"小孙",null,null);

count函数:
顾名思义,count函数就是用来统计我们表的行数的。
在这里插入图片描述
但注意的是,我们再给count函数传参数时,这一列不能有null值。
在这里插入图片描述
我们发现当传入math参数时,因为math有一行的数据是null,count函数在统计时,自动省略这一行。
在这里插入图片描述
当然我们还可以传入全列,count传入全列时,只要这一列有不为null的值就会被统计上,但时间会相对增大,一般建议传入主键或者not null的列。
SUM函数:
用来计算某一列数值的综合,null自动省略。
在这里插入图片描述
也可以进行表达式进行聚合计算。
在这里插入图片描述
AVG函数:
avg函数对某一列求平均值,我们可以发现计算平均值是,null既不计入分子也不计入分母。
在这里插入图片描述
MAX函数:
求某一列的最大值
在这里插入图片描述
MIN函数:
求某一列的最小值
在这里插入图片描述

二、分组查询

有时候单纯使用聚合查询没啥意思,我们需要先分组在进行聚合计算。

create table stu(id int,name varchar(20),class varchar(20),math int,english int);
insert into stu values(001,"张三","计算机1班",80,95),
                      (002,"李四","计算机1班",90,76),
                      (003,"王五","计算机2班",86,77),
                      (004,"小王","计算机2班",92,86),
                      (005,"张良","计算机2班",86,96);

在这里插入图片描述
我们来计算平均数学成绩
在这里插入图片描述
这样的平均成绩没啥意思,我们来求一下每个班的数学平均成绩

select class,avg(math) from stu group by class;

在这里插入图片描述
我们在来求一下,每班的数学最高分。

select name,class,max(math) from stu group by class;

在这里插入图片描述
分组查询,也可以指定条件
1.分组之前指定条件,先筛选在分组,WHERE
2.分组之后指定条件,先分组在筛选, HAVING
3.分组之前和分组之后都指定条件,WHERE HAVING都使用。

分组之前: 查询每个班的平均数学成绩,但是去掉小王的成绩

select class,avg(math) from stu where name != '小王' group by class;

在这里插入图片描述
分组之后: 查询每个班级的平均数学成绩,但去除平均成绩为85的班级。

select class,avg(math) from stu group by class having avg(math) != 85;

在这里插入图片描述
分组之前和分组之后都指定条件: 查询班级的平均成绩,去掉小王的成绩,并且去除计算机1班的平均数学成绩

select class,avg(math) from stu where name != '小王' group by class having class != '计算机1班';

在这里插入图片描述

三、联合查询

当我们多张表建立联系时,我们就可以进行联合查询,多表查询就是对多张表取笛卡尔积。
在这里插入图片描述
笛卡尔的结果列数是两张表列数之和,行数是两张表的行数之积.

create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));

create table student (id int primary key auto_increment, sn varchar(20),  name varchar(20), qq_mail varchar(20) ,
        classes_id int);

create table course(id int primary key auto_increment, name varchar(20));

create table score(score decimal(3, 1), student_id int, course_id int);
select * from student,classes

在这里插入图片描述

大家轻易可以发现,笛卡尔积里的结果很多都是无效的数据,因此我们需要将一部分无意义的数据给去掉。
在这里插入图片描述
我们通过这两个变量来建立关系,多表查询时,我们访问表中的变量时用表名点(.)变量表示。

 select * from student,classes where classes.id = student.classes_id;

在这里插入图片描述
在这里插入图片描述
当我们加上条件(这个条件我们成为连接条件)之后,剩下的都是“正确"的数据.
我们也可以指定列查询。

 select student.id,student.name,student.classes_id,classes.name from student,classes where classes.id = student.classes_id;

在这里插入图片描述

内连接

我们现在构造了四张表出来,student(学生表),classes(班级表),course(课程表),score(分数表).
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们查询一下白素贞的班级:
我们在进行联合查询的时候,不必急于求成,一步一步进行。

-- 1.先计算笛卡尔积
select * from student,classes;

在这里插入图片描述

-- 2.引入连接条件
select * from student,classes where classes.id = student.classes_id;

在这里插入图片描述

-- 3.引入名字为白素贞的条件
select * from student,classes where classes.id = student.classes_id and student.name = '白素贞';

在这里插入图片描述

-- 4.只保留必要的列
 select student.name,classes.name from student,classes where classes.id = student.classes_id and student.name = ' 白素贞';

在这里插入图片描述
联合查询也可以用join来完成:

 select student.name,classes.name from student join classes on classes.id = student.classes_id and student.name = '白素贞';

在这里插入图片描述
内连接还可以使用inner join完成。

 select student.name,classes.name from student inner join classes on classes.id = student.classes_id and student.name = '白素贞';

在这里插入图片描述
我们还可以进行多张表进行联合查询。
在这里插入图片描述

select * from student,score,course where student.id = score.student_id and course.id = score.course_id;

在这里插入图片描述
我们可以省略部分列,使用别名,join来查询

select student.name as 学生姓名,course.name as 课程名称,score.score as 分数 from student join score on student.id = score.student_id join course on score.course_id = course.id;

在这里插入图片描述

外连接

内连接和外连接在一些情况下,查询的结果没有差异(当两个表一一对应时),如果没有一一对应那么就有区别了。
在这里插入图片描述
在这里插入图片描述
我们可以用这两张表,建立一下内外连接看一下效果。

-- 内连接
select * from student join score on student.id = score.student_id;

在这里插入图片描述

-- 外连接
 select * from student left join score on student.id = score.student_id;

在这里插入图片描述
我们可以发现内外连接查询的结果是一样的。因为我们两个表的内容是一一对应的。
在这里插入图片描述
这时我们发现student表id为6的数据在score无对应

在这里插入图片描述
在这里插入图片描述
这时我们发现,内外查询的结果就有所差异了。
外连接:
当进行外连接时,如果是左连接,会把左表所有的数据查询到总结果中,如果右表没有对应数据,就是用NULL补充(右连接同理)。

自连接

SQL中无法对行和行之间使用条件比较,当我们要进行行行运算时,我们可以使用自连接进行调整。
在这里插入图片描述
在这里插入图片描述
我们想查询那个同学的java成绩比英文成绩高。
在这里插入图片描述
我们可以发现至今将表明写两遍,会报一个表名不唯一的错误。正确的做法是为表名起别名。
在这里插入图片描述
这里我们是自己和自己比,所以我们加上student_id相等的条件
在这里插入图片描述
在这里插入图片描述
然后对score1的科目进行限制为java,score2的科目限制为英文

select * from score as score1,score as score2 where score1.student_id = score2.student_id and score1.course_id = 1 and score2.course_id = 6;

在这里插入图片描述
我们发现只有两名学生即选择了java,又选择了英文。
我们再加上java比英文高的条件。

select * from score as score1,score as score2 where score1.student_id = score2.student_id and score1.course_id = 1 and score2.course_id = 6 and score1.score > score2.score;

在这里插入图片描述
我们发现没有java比英文高的数据
在这里插入图片描述
所以我们查出来的是空集合。

四、合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。
在这里插入图片描述

-- union
 select * from course where id < 4 union select * from course where name != 'java';

在这里插入图片描述

-- union all
 select * from course where id < 4 union all select * from course where name != 'java';

在这里插入图片描述
这里我们可以发现union可以去掉重复数据,而union all不去重。
大家需要注意or 与 union的区别,or的查询只能针对同一个表,而union可以来自于多张表,只要查询的结果能够对应列即可。

五、子查询

子查询最本质就是套娃,将多个SQL组合起来。
实际开发中,子查询的使用要小心(子查询会构造出来一些非常复杂并且不好理解的SQL,对于代码的可读性,执行效率都有可能造成很大的影响。
查询许仙的同班同学
在这里插入图片描述
正常思路,先去查询许仙的班级号,再去按照班级号去查那些同学和他一个班

select classes_id from student where name = '许仙';

在这里插入图片描述

select name from student where classes_id = 1 and name != '许仙';

在这里插入图片描述
子查询:

select name from student where classes_id = (select classes_id from student where name = '许仙') and name != '许 仙';

在这里插入图片描述
子查询返回一条记录,才可以写等号
在这里插入图片描述
查询java或者英文课的成绩信息
先查询java或者英文课的课程号,再根据课程号去查询课程分数

 select id from course where name = 'java' or name = '英文';

在这里插入图片描述

select * from score where course_id = 1 or course_id = 6;

在这里插入图片描述
子查询:

 select * from score where course_id in (select id from course where name = 'java' or name = '英文');

在这里插入图片描述
在这里插入图片描述
EXISTS关键字: 可读性比较差,效率也大大的比in低,适用于解决特殊情况

还是更推荐大家分步查询。

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

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

相关文章

ES6 入门教程 18 Iterator 和 for...of 循环 18.1 Iterator(遍历器)的概念

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程18 Iterator 和 for...of 循环18.1 Iterator&#xff08;遍历器&#xff09;的概念18 Iterator 和 for…of 循环 18.1 Iter…

zk中watcher机制(重补早期学习记录)

前言:补学习记录,几年前写一半丢草稿箱,突然看到,有强迫症所以补完 一、理解watcher机制 二、父节点watcher事件 连接zk客户端 ./zkCli.sh 使用help查看命令 父节点使用,stat或者get创建自己的watch事件 stat 路径 watch get 路径 watch 我们给一个不存在的节点设置一个w…

这次把怎么做好一个PPT讲清-动画篇

干货预警&#xff01; 作为一位PPT发烧友看过诸多PPT案例&#xff0c;分享几个高大上的动画效果。文末有福利&#xff01; 废话不多说&#xff0c;直接上重点&#xff0c;本文主要讲八个动画技巧&#xff0c;我们来看先目录&#xff1a; 收藏是点赞的六倍&#xff0c;各位看官…

统计学习、机器学习以及python的学习顺序是什么

前言 我是非科班出身成功转行算法的&#xff0c;我来说下我的学习路线是怎样的。&#xff08;文末送读者福利&#xff09; 1、看书学原理&#xff1a;我因为没买周志华老师的西瓜书&#xff0c;只看过李航老师的小蓝书&#xff0c;我第一遍看统计学习 方法的时候非常痛苦全是…

Monaco Editor教程(十七):代码信息指示器CodeLens配置详解

背景 有时候我们在使用VS Code编辑一个文件时 会看到这样的效果 在上述的图片中&#xff0c;1720行和1721行之间&#xff0c;有一行不属于该文件本身内容的注释。这一效果能够方便开发者快速地理解代码&#xff0c;看到代码的提交人&#xff0c;时间&#xff0c;可能还会有备…

C语言:一维数组的创建、初始化

一、一维数组的创建 数组的定义&#xff1a;在C语言中有各种数据类型&#xff0c;而每一种数据类型都有相对应的数据元素&#xff0c;这些元素可以组成一个团体&#xff0c;一个集合&#xff0c;从而有了数组概念。 数组也有三要素&#xff1a;数组元素类型&#xff0c; …

双链笔记Logseq的安装指南

便民服务还是挺方便的&#xff0c;不用出小区就可以做了 本文完成于 10 月初&#xff0c;撰写时 Logseq 的版本为 v0.8.8&#xff0c;发布时的最新版本是 v0.8.11 什么是 Logseq &#xff1f; Logseq 是一个本地优先的非线性大纲笔记本&#xff0c;用于组织和共享您的个人知识库…

Win11电脑如何设置自动开机(Windows 11 2022H2)

Win11电脑如何设置自动开机 ​ 文章目录1、最先右键选择“此电脑”&#xff0c;点一下“管理”。2、随后寻找系统工具里的“任务方案程序”。3、再点一下右边的“创建基本任务”。4、名字中输入“自动开机”。5、随后选择自动开机的次数。6、然后设置我们应该自动开机的实际时间…

并发编程之Executor线程池原理与源码解读

线程 线程是调度CPU资源的最小单位&#xff0c;线程模型分为KLT模型与ULT模型&#xff0c;JVM使用的KLT模 型&#xff0c;Java线程与OS线程保持1:1的映射关系&#xff0c;也就是说有一个java线程也会在操作系统里有一个对应的线程。Java线程有多种生命状态 NEW,新建 RUNNABLE,运…

分布式架构演进过程

分布式的前提&#xff0c;我们得有多台服务器&#xff0c;那么我们需要知道世界上第一台计算机的由来&#xff0c;而第一台计算机的参考模型就是冯诺依曼模型&#xff0c;为此奠定了所有的分布式都在围绕着这个模型里面的某一块或者相互之间模块进行打交道。 搞分布式又有什么意…

【计算机毕业设计】7.健身俱乐部会籍管理系统+vue

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的…

关于clickhouse单节点部署

因为公司网络问题&#xff0c;下载clickhouse无法使用命令下载&#xff0c;所以用压缩包进行下载安装。 首先在其官网下载下载安装包 https://packages.clickhouse.com/tgz/stable/ 一共要下载四个包 clickhouse-client clickhouse-common-static clickhouse-common-static-d…

miRNA 在基因调控中的作用

MicroRNA (miRNA) 是什么&#xff1f;“micro”“mi”是微小的意思&#xff0c;顾名思义&#xff0c;miRNA 就是小的非编码 RNA&#xff0c;长度约 23 个核苷酸 (nt)&#xff0c;它在转录后的基因调控中发挥关键作用&#xff0c;包括疾病的发生、细胞分化与组织发育&#xff0c…

山东大学线性代数-1-矩阵-2

目录 1.9 初等矩阵 1.9.1 初等矩阵的定义 1.9.2 初等矩阵的性质 1.9.3 初等矩阵与初等变换的关系 1.9.4 满秩矩阵的四种等价表述 1.10 逆矩阵的定义及可逆条件 1.10.1 逆矩阵的定义 1.10.2 矩阵可逆的条件 1.10.3 二阶可逆矩阵的逆矩阵求法 1.11 逆矩阵的求法&#x…

Apollo 应用与源码分析:Apollo工程概述与AUTOSAR架构

目录 Apollo 工程概述 目录结构 软件架构 硬件架构 AUTOSAR架构 Apollo 概述 目录结构 |-cyber 消息中间件&#xff0c;替换ros作为消息层 |-docker 容器相关 |-docs 文档相关 |-modules 自动驾驶模块&#xff0c;主要的定位&#xff0c;预测&#xff0c;感知&#xf…

【Java进阶篇】第四章 异常处理

文章目录1、异常2、类Throwable3、运行时异常和编译时异常4、异常的处理5、异常导致某些代码不能被执行6、try...catch总结7、异常对象的常用方法8、try...catch和finally9、final、finally和finalize的整理区分10、如何自定义异常11、异常在实际开发中的作用12、异常与方法覆盖…

带联网功能的RFID宿舍门禁(六)-两年后的再次总结

文章首发及后续更新&#xff1a;https://mwhls.top/4066.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 带联网功能的RFID宿舍门禁 两年后又来了次总结&#xff0c…

聚观早报|中国制造成世界杯交通主力;特斯拉拟召回32万辆车

今日要闻&#xff1a;中国制造成世界杯交通主力&#xff1b;特斯拉拟召回32万辆车&#xff1b;iPhone14pro发货或延期至2023年&#xff1b;Tik Tok逆势宣布招聘&#xff1b;世界杯部署2.2万电子眼中国制造成世界杯交通主力 据消息&#xff0c;来自中国的新能源客车成了服务本届…

美国、欧洲、中国关于工业互联网的比较分析

工业革命的发展历史 1.0•机械化•大规模 2.0•电气化•自动化 3.0•信息化•产品标准 4.0•网络化•定制 3.0相当于肯德基麦当劳门店全部机械化&#xff0c;全程过程控制&#xff0c;任何一批不合格的产品&#xff0c;都可以追溯到上游任何一个环节 4.0全部设备通过中央控…

【C++笔试强训】第二十九天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6;&a…