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 小时前
常用 MySQL 分库分表方案详解
数据库·mysql
kingx32 小时前
Windows Server 2008 应急加固实战:7 项入侵痕迹排查与修复
数据库·windows·提权·应急响应·加固
xiaogai_gai3 小时前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉
AlickLbc4 小时前
DM-V8数据库证书过期处理过程记录
数据库
l1t4 小时前
DeepSeek总结的五分钟测试:Ted Dunning 谈 DuckDB 为何让分析更轻松
数据库·sql·duckdb
超级新零售4 小时前
零售 SaaS 与本地部署,技术责任边界究竟怎么分?
数据库·零售
考虑考虑4 小时前
瀚高数据库
数据库·后端·postgresql
dishugj5 小时前
oracle日志切换三条命令区别
数据库
Patrick在香港5 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
悟道书生5 小时前
(一)Navicate为什么转存结构和数据只转存表而不包含建库?
数据库·oracle