MySQL常用内置函数详细介绍

文章目录

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());
相关推荐
慌糖2 小时前
开发当中常见注解备注
数据库·sql
廋到被风吹走2 小时前
【Spring】Spring Boot详细介绍
java·spring boot·spring
小韩博2 小时前
PHP-MySQL 数据请求与 SQL 注入多样性(小迪 43 课笔记整理)
sql·mysql·php
期待のcode2 小时前
Java中的继承
java·开发语言
TAEHENGV2 小时前
关于应用模块 Cordova 与 OpenHarmony 混合开发实战
android·javascript·数据库
赵思空2 小时前
window docker 安装 mysql 数据库,及不能连接问题
数据库·mysql·docker
yinshuilan2 小时前
Postgresql安装配置
数据库·postgresql
计算机毕设指导62 小时前
基于微信小程序的智慧社区娱乐服务管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·娱乐
期待のcode2 小时前
Java中的super关键字
java·开发语言