在 MySQL 的日常使用和开发中,会用到丰富多样的函数来满足不同场景

在 MySQL 的日常使用和开发中,会用到丰富多样的函数来满足不同场景的数据处理需求,以下从常用的类别详细介绍一些典型函数:

一、字符串函数

1. CONCAT()
  • 功能:用于连接两个或多个字符串。
  • 示例
SELECT CONCAT('Hello', ' ', 'World') AS result;
-- 结果为 "Hello World"
  • 应用场景:比如在用户信息查询中,把用户的姓和名拼接成完整姓名,SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users; ,常用于生成报表、展示完整信息等场景。
2. SUBSTRING()
  • 功能:截取字符串的一部分,需指定起始位置和截取长度(可选 )。语法有 SUBSTRING(str, pos) (从 pos 位置开始截取到末尾 )、SUBSTRING(str, pos, len) (从 pos 位置开始截取 len 长度 ),注意 pos 从 1 开始计数 。
  • 示例
SELECT SUBSTRING('MySQL is great', 1, 5) AS sub_result;
-- 结果为 "MySQL",从第 1 个字符开始截取 5 个字符
SELECT SUBSTRING('MySQL is great', 7) AS sub_result;
-- 结果为 "is great",从第 7 个字符开始截取到末尾
  • 应用场景:处理文本内容时提取关键部分,如从日志信息里截取特定标识段,SELECT SUBSTRING(log_content, 10, 20) AS key_info FROM logs; ,用于分析日志关键内容。
3. LENGTH()CHAR_LENGTH()
  • LENGTH():返回字符串的字节长度,受字符集影响。比如 UTF-8 编码下,一个汉字占 3 字节 。
  • CHAR_LENGTH():返回字符串的字符数量,不管字符编码,一个汉字、一个英文字母都算 1 个字符 。
  • 示例
SELECT LENGTH('你好') AS len_bytes, CHAR_LENGTH('你好') AS len_chars;
-- len_bytes 为 6(UTF-8 下两个汉字共 6 字节 ),len_chars 为 2 
  • 应用场景:在需要按字符数量限制或统计时用 CHAR_LENGTH() ,如限制用户输入的昵称字符数;判断字符串存储的字节占用情况用 LENGTH() ,避免因字符集导致存储超出字段容量。
4. REPLACE()
  • 功能:替换字符串中的指定子串。
  • 示例
SELECT REPLACE('MySQL is fun', 'fun', 'great') AS new_str;
-- 结果为 "MySQL is great",把 "fun" 替换成 "great"
  • 应用场景:数据清洗时,替换非法字符、统一格式,比如把用户输入内容里的特定敏感词替换掉,UPDATE users SET bio = REPLACE(bio, '敏感词', '***') WHERE bio LIKE '%敏感词%';

二、数值函数

1. SUM()
  • 功能:对数值列求和,常用于聚合查询。
  • 示例
SELECT SUM(amount) AS total_amount FROM orders;
-- 计算 orders 表中 amount 列的总和,得到总订单金额等统计值
  • 应用场景:统计业务数据,如订单总金额、商品销售总量等,是报表统计、数据分析中常用的聚合函数。
2. AVG()
  • 功能:计算数值列的平均值。
  • 示例
SELECT AVG(score) AS avg_score FROM student_scores;
-- 计算学生成绩表中 score 列的平均分
  • 应用场景:用于统计平均数据,像平均成绩、平均订单金额、平均用户活跃度等,辅助分析业务数据的均值情况。
3. ROUND()
  • 功能:对数值进行四舍五入,可指定保留小数位数。
  • 示例
SELECT ROUND(3.14159, 2) AS rounded_num;
-- 结果为 3.14,保留 2 位小数进行四舍五入
  • 应用场景:处理财务数据、统计结果等需要规范小数位数的场景,比如将商品价格、计算出的平均值等按指定小数位展示。
4. MOD()
  • 功能:计算两个数相除的余数,同 % 运算符功能类似 。
  • 示例
SELECT MOD(10, 3) AS remainder;
-- 结果为 1,10 除以 3 的余数是 1 
  • 应用场景:按余数分组、判断奇偶性(如 MOD(num, 2) ,结果为 0 是偶数,1 是奇数 )等场景,比如统计奇数 ID 的用户数量 SELECT COUNT(*) FROM users WHERE MOD(id, 2) = 1;

三、日期和时间函数

1. NOW()
  • 功能:返回当前的日期和时间,格式为 YYYY - MM - DD HH:MM:SS
  • 示例
SELECT NOW() AS current_datetime;
-- 获取执行查询时的当前日期时间,用于记录操作时间等
  • 应用场景:在插入数据时记录创建时间、更新时间(结合 DEFAULT 约束 ),比如 INSERT INTO orders (order_time) VALUES (NOW()); ,或者用于查询条件,筛选最近一段时间的数据。
2. DATE()
  • 功能:提取日期时间值中的日期部分,格式为 YYYY - MM - DD
  • 示例
SELECT DATE(NOW()) AS current_date;
-- 结果为当前日期,如 2025-06-19 
  • 应用场景:按日期分组统计数据,比如统计每天的订单数量 SELECT DATE(order_time) AS order_date, COUNT(*) FROM orders GROUP BY DATE(order_time); ,方便分析每日业务情况。
3. DATEDIFF()
  • 功能:计算两个日期之间的天数差,语法为 DATEDIFF(date1, date2) ,结果是 date1 - date2 的天数 。
  • 示例
SELECT DATEDIFF('2025-06-20', '2025-06-10') AS days_diff;
-- 结果为 10 ,计算两个日期相差天数
  • 应用场景:计算用户注册时长、订单创建到完成的天数等,如 SELECT user_id, DATEDIFF(NOW(), register_date) AS days_registered FROM users; ,分析用户留存天数分布。
4. DATE_FORMAT()
  • 功能:按指定格式格式化日期时间值。
  • 示例
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s') AS formatted_datetime;
-- 结果如 "2025年06月19日 15:30:00" ,按自定义格式输出
  • 应用场景:在生成报表、展示数据时,将日期时间格式化为符合业务需求的形式,提升可读性,比如网站显示文章发布时间为“2025年06月19日 10:00” 这种格式。

四、聚合函数(除前面提到的 SUMAVG 外 )

1. COUNT()
  • 功能:统计查询结果的行数,有 COUNT(*)(统计所有行,包括 NULL )、COUNT(column)(统计指定列非 NULL 值的行数 )、COUNT(DISTINCT column)(统计指定列去重后的行数 ) 。
  • 示例
SELECT COUNT(*) AS total_rows FROM users; -- 统计用户表总记录数
SELECT COUNT(DISTINCT city) AS distinct_cities FROM users; -- 统计用户表中不同城市的数量
  • 应用场景:统计数据总量、不同类别数量等,是数据分析、报表统计中最常用的函数之一,比如统计网站注册用户总数、不同商品分类的商品数量等。
2. MAX()MIN()
  • MAX():返回指定列的最大值 。
  • MIN():返回指定列的最小值 。
  • 示例
SELECT MAX(score) AS max_score, MIN(score) AS min_score FROM student_scores;
-- 找出学生成绩表中的最高和最低分
  • 应用场景:分析数据的极值情况,如商品的最高价格、最低库存,用户的最大年龄、最小注册时间等,辅助业务决策,比如找出价格最高的商品进行推广,关注库存最低的商品及时补货。

五、条件判断函数

1. IF()
  • 功能:简单的条件判断,语法 IF(condition, value_if_true, value_if_false) ,若条件 condition 为真,返回 value_if_true ,否则返回 value_if_false
  • 示例
SELECT name, IF(score >= 60, '及格', '不及格') AS result FROM student_scores;
-- 根据成绩判断是否及格,输出对应结果
  • 应用场景:对查询结果进行简单条件转换,如根据数值判断状态、分类等,在报表展示、数据预处理时常用。
2. CASE WHEN
  • 功能:更复杂的条件分支判断,有简单格式和搜索格式 。
    • 简单格式:CASE expr WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE result ELSE END ,比较 exprvalue
    • 搜索格式:CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE result ELSE END ,根据条件 condition 判断。
  • 示例
-- 简单格式
SELECT name, 
       CASE gender 
           WHEN 'M' THEN '男性' 
           WHEN 'F' THEN '女性' 
           ELSE '未知' 
       END AS gender_cn 
FROM users;
-- 搜索格式
SELECT score, 
       CASE 
           WHEN score >= 90 THEN '优秀' 
           WHEN score >= 70 THEN '良好' 
           WHEN score >= 60 THEN '及格' 
           ELSE '不及格' 
       END AS grade 
FROM student_scores;
  • 应用场景:处理多条件分支的业务逻辑,如根据不同的数值范围、枚举值进行分类、转换,生成符合业务需求的结果,常用于复杂报表、数据分类统计等场景。

这些函数覆盖了 MySQL 日常使用中数据处理、查询分析、业务逻辑实现等多方面的需求,合理运用它们能大幅提升 SQL 语句的功能和效率,满足多样化的业务场景 。当然,MySQL 还有很多其他函数(如加密函数 PASSWORD()AES_ENCRYPT() , JSON 函数 JSON_EXTRACT() 等 ),可根据具体业务需求进一步探索使用。

### MySQL 5.7 8.0 版本中的列转行方法比较 在处理数据转换需求时,特别是将多行记录汇总成单行或多列的数据展示形式,MySQL 提供了一些特定的功能来实现这一目标。对于不同版本的 MySQL,在执行列到行(即透视表操作)方面存在差异。 #### 使用 CASE 表达式与 GROUP BY 实现列转行 无论是 MySQL 5.7 还是 8.0,都可以通过 `CASE` 表达式配合 `GROUP BY` 来完成简单的列转行功能[^1]: ```sql SELECT id, MAX(CASE WHEN type = 'A' THEN value END) AS A_value, MAX(CASE WHEN type = 'B' THEN value END) AS B_value FROM table_name GROUP BY id; ``` 这种方法利用条件聚合的方式实现了基本的列转行效果,适用于大多数场景下的简单转换需求。 #### 利用 JSON 函数 (仅限于 MySQL 8.0) 自 MySQL 8.0 开始引入了一系列强大的JSON函数支持更复杂的查询逻辑构建。可以借助这些新特性轻松地把多个字段的结果集组合成一行带有嵌套结构的对象表示法字符串,再进一步解析回关系型表格格式[^2]: ```sql WITH cte AS ( SELECT id, CONCAT('{"',type,'":"',value,'"}') json_col FROM table_name ) SELECT id, JSON_UNQUOTE(JSON_EXTRACT(GROUP_CONCAT(json_col), '$[*].A')) as A_value, JSON_UNQUOTE(JSON_EXTRACT(GROUP_CONCAT(json_col), '$[*].B')) as B_value FROM cte GROUP BY id; ``` 此方案不仅能够有效解决传统方式难以应对的大规模复杂度问题,同时也提高了代码可读性维护效率。 #### 动态 SQL 构建 (适合任意版本但需谨慎使用) 当面对未知数量的目标列名情况时,则可能需要用到动态SQL语句生成技术。这通常涉及到拼接字符串形成最终要执行的查询命令,并通过预处理器或存储过程机制调用来达成目的。不过需要注意的是这种方式增加了安全风险并可能导致性能下降,因此建议只作为最后的选择考虑[^3]. 总结来说,虽然两个版本都能满足基础的列转行需求,但是随着版本迭代带来的新技术应用使得更高阶的操作变得更加便捷高效。特别是在 MySQL 8.0 中新增加的支持让开发者有了更多样化的工具可以选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值