SQL函数
SQL 函数涵盖了从基本的字符串处理、日期操作,到复杂的条件判断、聚合计算和 JSON 数据处理等多种应用场景。灵活运用这些函数,可以大大提高数据库查询的效率和可读性。
1. 字符串函数
-
CONCAT(str1, str2, ..., strN)
将多个字符串连接成一个新的字符串。
示例:CONCAT('Hello', ' ', 'World')
结果:Hello World
-
SUBSTRING(str, start, length)
从字符串str
中提取子字符串,从start
位置开始,提取length
个字符。
示例:SUBSTRING('Hello World', 1, 5)
结果:Hello
-
LENGTH(str)
返回字符串str
的长度(字符数)。
示例:LENGTH('Hello')
结果:5
-
UPPER(str)
将字符串str
转换为大写。
示例:UPPER('hello')
结果:HELLO
-
LOWER(str)
将字符串str
转换为小写。
示例:LOWER('HELLO')
结果:hello
-
TRIM(str)
去掉字符串str
两端的空格。
示例:TRIM(' Hello ')
结果:Hello
-
REPLACE(str, old_substr, new_substr)
将字符串str
中的old_substr
替换为new_substr
。
示例:REPLACE('Hello World', 'World', 'SQL')
结果:Hello SQL
-
INSTR(str, substring)
返回子字符串substring
在字符串str
中首次出现的位置(位置从 1 开始)。
示例:INSTR('Hello World', 'World')
结果:7
-
CONCAT_WS(separator, str1, str2, ..., strN)
用分隔符separator
将多个字符串连接起来。
示例:CONCAT_WS('-', '2024', '12', '07')
结果:2024-12-07
2. 日期和时间函数
-
CURDATE()
返回当前的日期(不包括时间部分)。
示例:CURDATE()
结果:2024-12-07
-
NOW()
返回当前的日期和时间。
示例:NOW()
结果:2024-12-07 12:34:56
-
DATE_ADD(date, INTERVAL value unit)
向date
添加指定的时间间隔value
和单位unit
(如:DAY, MONTH, YEAR)。
示例:DATE_ADD('2024-12-07', INTERVAL 7 DAY)
结果:2024-12-14
-
DATE_SUB(date, INTERVAL value unit)
从date
中减去指定的时间间隔。
示例:DATE_SUB('2024-12-07', INTERVAL 7 DAY)
结果:2024-11-30
-
DATEDIFF(date1, date2)
返回两个日期之间的天数差。
示例:DATEDIFF('2024-12-07', '2024-12-01')
结果:6
-
DATE_FORMAT(date, format)
根据指定的格式将date
转换为字符串。
示例:DATE_FORMAT('2024-12-07', '%Y-%m-%d')
结果:2024-12-07
-
STR_TO_DATE(str, format)
将字符串str
转换为日期,根据给定的格式format
。
示例:STR_TO_DATE('2024-12-07', '%Y-%m-%d')
结果:2024-12-07
-
MONTH(date)
返回日期中的月份。
示例:MONTH('2024-12-07')
结果:12
-
DAY(date)
返回日期中的天数。
示例:DAY('2024-12-07')
结果:7
YEAR(date)
返回日期中的年份
TIMESTAMPDIFF(unit, datetime1, datetime2)
计算两个日期/时间之间的差异,可以指定具体的单位(如年、月、天、小时、分钟、秒)
示例:TIMESTAMPDIFF(YEAR, '1990-01-01', '2024-12-01')
3. 数学函数
-
ABS(number)
返回数字number
的绝对值。
示例:ABS(-5)
结果:5
-
ROUND(number, decimals)
将数字number
四舍五入到decimals
位小数。
示例:ROUND(3.14159, 2)
结果:3.14
-
CEIL(number)
返回大于或等于number
的最小整数(向上取整)。
示例:CEIL(3.2)
结果:4
-
FLOOR(number)
返回小于或等于number
的最大整数(向下取整)。
示例:FLOOR(3.7)
结果:3
-
RAND()
返回一个介于 0 到 1 之间的随机数。
示例:RAND()
结果:0.7642
(每次执行会返回不同的值) -
POW(base, exponent)
返回base
的exponent
次方。
示例:POW(2, 3)
结果:8
4. 聚合函数
-
COUNT(*)
计算行数。
示例:SELECT COUNT(*) FROM table_name;
-
SUM(column)
返回列column
的总和。
示例:SELECT SUM(price) FROM products;
-
AVG(column)
返回列column
的平均值。
示例:SELECT AVG(age) FROM employees;
-
MAX(column)
返回列column
的最大值。
示例:SELECT MAX(price) FROM products;
-
MIN(column)
返回列column
的最小值。
示例:SELECT MIN(price) FROM products;
5. 条件函数
-
IF(condition, true_value, false_value)
根据条件condition
的真假返回不同的值。
示例:IF(age > 18, 'Adult', 'Minor')
-
CASE WHEN ... THEN ... ELSE ... END
在多个条件下选择性地返回值。
示例:CASE WHEN age < 18 THEN 'Minor' WHEN age >= 18 AND age <= 60 THEN 'Adult' ELSE 'Senior' END
6. 其他函数
-
ISNULL(expression)
检查表达式是否为NULL
,如果是返回TRUE
,否则返回FALSE
。
示例:ISNULL(age)
结果:FALSE
(假设age
不为NULL
) -
COALESCE(expr1, expr2, ..., exprN)
返回第一个非NULL
的表达式值。
示例:COALESCE(NULL, NULL, 'First Non-Null')
结果:'First Non-Null'
-
CONVERT(expr, type)
将expr
转换为指定的type
类型。
示例:CONVERT('2024-12-07', DATE)
结果:2024-12-07
-
GROUP_CONCAT(expression)
将分组中的值连接为一个字符串。
示例:SELECT GROUP_CONCAT(name) FROM employees GROUP BY department;
7. 窗口函数(Window Functions)
窗口函数在进行查询时可以对数据进行“分组”的操作,但不同于聚合函数,窗口函数不改变查询结果的行数。
-
ROW_NUMBER()
为结果集中的每一行分配一个唯一的序号。
示例:SELECT name, ROW_NUMBER() OVER (ORDER BY age DESC) as rank FROM employees;
-
RANK()
返回分配给每行的排名(在相同排名时跳过数字)。
示例:SELECT name, RANK() OVER (ORDER BY age DESC) as rank FROM employees;
-
DENSE_RANK()
返回分配给每行的排名(在相同排名时不会跳过数字)。
示例:SELECT name, DENSE_RANK() OVER (ORDER BY age DESC) as rank FROM employees;
-
NTILE(n)
将结果集分为n
个等份,并为每行分配一个表示该分组的值。
示例:SELECT name, NTILE(4) OVER (ORDER BY age) as quartile FROM employees;
-
LEAD(expr, offset, default)
返回当前行之后的某行数据。
示例:SELECT name, LEAD(salary, 1) OVER (ORDER BY salary) AS next_salary FROM employees;
-
LAG(expr, offset, default)
返回当前行之前的某行数据。
示例:SELECT name, LAG(salary, 1) OVER (ORDER BY salary) AS previous_salary FROM employees;
8. 集合函数
集合函数用于操作多个值(如数组、集合、行等)。
-
UNION
合并两个或多个查询的结果集,并去除重复项。
示例:SELECT name FROM employees WHERE department = 'HR' UNION SELECT name FROM employees WHERE department = 'IT';
-
UNION ALL
合并两个或多个查询的结果集,但不去除重复项。
示例:SELECT name FROM employees WHERE department = 'HR' UNION ALL SELECT name FROM employees WHERE department = 'IT';
-
INTERSECT
返回两个查询结果集的交集。
示例:SELECT name FROM employees WHERE department = 'HR' INTERSECT SELECT name FROM employees WHERE department = 'IT';
-
EXCEPT (或 MINUS)
返回第一个查询结果集与第二个查询结果集之间的差集。
示例:SELECT name FROM employees WHERE department = 'HR' EXCEPT SELECT name FROM employees WHERE department = 'IT';
9. 条件与判断函数
-
IFNULL(expr, value)
如果expr
为NULL
,返回value
,否则返回expr
。
示例:SELECT IFNULL(age, 0) FROM employees;
-
NULLIF(expr1, expr2)
如果expr1
和expr2
相等,返回NULL
,否则返回expr1
。
示例:SELECT NULLIF(age, 30) FROM employees;
-
CASE WHEN ... THEN ... ELSE ... END
用于实现更复杂的条件判断。
示例:SELECT name, CASE WHEN age < 18 THEN 'Minor' WHEN age >= 18 AND age <= 60 THEN 'Adult' ELSE 'Senior' END as age_group FROM employees;
10. 类型转换函数
-
CAST(expr AS type)
将表达式expr
转换为指定的类型type
。
示例:SELECT CAST(age AS CHAR) FROM employees;
-
CONVERT(expr, type)
与CAST()
相似,用于类型转换。
示例:SELECT CONVERT(age, CHAR) FROM employees;
11. 聚合函数扩展
-
GROUP_CONCAT(expression)
将分组中的值连接成一个字符串,并用逗号或指定分隔符分隔。
示例:SELECT department, GROUP_CONCAT(name) FROM employees GROUP BY department;
-
BIT_AND(expression)
对所有行计算与运算。
示例:SELECT BIT_AND(flags) FROM users;
-
BIT_OR(expression)
对所有行计算或运算。
示例:SELECT BIT_OR(flags) FROM users;
-
STDDEV(expression)
返回expression
的标准差。
示例:SELECT STDDEV(age) FROM employees;
-
VARIANCE(expression)
返回expression
的方差。
示例:SELECT VARIANCE(age) FROM employees;
12. JSON函数
在支持 JSON 数据类型的数据库(如 MySQL 5.7+)中,可以使用一些特殊的函数来操作 JSON 数据。
-
JSON_OBJECT(key1, value1, key2, value2, ...)
创建一个 JSON 对象。
示例:SELECT JSON_OBJECT('name', 'John', 'age', 30);
-
JSON_ARRAY(value1, value2, ...)
创建一个 JSON 数组。
示例:SELECT JSON_ARRAY('apple', 'banana', 'cherry');
-
JSON_EXTRACT(json_doc, path)
从 JSON 文档中提取数据。
示例:SELECT JSON_EXTRACT('{"name": "John", "age": 30}', '$.name');
-
JSON_UNQUOTE(json_doc)
去掉 JSON 字符串中的引号。
示例:SELECT JSON_UNQUOTE('\"John\"');
-
JSON_SET(json_doc, path, value)
在 JSON 文档中设置某个路径的值。
示例:SELECT JSON_SET('{"name": "John"}', '$.age', 30);
13. 其他常见函数
-
UUID()
生成一个唯一的标识符(UUID)。
示例:SELECT UUID();
-
LAST_INSERT_ID()
返回最后插入的自增 ID。
示例:INSERT INTO employees (name, age) VALUES ('John', 30); SELECT LAST_INSERT_ID();
-
IFNULL(expr, value)
如果expr
是NULL
,则返回value
,否则返回expr
。
示例:SELECT IFNULL(age, 'Unknown') FROM employees;
更多推荐
所有评论(0)