

文章目录
- [1. 函数概述](#1. 函数概述)
-
- [1.1 函数的作用](#1.1 函数的作用)
- [1.2 MySQL函数的分类](#1.2 MySQL函数的分类)
- [1.3 函数的用法](#1.3 函数的用法)
- [2. 字符串函数](#2. 字符串函数)
-
- [2.1 字符串连接和操作](#2.1 字符串连接和操作)
- [2.2 查找和比较](#2.2 查找和比较)
- [2.3 高级字符串函数](#2.3 高级字符串函数)
- [3. 数值函数](#3. 数值函数)
-
- [3.1 基本数学运算](#3.1 基本数学运算)
- [3.2 高级数学函数](#3.2 高级数学函数)
- [3.3 随机数和类型转换](#3.3 随机数和类型转换)
- [4. 日期和时间函数](#4. 日期和时间函数)
-
- [4.1 日期获取和格式化](#4.1 日期获取和格式化)
- [4.2 日期时间提取和计算](#4.2 日期时间提取和计算)
- [4.3 日期时间格式化选项](#4.3 日期时间格式化选项)
- [5. 条件函数](#5. 条件函数)
-
- [5.1 IF和CASE表达式](#5.1 IF和CASE表达式)
- [5.2 NULL值处理](#5.2 NULL值处理)
- [5.3 最值函数](#5.3 最值函数)
- [6. 聚合函数](#6. 聚合函数)
-
- [6.1 基本聚合](#6.1 基本聚合)
- [6.2 统计聚合](#6.2 统计聚合)
- [6.3 窗口聚合函数](#6.3 窗口聚合函数)
- [7. 加密与安全函数](#7. 加密与安全函数)
-
- [7.1 哈希和加密函数](#7.1 哈希和加密函数)
- [7.2 安全实践示例](#7.2 安全实践示例)
正文
1. 函数概述
MySQL函数是执行特定操作并返回结果的内置例程,它们可以大大简化数据处理和转换过程。MySQL提供了丰富的内置函数,并支持创建自定义函数。
1.1 函数的作用
- 数据转换和格式化
- 执行数学计算
- 处理字符串和日期
- 条件逻辑处理
- 聚合和统计操作
1.2 MySQL函数的分类
MySQL函数 字符串函数 数值函数 日期与时间函数 条件函数 聚合函数 加密与压缩函数 信息函数 JSON函数 窗口函数 空间函数 XML函数 自定义函数
1.3 函数的用法
函数用法 SELECT语句中 WHERE条件中 ORDER BY子句中 GROUP BY子句中 HAVING子句中 联接条件中 子查询中 存储过程中 触发器中 计算列定义中
2. 字符串函数
2.1 字符串连接和操作
字符串函数 连接 长度 大小写 修剪 提取 替换 格式化 CONCAT CONCAT_WS LENGTH/CHAR_LENGTH UPPER/UCASE LOWER/LCASE TRIM LTRIM/RTRIM SUBSTRING LEFT/RIGHT REPLACE INSERT FORMAT LPAD/RPAD
sql
-- 字符串连接
SELECT CONCAT('Hello ', 'World') AS greeting; -- 'Hello World'
SELECT CONCAT_WS(', ', 'John', 'Doe', 'New York') AS address; -- 'John, Doe, New York'
-- 字符串长度
SELECT LENGTH('MySQL') AS byte_length; -- 5 (字节数)
SELECT CHAR_LENGTH('MySQL') AS char_length; -- 5 (字符数)
-- 大小写转换
SELECT UPPER('hello') AS uppercase; -- 'HELLO'
SELECT LOWER('HELLO') AS lowercase; -- 'hello'
-- 修剪字符串
SELECT TRIM(' MySQL ') AS trimmed; -- 'MySQL'
SELECT LTRIM(' MySQL ') AS left_trimmed; -- 'MySQL '
SELECT RTRIM(' MySQL ') AS right_trimmed; -- ' MySQL'
SELECT TRIM(BOTH '!' FROM '!!!MySQL!!!') AS trim_chars; -- 'MySQL'
-- 提取子字符串
SELECT SUBSTRING('MySQL Database', 7) AS substring_from; -- 'Database'
SELECT SUBSTRING('MySQL Database', 1, 5) AS substring_range; -- 'MySQL'
SELECT LEFT('MySQL', 2) AS left_chars; -- 'My'
SELECT RIGHT('MySQL', 3) AS right_chars; -- 'SQL'
-- 替换字符串
SELECT REPLACE('MySQL Database', 'Database', 'Functions') AS replaced; -- 'MySQL Functions'
SELECT INSERT('MySQL', 3, 2, 'NewSQL') AS inserted; -- 'MyNewSQLL'
-- 格式化字符串
SELECT FORMAT(12345.678, 2) AS formatted_number; -- '12,345.68'
SELECT LPAD('MySQL', 10, '*') AS left_padded; -- '*****MySQL'
SELECT RPAD('MySQL', 10, '*') AS right_padded; -- 'MySQL*****'
2.2 查找和比较
sql
-- 位置查找
SELECT LOCATE('SQL', 'MySQL Database') AS position; -- 3
SELECT POSITION('SQL' IN 'MySQL Database') AS position; -- 3
SELECT INSTR('MySQL Database', 'SQL') AS position; -- 3
-- 比较函数
SELECT STRCMP('MySQL', 'MySQL') AS comparison; -- 0 (相等)
SELECT STRCMP('MySQL', 'mysql') AS comparison; -- 0 (大小写不敏感)
SELECT STRCMP('MySQL', 'MariaDB') AS comparison; -- 1 (第一个大于第二个)
-- 模式匹配
SELECT 'MySQL' LIKE 'My%' AS pattern_match; -- 1 (TRUE)
SELECT 'MySQL' REGEXP '^My.*L$' AS regex_match; -- 1 (TRUE)
2.3 高级字符串函数
sql
-- 字符串分割
SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2) AS extract_domain; -- 'www.mysql'
SELECT SUBSTRING_INDEX('www.mysql.com', '.', -1) AS extract_tld; -- 'com'
-- 重复字符串
SELECT REPEAT('MySQL ', 3) AS repeated; -- 'MySQL MySQL MySQL '
-- 反转字符串
SELECT REVERSE('MySQL') AS reversed; -- 'LQSyM'
-- 空格函数
SELECT SPACE(5) AS spaces; -- ' '
-- 字符串转义
SELECT QUOTE('Don\'t') AS quoted; -- 'Don\'t'
-- 计算字符出现次数
SELECT (LENGTH('Mississippi') - LENGTH(REPLACE('Mississippi', 'i', ''))) / LENGTH('i') AS count_i; -- 4
3. 数值函数
3.1 基本数学运算
数值函数 基础运算 舍入函数 高级数学函数 随机函数 类型转换 ABS SIGN MOD POW/POWER SQRT ROUND FLOOR CEILING/CEIL TRUNCATE SIN/COS/TAN LOG/LN EXP PI RAND CAST CONVERT
sql
-- 基本运算
SELECT ABS(-15) AS absolute_value; -- 15
SELECT SIGN(-15) AS sign_value; -- -1 (负数)
SELECT SIGN(0) AS sign_value; -- 0
SELECT SIGN(15) AS sign_value; -- 1 (正数)
SELECT MOD(15, 4) AS modulo; -- 3 (余数)
SELECT 15 % 4 AS modulo; -- 3 (与MOD相同)
SELECT POW(2, 3) AS power; -- 8 (2的3次方)
SELECT SQRT(16) AS square_root; -- 4
-- 舍入函数
SELECT ROUND(15.7) AS rounded; -- 16
SELECT ROUND(15.2) AS rounded; -- 15
SELECT ROUND(15.678, 2) AS rounded_decimal; -- 15.68
SELECT FLOOR(15.7) AS floor_value; -- 15 (向下取整)
SELECT CEILING(15.2) AS ceiling_value; -- 16 (向上取整)
SELECT TRUNCATE(15.678, 2) AS truncated; -- 15.67 (截断到指定小数位)
3.2 高级数学函数
sql
-- 三角函数
SELECT SIN(PI()/2) AS sine; -- 1
SELECT COS(PI()) AS cosine; -- -1
SELECT TAN(PI()/4) AS tangent; -- 1
-- 对数函数
SELECT LOG(10) AS natural_log; -- 2.302585... (自然对数)
SELECT LOG10(100) AS log10; -- 2
SELECT LOG(2, 8) AS log_base_2; -- 3
-- 指数函数
SELECT EXP(1) AS e_value; -- 2.718281... (自然常数e)
-- 常数
SELECT PI() AS pi_value; -- 3.141592...
3.3 随机数和类型转换
sql
-- 随机数
SELECT RAND() AS random_number; -- 0到1之间的随机数
SELECT FLOOR(RAND() * 10) AS random_int; -- 0到9之间的随机整数
SELECT FLOOR(1 + RAND() * 10) AS random_1_to_10; -- 1到10之间的随机整数
-- 数值类型转换
SELECT CAST('15.7' AS DECIMAL(10,2)) AS decimal_value; -- 15.70
SELECT CAST('2023-01-15' AS DATE) AS date_value; -- '2023-01-15'
SELECT CONVERT('15.7', DECIMAL(10,2)) AS decimal_value; -- 15.70
4. 日期和时间函数
4.1 日期获取和格式化
日期时间函数 当前日期时间 日期时间格式化 日期时间提取 日期时间计算 日期时间验证 时间间隔函数 NOW/CURRENT_TIMESTAMP CURDATE/CURRENT_DATE CURTIME/CURRENT_TIME DATE_FORMAT TIME_FORMAT FROM_UNIXTIME YEAR/MONTH/DAY HOUR/MINUTE/SECOND EXTRACT DATE_ADD/ADDDATE DATE_SUB/SUBDATE DATEDIFF IS_DATE IS_TIME TIMESTAMPDIFF PERIOD_ADD
sql
-- 获取当前日期和时间
SELECT NOW() AS current_datetime; -- '2023-12-01 12:34:56'
SELECT CURRENT_TIMESTAMP() AS current_datetime; -- '2023-12-01 12:34:56'
SELECT CURDATE() AS current_date; -- '2023-12-01'
SELECT CURRENT_DATE() AS current_date; -- '2023-12-01'
SELECT CURTIME() AS current_time; -- '12:34:56'
SELECT CURRENT_TIME() AS current_time; -- '12:34:56'
-- 日期和时间格式化
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS formatted_date; -- '2023-12-01'
SELECT DATE_FORMAT(NOW(), '%b %d, %Y') AS formatted_date; -- 'Dec 01, 2023'
SELECT DATE_FORMAT(NOW(), '%W, %M %e, %Y') AS formatted_date; -- 'Friday, December 1, 2023'
SELECT TIME_FORMAT(CURTIME(), '%h:%i %p') AS formatted_time; -- '12:34 PM'
4.2 日期时间提取和计算
sql
-- 日期部分提取
SELECT YEAR('2023-12-01') AS year_part; -- 2023
SELECT MONTH('2023-12-01') AS month_part; -- 12
SELECT DAY('2023-12-01') AS day_part; -- 1
SELECT DAYNAME('2023-12-01') AS day_name; -- 'Friday'
SELECT MONTHNAME('2023-12-01') AS month_name; -- 'December'
SELECT DAYOFWEEK('2023-12-01') AS day_of_week; -- 6 (1=Sunday, 2=Monday, ...)
SELECT WEEKDAY('2023-12-01') AS weekday; -- 4 (0=Monday, 1=Tuesday, ...)
SELECT DAYOFYEAR('2023-12-01') AS day_of_year; -- 335
SELECT WEEK('2023-12-01') AS week_of_year; -- 48
SELECT QUARTER('2023-12-01') AS quarter; -- 4
-- 时间部分提取
SELECT HOUR('12:34:56') AS hour_part; -- 12
SELECT MINUTE('12:34:56') AS minute_part; -- 34
SELECT SECOND('12:34:56') AS second_part; -- 56
-- 统一提取函数
SELECT EXTRACT(YEAR FROM '2023-12-01') AS year_part; -- 2023
SELECT EXTRACT(MONTH FROM '2023-12-01') AS month_part; -- 12
SELECT EXTRACT(DAY FROM '2023-12-01') AS day_part; -- 1
SELECT EXTRACT(HOUR FROM '12:34:56') AS hour_part; -- 12
-- 日期计算
SELECT DATE_ADD('2023-12-01', INTERVAL 7 DAY) AS date_plus_7_days; -- '2023-12-08'
SELECT DATE_SUB('2023-12-01', INTERVAL 1 MONTH) AS date_minus_1_month; -- '2023-11-01'
SELECT ADDDATE('2023-12-01', 7) AS date_plus_7_days; -- '2023-12-08'
SELECT SUBDATE('2023-12-01', 7) AS date_minus_7_days; -- '2023-11-24'
SELECT ADDTIME('12:34:56', '1:2:3') AS time_plus; -- '13:36:59'
SELECT SUBTIME('12:34:56', '1:2:3') AS time_minus; -- '11:32:53'
-- 日期时间差值
SELECT DATEDIFF('2023-12-15', '2023-12-01') AS days_difference; -- 14
SELECT TIMESTAMPDIFF(HOUR, '2023-12-01 12:00:00', '2023-12-02 14:00:00') AS hours_difference; -- 26
SELECT TIMESTAMPDIFF(MINUTE, '12:34:56', '14:45:37') AS minutes_difference; -- 131 (如果是当天)
4.3 日期时间格式化选项
DATE_FORMAT常用格式说明符:
格式化字符 | 描述 | 示例 |
---|---|---|
%Y | 四位数年份 | 2023 |
%y | 两位数年份 | 23 |
%M | 月份名称 | January |
%b | 月份简写 | Jan |
%m | 两位数月份 (01-12) | 01 |
%c | 数字月份 (1-12) | 1 |
%d | 两位数日期 (01-31) | 01 |
%e | 数字日期 (1-31) | 1 |
%W | 星期名称 | Monday |
%a | 星期简写 | Mon |
%H | 24小时制小时 (00-23) | 13 |
%h | 12小时制小时 (01-12) | 01 |
%i | 分钟 (00-59) | 45 |
%s | 秒 (00-59) | 30 |
%p | AM或PM | PM |
sql
-- 格式化示例
SELECT DATE_FORMAT('2023-12-01 13:45:30', '%W, %M %e, %Y at %h:%i %p') AS formatted;
-- 'Friday, December 1, 2023 at 01:45 PM'
5. 条件函数
5.1 IF和CASE表达式
条件函数 简单条件 多条件 NULL处理 类型相关 IF CASE CASE WHEN IFNULL COALESCE NULLIF GREATEST LEAST
sql
-- IF函数
SELECT IF(10 > 5, 'Greater', 'Less') AS result; -- 'Greater'
SELECT IF(stock > 0, 'In Stock', 'Out of Stock') AS status
FROM products;
-- CASE表达式 (简单CASE)
SELECT
product_name,
CASE category_id
WHEN 1 THEN 'Electronics'
WHEN 2 THEN 'Clothing'
WHEN 3 THEN 'Books'
ELSE 'Other'
END AS category_name
FROM products;
-- CASE表达式 (搜索CASE)
SELECT
product_name,
price,
CASE
WHEN price < 10 THEN 'Budget'
WHEN price BETWEEN 10 AND 50 THEN 'Mid-range'
WHEN price > 50 THEN 'Premium'
ELSE 'Unknown'
END AS price_range
FROM products;
5.2 NULL值处理
sql
-- IFNULL函数
SELECT IFNULL(middle_name, '') AS middle_name
FROM customers; -- 如果middle_name为NULL,返回空字符串
-- COALESCE函数 (返回第一个非NULL值)
SELECT COALESCE(phone, mobile, email, 'No contact') AS contact
FROM customers;
-- NULLIF函数 (如果两个表达式相等,返回NULL)
SELECT NULLIF(10, 10) AS result; -- NULL
SELECT NULLIF(10, 20) AS result; -- 10
-- ISNULL函数
SELECT ISNULL(NULL) AS result; -- 1 (TRUE)
SELECT ISNULL(123) AS result; -- 0 (FALSE)
5.3 最值函数
sql
-- GREATEST函数 (返回最大值)
SELECT GREATEST(10, 5, 20, 15) AS max_value; -- 20
SELECT GREATEST('apple', 'orange', 'banana') AS max_string; -- 'orange' (字母顺序最大)
-- LEAST函数 (返回最小值)
SELECT LEAST(10, 5, 20, 15) AS min_value; -- 5
SELECT LEAST('apple', 'orange', 'banana') AS min_string; -- 'apple' (字母顺序最小)
6. 聚合函数
6.1 基本聚合
聚合函数 计数函数 汇总函数 统计函数 GROUP BY相关 窗口聚合 COUNT SUM AVG MIN MAX STD/STDDEV VARIANCE GROUP_CONCAT 窗口函数
sql
-- 计数
SELECT COUNT(*) AS total_rows FROM products; -- 所有行数
SELECT COUNT(product_id) AS total_products FROM products; -- 非NULL product_id行数
SELECT COUNT(DISTINCT category_id) AS category_count FROM products; -- 不同category_id的数量
-- 求和
SELECT SUM(price) AS total_price FROM products;
SELECT SUM(price * quantity) AS inventory_value FROM products;
-- 平均值
SELECT AVG(price) AS average_price FROM products;
SELECT AVG(IFNULL(discount, 0)) AS average_discount FROM products; -- NULL值替换为0再计算平均值
-- 最大值和最小值
SELECT MAX(price) AS highest_price FROM products;
SELECT MIN(price) AS lowest_price FROM products;
SELECT MAX(order_date) AS latest_order FROM orders; -- 最近订单日期
6.2 统计聚合
sql
-- 标准差和方差
SELECT STD(price) AS price_std FROM products; -- 样本标准差
SELECT STDDEV(price) AS price_std FROM products; -- 同上
SELECT STDDEV_POP(price) AS price_std_pop FROM products; -- 总体标准差
SELECT VARIANCE(price) AS price_variance FROM products; -- 样本方差
SELECT VAR_POP(price) AS price_var_pop FROM products; -- 总体方差
-- 组连接
SELECT
category_id,
GROUP_CONCAT(product_name) AS products
FROM products
GROUP BY category_id;
-- 带选项的组连接
SELECT
category_id,
GROUP_CONCAT(
product_name
ORDER BY price DESC
SEPARATOR ' | '
) AS products
FROM products
GROUP BY category_id;
6.3 窗口聚合函数
sql
-- 行号
SELECT
product_id,
product_name,
category_id,
price,
ROW_NUMBER() OVER (ORDER BY price DESC) AS price_rank
FROM products;
-- 按分类分组排序
SELECT
product_id,
product_name,
category_id,
price,
ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY price DESC) AS category_price_rank
FROM products;
-- 累计总和
SELECT
order_id,
order_date,
amount,
SUM(amount) OVER (ORDER BY order_date) AS running_total
FROM orders;
-- 移动平均
SELECT
order_date,
amount,
AVG(amount) OVER (
ORDER BY order_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_average_3day
FROM orders;
7. 加密与安全函数
7.1 哈希和加密函数
加密与安全函数 哈希函数 加密函数 编码函数 安全函数 MD5 SHA1/SHA2 PASSWORD AES_ENCRYPT AES_DECRYPT ENCODE/DECODE BASE64 COMPRESS UNCOMPRESS
sql
-- 哈希函数
SELECT MD5('password') AS md5_hash; -- 128位哈希值
SELECT SHA1('password') AS sha1_hash; -- 160位哈希值
SELECT SHA2('password', 256) AS sha256_hash; -- 256位SHA2哈希
-- 对称加密函数
SELECT AES_ENCRYPT('sensitive data', 'encryption_key') AS encrypted_data;
SELECT AES_DECRYPT(encrypted_column, 'encryption_key') AS decrypted_data
FROM secure_table;
-- 编码函数
SELECT TO_BASE64('MySQL') AS base64_encoded; -- 'TXlTUUw='
SELECT FROM_BASE64('TXlTUUw=') AS base64_decoded; -- 'MySQL'
-- 压缩函数
SELECT COMPRESS('long text data') AS compressed_data;
SELECT UNCOMPRESS(compressed_column) AS uncompressed_data
FROM compressed_table;
7.2 安全实践示例
sql
-- 密码存储最佳实践
-- 注意: 实际应用中应使用专门的密码哈希库而不是MD5
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(64) NOT NULL,
salt VARCHAR(32) NOT NULL
);
-- 创建密码哈希和盐
SET @salt = MD5(RAND());
INSERT INTO users (username, password_hash, salt)
VALUES ('john_doe', SHA2(CONCAT('user_password', @salt), 256), @salt);
-- 验证密码
SELECT user_id FROM users
WHERE username = 'john_doe'
AND password_hash = SHA2(CONCAT('entered_password', salt), 256);
结语
感谢您的阅读!期待您的一键三连!欢迎指正!
