文章目录
- 一、字符串函数
-
- CONCAT()
- CONCAT_WS()
- [SUBSTRING() / SUBSTR()](#SUBSTRING() / SUBSTR())
- [LENGTH() / CHAR_LENGTH()](#LENGTH() / CHAR_LENGTH())
- REPLACE()
- [TRIM() / LTRIM() / RTRIM()](#TRIM() / LTRIM() / RTRIM())
- [UPPER() / LOWER()](#UPPER() / LOWER())
- [LPAD() / RPAD()](#LPAD() / RPAD())
- 二、数值函数
- 三、日期和时间函数
-
- NOW()
- [CURDATE() / CURTIME()](#CURDATE() / CURTIME())
- [DATE_ADD() / DATE_SUB()](#DATE_ADD() / DATE_SUB())
- DATEDIFF()
- EXTRACT()
- DATE_FORMAT()
- STR_TO_DATE()
- TIMESTAMPDIFF()
- 四、聚合函数
-
- COUNT()
- SUM()
- AVG()
- [MIN() / MAX()](#MIN() / MAX())
- GROUP_CONCAT()
- 五、控制流函数
- 六、JSON函数 (MySQL 5.7+)
-
- JSON_OBJECT()
- JSON_ARRAY()
- [JSON_EXTRACT() / -> (简写)](#JSON_EXTRACT() / -> (简写))
- JSON_SET()
- JSON_UNQUOTE()
- 七、加密和哈希函数
-
- MD5()
- [SHA1() / SHA2()](#SHA1() / SHA2())
- [AES_ENCRYPT() / AES_DECRYPT()](#AES_ENCRYPT() / AES_DECRYPT())
- PASSWORD()
- 八、转换函数
- 九、窗口函数 (MySQL 8.0+)
-
- ROW_NUMBER()
- [RANK() / DENSE_RANK()](#RANK() / DENSE_RANK())
- [SUM() OVER() / AVG() OVER()](#SUM() OVER() / AVG() OVER())
- [LEAD() / LAG()](#LEAD() / LAG())
- 十、其他函数
-
- [1. 正则表达式函数 (MySQL 8.0+)](#1. 正则表达式函数 (MySQL 8.0+))
- [2. UUID()函数](#2. UUID()函数)
MySQL提供了丰富的内置函数,用于数据处理、计算、转换和分析,以下是常用的内置函数介绍。
一、字符串函数
字符串函数用于处理和操作文本数据,是数据库操作中最常用的函数类别之一。
CONCAT()
连接两个或多个字符串。
sql
SELECT CONCAT('Hello', ' ', 'World'); -- 返回 'Hello World'
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
注意:任一参数为NULL,结果为NULL。使用CONCAT_WS可避免此问题。
CONCAT_WS()
使用指定分隔符连接字符串,自动跳过NULL值。
sql
SELECT CONCAT_WS(', ', 'John', 'Doe', NULL, 'Engineer'); -- 返回 'John, Doe, Engineer'
SELECT CONCAT_WS('-', year, month, day) AS date_formatted FROM events;
SUBSTRING() / SUBSTR()
提取字符串的子串。
sql
SELECT SUBSTRING('MySQL Database', 1, 5); -- 返回 'MySQL'
SELECT SUBSTRING('2023-05-15', 6, 2) AS month; -- 返回 '05'
LENGTH() / CHAR_LENGTH()
LENGTH(): 返回字符串的字节长度CHAR_LENGTH(): 返回字符串的字符数
sql
SELECT LENGTH('你好'), CHAR_LENGTH('你好'); -- 通常返回 6, 2 (UTF8编码)
REPLACE()
替换字符串中的子串。
sql
SELECT REPLACE('My SQL', ' ', ''); -- 返回 'MySQL'
SELECT REPLACE(email, '@example.com', '@newdomain.com') FROM users;
TRIM() / LTRIM() / RTRIM()
移除字符串两端/左端/右端的空格或指定字符。
sql
SELECT TRIM(' MySQL '); -- 返回 'MySQL'
SELECT TRIM(BOTH 'x' FROM 'xxxMySQLxxx'); -- 返回 'MySQL'
UPPER() / LOWER()
转换字符串为大写/小写。
sql
SELECT UPPER('mysql'), LOWER('MYSQL'); -- 返回 'MYSQL', 'mysql'
LPAD() / RPAD()
在字符串左侧/右侧填充指定字符至指定长度。
sql
SELECT LPAD('123', 5, '0'); -- 返回 '00123'
SELECT RPAD(name, 20, '.') AS formatted_name FROM products;
二、数值函数
数值函数用于执行数学计算和处理数字数据。
ROUND()
四舍五入到指定小数位。
sql
SELECT ROUND(123.4567, 2); -- 返回 123.46
SELECT ROUND(123.4567, -1); -- 返回 120 (四舍五入到十位)
CEIL() / CEILING() / FLOOR()
CEILING() / CEIL(): 向上取整FLOOR(): 向下取整
sql
SELECT CEIL(12.3), FLOOR(12.9); -- 返回 13, 12
ABS()
返回绝对值。
sql
SELECT ABS(-15.3), ABS(15.3); -- 都返回 15.3
MOD()
返回除法余数。
sql
SELECT MOD(10, 3); -- 返回 1
SELECT * FROM orders WHERE MOD(order_id, 2) = 0; -- 选择偶数ID订单
RAND()
生成0到1之间的随机浮点数。
sql
SELECT RAND(); -- 例如 0.7384925760134728
SELECT FLOOR(1 + RAND() * 10) AS random_number; -- 1到10的随机整数
POWER() / POW()
计算幂。
sql
SELECT POWER(2, 3); -- 返回 8 (2^3)
SELECT POWER(price, 1.05) AS increased_price FROM products;
SQRT()
计算平方根。
sql
SELECT SQRT(16); -- 返回 4
SIGN()
返回数字的符号:-1(负), 0(零), 1(正)。
sql
SELECT SIGN(-5), SIGN(0), SIGN(5); -- 返回 -1, 0, 1
三、日期和时间函数
日期和时间函数用于处理日期时间数据,是业务应用中最常用的函数类别之一。
NOW()
返回当前日期和时间。
sql
SELECT NOW(); -- 例如 '2023-05-15 14:30:45'
INSERT INTO logs (event_time, message) VALUES (NOW(), 'User login');
CURDATE() / CURTIME()
CURDATE(): 返回当前日期CURTIME(): 返回当前时间
sql
SELECT CURDATE(), CURTIME(); -- 例如 '2023-05-15', '14:30:45'
DATE_ADD() / DATE_SUB()
增加或减少日期间隔。
sql
SELECT DATE_ADD('2023-05-15', INTERVAL 7 DAY); -- 返回 '2023-05-22'
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH) AS one_month_ago;
DATEDIFF()
计算两个日期之间的天数差。
sql
SELECT DATEDIFF('2023-06-01', '2023-05-15'); -- 返回 17
SELECT DATEDIFF(NOW(), hire_date) AS days_employed FROM employees;
EXTRACT()
从日期时间值中提取特定部分。
sql
SELECT EXTRACT(YEAR FROM '2023-05-15'); -- 返回 2023
SELECT EXTRACT(MONTH FROM NOW()) AS current_month;
DATE_FORMAT()
格式化日期时间值为字符串。
sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- '2023-05-15 14:30:45'
SELECT DATE_FORMAT(birth_date, '%W, %M %e, %Y') AS formatted_dob FROM users;
STR_TO_DATE()
将字符串转换为日期时间值。
sql
SELECT STR_TO_DATE('15,05,2023', '%d,%m,%Y'); -- 返回 '2023-05-15'
TIMESTAMPDIFF()
计算两个日期时间之间的差(指定单位)。
sql
SELECT TIMESTAMPDIFF(HOUR, '2023-05-15 08:00:00', '2023-05-15 14:30:00'); -- 返回 6
四、聚合函数
聚合函数用于对一组值执行计算并返回单个值,通常与GROUP BY子句一起使用。
COUNT()
计算行数。
sql
SELECT COUNT(*) FROM customers; -- 计算所有行
SELECT COUNT(email) FROM customers; -- 只计算非NULL的email
SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;
SUM()
计算数值列的总和。
sql
SELECT SUM(salary) AS total_payroll FROM employees;
SELECT department, SUM(salary) AS dept_total FROM employees GROUP BY department;
AVG()
计算平均值。
sql
SELECT AVG(rating) AS average_rating FROM product_reviews;
SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;
MIN() / MAX()
返回最小值和最大值。
sql
SELECT MIN(price) AS cheapest, MAX(price) AS most_expensive FROM products;
SELECT category, MIN(release_date) AS first_release FROM movies GROUP BY category;
GROUP_CONCAT()
将组中的字符串连接为单个字符串。
sql
SELECT department, GROUP_CONCAT(last_name SEPARATOR ', ') AS employees
FROM employees GROUP BY department;
五、控制流函数
控制流函数用于基于条件返回不同值,类似于编程语言中的条件语句。
IF()
简单的条件判断。
sql
SELECT IF(score >= 60, 'Pass', 'Fail') AS result FROM exams;
SELECT name, IF(is_active, 'Active', 'Inactive') AS status FROM users;
IFNULL()
如果第一个参数为NULL,返回第二个参数;否则返回第一个参数。
sql
SELECT IFNULL(phone, 'No phone provided') AS contact_phone FROM customers;
SELECT product_name, IFNULL(discount, 0) AS discount_percent FROM products;
NULLIF()
如果两个参数相等,返回NULL;否则返回第一个参数。
sql
SELECT NULLIF(quantity, 0) AS safe_quantity FROM inventory; -- 将0转换为NULL
CASE
复杂的条件判断,有两种形式。
sql
-- 简单CASE
SELECT name,
CASE rating
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Good'
WHEN 'C' THEN 'Average'
ELSE 'Poor'
END AS performance
FROM employees;
-- 搜索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_category
FROM products;
六、JSON函数 (MySQL 5.7+)
随着JSON在应用中的普及,MySQL提供了强大的JSON处理功能。
JSON_OBJECT()
创建JSON对象。
sql
SELECT JSON_OBJECT('name', 'John', 'age', 30, 'city', 'New York');
-- 返回 {"name": "John", "age": 30, "city": "New York"}
JSON_ARRAY()
创建JSON数组。
sql
SELECT JSON_ARRAY('apple', 'banana', 'orange');
-- 返回 ["apple", "banana", "orange"]
JSON_EXTRACT() / -> (简写)
提取JSON文档中的数据。
sql
SELECT JSON_EXTRACT('{"name": "John", "address": {"city": "New York"}}', '$.name');
-- 返回 "John"
SELECT '{"name": "John", "address": {"city": "New York"}}'->'$.address.city';
-- 返回 "New York"
JSON_SET()
插入或更新JSON文档中的数据。
sql
SELECT JSON_SET('{"name": "John"}', '$.age', 30);
-- 返回 {"name": "John", "age": 30}
JSON_UNQUOTE()
移除JSON字符串值的引号。
sql
SELECT JSON_UNQUOTE('"Hello World"'); -- 返回 Hello World
SELECT JSON_UNQUOTE(JSON_EXTRACT('{"name": "John"}', '$.name')); -- 返回 John
-- 简写:column->>'$.path' 等同于 JSON_UNQUOTE(JSON_EXTRACT(column, '$.path'))
七、加密和哈希函数
这些函数用于数据加密、哈希和安全处理。
MD5()
计算MD5 128位校验和。
sql
SELECT MD5('password'); -- 返回 32位十六进制字符串
INSERT INTO users (username, password_hash) VALUES ('john', MD5('secure123'));
注意:MD5已不推荐用于密码存储,应使用更安全的算法。
SHA1() / SHA2()
计算SHA1 (160位) 或SHA2 (224, 256, 384, 512位) 哈希值。
sql
SELECT SHA1('password'); -- 40位十六进制字符串
SELECT SHA2('password', 256); -- 64位十六进制字符串 (推荐)
AES_ENCRYPT() / AES_DECRYPT()
使用高级加密标准(AES)算法加密/解密数据。
sql
SET @key_str = 'my_secret_key';
SET @encrypted = AES_ENCRYPT('sensitive_data', @key_str);
SELECT AES_DECRYPT(@encrypted, @key_str); -- 返回 'sensitive_data'
PASSWORD()
计算MySQL原生密码哈希。
sql
SELECT PASSWORD('password'); -- 仅用于MySQL内部用户验证
注意:此函数在MySQL 8.0中已弃用,推荐使用身份验证插件。
八、转换函数
转换函数用于在不同数据类型之间转换值。
CAST()
将值转换为指定类型。
sql
SELECT CAST('2023-05-15' AS DATE); -- 字符串转日期
SELECT CAST(123.45 AS SIGNED); -- 浮点转整数
SELECT CAST(NOW() AS CHAR) AS current_time_str; -- 日期转字符串
CONVERT()
类似于CAST(),但语法不同。
sql
SELECT CONVERT('123', SIGNED); -- 字符串转整数
SELECT CONVERT('text' USING utf8mb4); -- 转换字符集
COALESCE()
返回参数列表中第一个非NULL值。
sql
SELECT COALESCE(NULL, NULL, 'first non-null', 'second'); -- 返回 'first non-null'
SELECT name, COALESCE(phone, email, 'No contact') AS contact_info FROM customers;
九、窗口函数 (MySQL 8.0+)
窗口函数执行跨多行的相关计算,而不将它们分组为单个输出行。
ROW_NUMBER()
为分区中的每一行分配唯一的序号。
sql
SELECT
department,
employee_name,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;
RANK() / DENSE_RANK()
RANK(): 有并列时跳过后续名次DENSE_RANK(): 有并列时不跳过后续名次
sql
SELECT
product_name,
category,
price,
RANK() OVER (PARTITION BY category ORDER BY price DESC) AS price_rank,
DENSE_RANK() OVER (PARTITION BY category ORDER BY price DESC) AS dense_price_rank
FROM products;
SUM() OVER() / AVG() OVER()
聚合函数与OVER()子句结合使用,计算运行总计或移动平均。
sql
SELECT
order_date,
amount,
SUM(amount) OVER (ORDER BY order_date) AS running_total,
AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
FROM orders;
LEAD() / LAG()
访问当前行之后(LEAD)或之前(LAG)的行的数据。
sql
SELECT
month,
revenue,
LAG(revenue, 1) OVER (ORDER BY month) AS prev_month_revenue,
LEAD(revenue, 1) OVER (ORDER BY month) AS next_month_revenue,
revenue - LAG(revenue, 1) OVER (ORDER BY month) AS revenue_change
FROM monthly_sales;
十、其他函数
1. 正则表达式函数 (MySQL 8.0+)
REGEXP_LIKE()
判断字符串是否匹配正则表达式。
sql
SELECT * FROM users WHERE REGEXP_LIKE(email, '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$');
REGEXP_REPLACE()
替换匹配正则表达式的子串。
sql
SELECT REGEXP_REPLACE(phone_number, '[^0-9]', '') AS clean_phone FROM contacts;
2. UUID()函数
UUID() 是 MySQL 提供的用于生成通用唯一标识符(Universally Unique Identifier)的函数,它返回一个符合 RFC 4122 标准的 128 位唯一值。
sql
-- 返回一个 36 字符长的字符串: 'c3b4c9d7-7e8f-11ee-9439-0242ac120002'
SELECT UUID();
-- 为会话生成唯一ID
INSERT INTO user_sessions (session_id, user_id, created_at)
VALUES (UUID(), 123, NOW());