MySQL数据库《基础篇--表的增删改查操作CRUD(3)》

一、Group by 分组查询

GROUP BY ⼦句的作⽤是通过⼀定的规则将⼀个数据集划分成若⼲个⼩的分组,然后针对若⼲个
分组进⾏数据处理,⽐如使⽤聚合函数对分组进⾏统计。

1.1语法

sql 复制代码
SELECT {col_name | expr} ,... ,aggregate_function (aggregate_expr)
 FROM table_references
 GROUP BY {col_name | expr}, ... 
 [HAVING where_condition]

col_name | expr:要查询的列或表达式,可以有多个,必须在 GROUP BY ⼦句中作为分组的依

aggregate_function:聚合函数,⽐如COUNT(), SUM(), AVG(), MAX(), MIN()
aggregate_expr:聚合函数传⼊的列或表达式,如果列或表达式不在 GOURP BY ⼦句中,必须
包含中聚合函数中

1.2示例

准备测试表及数据职员表emp,列分别为:id(编号),name(姓名),role(⻆⾊),salary(薪⽔)

sql 复制代码
 drop table if exists emp;
 create table emp (
     id bigint primary key auto_increment,
     name varchar(20) not null,
     role varchar(20) not null,
     salary decimal(10, 2) not null
 );
 
 insert into emp values (1, '⻢云', '⽼板', 1500000.00);
 insert into emp values (2, '⻢化腾', '⽼板', 1800000.00);
 insert into emp values (3, '张三', '程序员', 10000.00);
 insert into emp values (4, '李四', '程序员', 12000.00);
 insert into emp values (5, '王五', '程序员', 9000.00);
 insert into emp values (6, '赵六', '程序员', 8000.00);
 insert into emp values (7, '孙悟空', '游戏⻆⾊', 956.8);
 insert into emp values (8, '猪悟能', '游戏⻆⾊', 700.5);
 insert into emp values (9, '沙和尚', '游戏⻆⾊', 333.3);
 
select * from emp;


统计每个⻆⾊的⼈数

sql 复制代码
mysql> select role, count(*) from emp group by role;

统计每个⻆⾊的平均⼯资,最⾼⼯资,最低⼯资

sql 复制代码
mysql> select role, ROUND(avg(salary),2) as 平均⼯资, ROUND(max(salary),2) as 最⾼⼯资, ROUND(min(salary),2) as 最低⼯资 from emp group by role;

二、having子句

使用GROUPBY对结果进行分组处理之后,对分组的结果进行过滤时,不能使用WHERE子句,而要使用HAVING 子句

显示平均工资低于1500的角色和它的平均工资

sql 复制代码
mysql> select role, avg(salary) from emp group by role having avg(salary) < 1500;

Having 与Where 的区别

Having ⽤于对分组结果的条件过滤
Where ⽤于对表中真实数据的条件过滤

三、内置函数

3.1⽇期函数

用于处理日期 / 时间类型数据,比如获取当前时间、日期格式化、计算日期差等。

sql 复制代码
-- 1. 获取当前日期/时间
SELECT NOW();        -- 返回当前日期+时间(如:2026-02-25 15:30:20)
SELECT CURDATE();    -- 返回当前日期(如:2026-02-25)
SELECT CURTIME();    -- 返回当前时间(如:15:30:20)

-- 2. 日期格式化(DATE_FORMAT:按指定格式转换日期)
-- 格式符:%Y(4位年)、%m(2位月)、%d(2位日)、%H(24小时)、%i(分)、%s(秒)
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');          -- 2026-02-25
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i'); -- 2026年02月25日 15:30

-- 3. 日期增减(DATE_ADD/DATE_SUB)
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY);     -- 当前日期+7天
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH);   -- 当前日期-1个月

-- 4. 计算日期差(DATEDIFF:结束日期-开始日期,返回天数)
SELECT DATEDIFF('2026-03-01', '2026-02-25');    -- 4(2月25到3月1日差4天)

-- 5. 提取日期部分(YEAR/MONTH/DAY/HOUR)
SELECT YEAR(NOW());   -- 2026(提取年份)
SELECT MONTH(NOW());  -- 2(提取月份)
SELECT DAY(NOW());    -- 25(提取日期)

3.2字符串处理函数

用于处理文本类型数据,比如拼接、截取、替换、大小写转换等。

sql 复制代码
-- 1. 字符串拼接(CONCAT)
SELECT CONCAT('Hello', ' ', 'MySQL');  -- Hello MySQL

-- 2. 字符串截取(SUBSTRING:字符串, 起始位置, 长度)
SELECT SUBSTRING('PythonMySQL', 7, 5); -- MySQL(从第7位开始取5位)

-- 3. 替换字符串(REPLACE)
SELECT REPLACE('abc123abc', 'abc', 'xyz'); -- xyz123xyz

-- 4. 大小写转换
SELECT UPPER('mysql');  -- MYSQL(转大写)
SELECT LOWER('MYSQL');  -- mysql(转小写)

-- 5. 去除空格(TRIM:去除首尾空格;LTRIM:左空格;RTRIM:右空格)
SELECT TRIM('  MySQL  ');  -- MySQL

-- 6. 获取字符串长度(LENGTH:字节长度;CHAR_LENGTH:字符长度)
SELECT LENGTH('MySQL');    -- 5(英文占1字节)
SELECT LENGTH('数据库');   -- 9(UTF8下中文占3字节)
SELECT CHAR_LENGTH('数据库'); -- 3(字符数)

3.3数学函数

用于数值计算,比如取整、四舍五入、随机数、绝对值等。

sql 复制代码
-- 1. 四舍五入(ROUND:数值, 保留小数位)
SELECT ROUND(3.1415, 2);  -- 3.14
SELECT ROUND(3.5);        -- 4(默认保留0位)

-- 2. 取整(FLOOR向下取整,CEIL向上取整)
SELECT FLOOR(3.9);        -- 3
SELECT CEIL(3.1);         -- 4

-- 3. 绝对值
SELECT ABS(-10.5);        -- 10.5

-- 4. 随机数(RAND():返回0-1之间的随机小数)
SELECT RAND();            -- 如:0.87654321
SELECT FLOOR(RAND()*100); -- 0-99的随机整数

-- 5. 取余(MOD)
SELECT MOD(10, 3);        -- 1(10除以3的余数)

-- 6. 幂运算(POWER)
SELECT POWER(2, 3);       -- 8(2的3次方)

3.4、其他常用函数

这类函数覆盖空值处理、条件判断、聚合计算等高频场景。

sql 复制代码
-- 1. 空值处理(IFNULL:如果值为NULL,替换为指定值)
SELECT IFNULL(NULL, '空值');  -- 空值
SELECT IFNULL('有值', '空值'); -- 有值

-- 2. 条件判断(IF:IF(条件, 满足返回值, 不满足返回值))
SELECT IF(10>5, '成立', '不成立'); -- 成立
SELECT IF(score>=60, '及格', '不及格') FROM student; -- 按分数判断

-- 3. 多条件判断(CASE WHEN)
SELECT 
    CASE 
        WHEN score >= 90 THEN '优秀'
        WHEN score >= 80 THEN '良好'
        WHEN score >= 60 THEN '及格'
        ELSE '不及格'
    END AS 成绩等级
FROM student;

-- 4. 聚合函数(统计用,常配合GROUP BY)
SELECT COUNT(*) FROM student;    -- 统计总行数
SELECT SUM(score) FROM student;  -- 求和
SELECT AVG(score) FROM student;  -- 平均值
SELECT MAX(score) FROM student;  -- 最大值
SELECT MIN(score) FROM student;  -- 最小值

-- 5. 去重(DISTINCT)
SELECT DISTINCT class FROM student; -- 统计不重复的班级

总结

  1. MySQL 内置函数按功能可分为日期、字符串、数学、聚合 / 条件等类别,直接调用即可高效处理数据;
  2. 日期函数核心是 NOW()/CURDATE()(获取时间)、DATE_FORMAT()(格式化)、DATEDIFF()(算差值);
  3. 字符串函数常用 CONCAT()(拼接)、SUBSTRING()(截取)、REPLACE()(替换);
  4. 数学函数重点掌握 ROUND()(四舍五入)、RAND()(随机数);
  5. 空值处理 IFNULL()、条件判断 IF()/CASE WHEN 是业务开发中高频使用的函数。

CRUD总结

相关推荐
Xin_z_1 小时前
数据库连接未释放导致表被锁问题排查与处理
数据库
Flobby5291 小时前
深入理解 MySQL 索引:从 B+ 树到索引下推
数据库·后端·mysql
l1t2 小时前
DeepSeek总结的PostgreSQL 中 DISTINCT 的三种用法
数据库·postgresql
西西学代码2 小时前
Flutter---简单画板应用
服务器·数据库·flutter
一只程序熊2 小时前
uniappx richtext img 图片无法显示
linux·服务器·数据库
麦聪聊数据2 小时前
数据流通的最后一公里:SQL2API 在企业数据市场中的履约架构实践
数据库·sql·低代码·微服务·架构
Anastasiozzzz10 小时前
MySQL深分页问题与优化思路
数据库·mysql
伯明翰java10 小时前
数据库的操作
数据库
知识分享小能手14 小时前
PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 语法知识点与案例详解(1)
数据库·学习·postgresql