MySQL【基本查询下 - 表的增删改查】

一、Update

语法:

核心注意事项

  1. 必须加 WHERE 子句 :若无 WHERE,会更新全表数据,生产环境慎用!
  2. 支持同时更新多列,列之间用逗号分隔;
  3. 支持基于原有值更新(如math = math + 30,不支持math +=30语法;
  4. 可搭配 ORDER BY、LIMIT 实现精准更新指定条数的数据。

对查询结果进行列值更新

1.1 将孙悟空同学的数据成绩变更为80分

1.2 将曹孟德同学的数学成绩变更为60分,语文成绩变更为70分

1.3 将总成绩倒数前三的3位同学的数学成绩加上30分

1.4 将所有同学的语文成绩更新为原来的2倍

没有where 子句 ,则更新全表 !!!

二、Delete

删除表中的数据,分为删除指定数据删除全表数据。

2.1 删除数据

语法:

2.1.1 删除孙悟空同学的考试成绩

必须加 WHERE 子句,否则会删除全表数据,示例:

2.1.2 删除整张表的数据

注意:删除整表操作要慎用!

自增序列的计数器并不会置零~

2.2 截断表

语法:

注意:这个操作慎用!!

  • 只能对整张操作 , 不能像delete 一样针对部分数据操作
  • 实际上Mysql不对数据操作 , 所以比delete更快 , 但是truncate在删除数据的时候,并不经过真正的事务,所以无法回归
  • 会重置auto_increment项~
操作 语法 特点 自增列 事务回滚
DELETE DELETE FROM 表名 逐行删除,会记录日志 保留原有自增值,新插入从原最大值继续 支持(InnoDB)
TRUNCATE TRUNCATE [TABLE] 表名 直接清空表,不记录行日志,速度更快 重置自增列为 1,重新开始 不支持

三、插入查询结果

插入查询结果聚合函数,实现数据的批量处理与统计分析。

语法:

经典场景:删除表中的重复数据,只保留一份。

为什么最后是通过rename 方式进行?

就是单纯的想等一些都就绪了,然后统一放入、更新、生效

四、聚合函数

聚合函数用于对一组数据进行统计计算,返回单个结果,是数据分析的基础,常用聚合函数如下:

函数 说明 注意
COUNT([DISTINCT] expr) 统计数据条数 COUNT (*) 不受 NULL 影响,COUNT (列) 会忽略 NULL
SUM([DISTINCT] expr) 统计数据总和 非数字类型无意义
AVG([DISTINCT] expr) 统计平均值 非数字类型无意义,忽略 NULL
MAX([DISTINCT] expr) 统计最大值 忽略 NULL
MIN([DISTINCT] expr) 统计最小值 忽略 NULL
复制代码
-- 1. 统计学生总数(COUNT(*))
SELECT COUNT(*) FROM students;
-- 2. 统计有QQ号的学生数(COUNT(列)忽略NULL)
SELECT COUNT(qq) FROM students;
-- 3. 统计数学成绩总分、平均分
SELECT SUM(math), AVG(math) FROM exam_result;
-- 4. 统计英语最高分、70分以上的数学最低分
SELECT MAX(english), MIN(math) FROM exam_result WHERE math > 70;
-- 5. 统计去重后的数学成绩个数
SELECT COUNT(DISTINCT math) FROM exam_result;

4.1 统计班级有多少同学

4.2 统计班级收集的qq号有多少

4.3 统计本次考试的数学成绩分数个数

4.4 统计数学成绩总分

4.5 统计平均总分

4.6 返回英语最高分

4.7 返回>70分以上的数学最低分

五、group by 子句的使用

聚合函数通常与GROUP BY搭配 使用,实现按指定列分组统计,核心语法:

核心规则

  1. GROUP BY 后可跟多列,按多列组合分组;
  2. 需对分组结果再筛选时,使用HAVING(而非 WHERE),HAVING 支持聚合函数 / 别名;
  3. WHERE 筛选原始数据 ,HAVING 筛选分组后的数据
复制代码
-- 1. 按部门分组,统计每个部门的平均工资、最高工资
SELECT deptno, AVG(sal), MAX(sal) FROM EMP GROUP BY deptno;
-- 2. 按部门+岗位分组,统计每个部门每个岗位的平均工资、最低工资
SELECT deptno, job, AVG(sal), MIN(sal) FROM EMP GROUP BY deptno, job;
-- 3. 统计平均工资低于2000的部门(HAVING筛选分组结果)
SELECT deptno, AVG(sal) myavg FROM EMP GROUP BY deptno HAVING myavg < 2000;
  • 如何显示每个部门的平均工资和最高工资:
  • 显示每个部门的每种岗位的平均工资和最低工资
  • 显示平均工资低于2000的部门和它的平均工资
    • 先统计各个部门的平均工资【结果先聚合出来】
  • 对聚合的结果进行判断 【having和group by配合使用,对group by 的结果进行过滤

having经常和group by搭配使用,作用是对分组进行筛选,作用有些像****where。

HAVING 和 WHERE :

特性 WHERE HAVING
筛选时机 分组(GROUP BY)之前 分组(GROUP BY)之后
筛选对象 原始的、未分组的单行数据 分组后的「统计结果」(组级数据)
能否用聚合函数 ❌ 不可以(操作的是单行数据) ✅ 可以(操作的是分组统计结果)
适用场景 过滤单个符合条件的记录 过滤符合条件的分组

WHERE 是「分组前」筛选单行数据(不能用聚合函数),HAVING 是「分组后」筛选分组结果(可以用聚合函数);

通俗举例:假设你要统计「每个班级数学平均分超过 80 分的班级」:

  • WHERE:先筛选「数学分数 > 0 分的学生」(排除无效数据),这是对单个学生的筛选;
  • HAVING:在按班级分组计算平均分后,筛选「平均分 > 80 分的班级」,这是对整个班级的筛选。
  • 不要单纯的认为,只有磁盘上表结构导入到mysql , 真实存在的表才叫表,这是不对的
  • 中间筛选出来的,包括最终结果,在我看来,全部都是逻辑上的表 !!!
  • ''MYSQL一切皆表'',未来只要我们能够处理好单表的CURD,所有sql场景,我们也可以用同一种方式进行~
相关推荐
..过云雨2 小时前
【负载均衡oj项目】02. comm公共文件夹设计 - 包含所有需要用到的自定义工具
数据库·c++·mysql·html·负载均衡
南山love2 小时前
Redis持久化深度解析:RDB与AOF的原理、区别及生产选型
数据库·redis·缓存
楼田莉子2 小时前
MySQL数据库的操作
数据库·mysql
2401_900151542 小时前
用Python和Twilio构建短信通知系统
jvm·数据库·python
qq_5470261792 小时前
RAG 向量数据库
数据库·langchain
昵称只能一个月修改一次。。。2 小时前
SQLite
数据库
身如柳絮随风扬2 小时前
MySQL为什么使用B+树?
数据库·b树·mysql
短剑重铸之日2 小时前
《ShardingSphere解读》04 配置驱动:ShardingSphere 中的配置体系是如何设计的?
java·数据库·后端·spring·shardingsphere
胡斌附体2 小时前
MySQL 在 Docker 环境下连接变慢问题记录
数据库·mysql·docker·连接··本机·外部机器连接