SQL 函数概述
SQL 函数可以分为几大类,不同数据库系统可能有略微不同的实现。以下是主要的 SQL 函数分类:
1. 聚合函数 (Aggregate Functions)
-
COUNT()
- 计算行数 -
SUM()
- 计算总和 -
AVG()
- 计算平均值 -
MIN()
- 找最小值 -
MAX()
- 找最大值 -
GROUP_CONCAT()
(MySQL) /STRING_AGG()
(SQL Server, PostgreSQL) - 连接字符串 -
STDDEV()
/STDDEV_POP()
- 计算标准差 -
VARIANCE()
/VAR_POP()
- 计算方差
2. 标量函数 (Scalar Functions)
字符串函数
-
CONCAT()
- 连接字符串 -
SUBSTRING()
/SUBSTR()
- 提取子字符串 -
TRIM()
- 去除空格 -
UPPER()
/UCASE()
- 转为大写 -
LOWER()
/LCASE()
- 转为小写 -
LENGTH()
/LEN()
- 字符串长度 -
REPLACE()
- 替换字符串 -
LEFT()
/RIGHT()
- 获取左/右部分字符串
数学函数
-
ABS()
- 绝对值 -
ROUND()
- 四舍五入 -
CEIL()
/CEILING()
- 向上取整 -
FLOOR()
- 向下取整 -
MOD()
- 取模 -
POWER()
/POW()
- 幂运算 -
SQRT()
- 平方根 -
RAND()
- 随机数
日期和时间函数
-
NOW()
/CURRENT_TIMESTAMP
- 当前日期时间 -
CURDATE()
/CURRENT_DATE
- 当前日期 -
CURTIME()
/CURRENT_TIME
- 当前时间 -
DATE()
- 提取日期部分 -
TIME()
- 提取时间部分 -
YEAR()
/MONTH()
/DAY()
- 提取年/月/日 -
DATEDIFF()
- 计算日期差 -
DATE_ADD()
/DATE_SUB()
- 日期加减 -
DAYNAME()
/MONTHNAME()
- 获取星期/月份名称
转换函数
-
CAST()
- 类型转换 -
CONVERT()
- 类型转换 -
COALESCE()
- 返回第一个非NULL值 -
NULLIF()
- 两值相等返回NULL
条件函数
-
CASE WHEN...THEN...ELSE...END
- 条件表达式 -
IF()
(MySQL) - 简单条件判断 -
IIF()
(SQL Server) - 简单条件判断 -
DECODE()
(Oracle) - 值匹配判断
3. 窗口函数 (Window Functions)
-
ROW_NUMBER()
- 行号 -
RANK()
- 排名(有间隔) -
DENSE_RANK()
- 排名(无间隔) -
NTILE()
- 分组排名 -
LEAD()
/LAG()
- 访问前后行数据 -
FIRST_VALUE()
/LAST_VALUE()
- 窗口首/尾值 -
PERCENT_RANK()
- 百分比排名 -
CUME_DIST()
- 累积分布
4. 系统函数
-
USER()
/CURRENT_USER
- 当前用户 -
DATABASE()
- 当前数据库 -
VERSION()
- 数据库版本 -
LAST_INSERT_ID()
(MySQL) - 最后插入的ID
完整的SQL函数分类及使用示例
-
一、聚合函数 (Aggregate Functions)
1. COUNT()
sql
-- 计算所有行数 SELECT COUNT(*) FROM products;-- 计算特定列非NULL值 SELECT COUNT(product_name) FROM products;-- 计算不同值的数量 SELECT COUNT(DISTINCT category_id) FROM products;
2. SUM()
sql
-- 计算总和 SELECT SUM(quantity) FROM inventory;-- 带条件的求和 SELECT SUM(price) FROM orders WHERE order_date > '2023-01-01';
3. AVG()
sql
-- 计算平均值 SELECT AVG(rating) FROM product_reviews;-- 结合ROUND函数 SELECT ROUND(AVG(salary), 2) FROM employees;
4. MIN()/MAX()
sql
复制
-- 最小值和最大值 SELECT MIN(price), MAX(price) FROM products;-- 日期最值 SELECT MIN(hire_date), MAX(hire_date) FROM employees;
5. GROUP_CONCAT()/STRING_AGG()
sql
-- MySQL SELECT department_id, GROUP_CONCAT(employee_name SEPARATOR '; ') FROM employees GROUP BY department_id;-- SQL Server/PostgreSQL SELECT department_id, STRING_AGG(employee_name, '; ') FROM employees GROUP BY department_id;
6. STDDEV()/VARIANCE()
sql
-- 标准差和方差 SELECT STDDEV(salary), VARIANCE(salary) FROM employees;
二、标量函数 (Scalar Functions)
字符串函数
1. CONCAT()
sql
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM customers;
2. SUBSTRING()/SUBSTR()
sql
SELECT SUBSTRING('Database', 1, 4); -- 返回'Data' SELECT SUBSTR(email, 1, POSITION('@' IN email)-1) AS username FROM users;
3. TRIM()
sql
SELECT TRIM(' SQL '); -- 返回'SQL' SELECT TRIM(BOTH 'x' FROM 'xxSQLxx'); -- 返回'SQL'
4. UPPER()/LOWER()
sql
SELECT UPPER('Hello'); -- 'HELLO' SELECT LOWER('SQL'); -- 'sql'
5. LENGTH()/LEN()
sql
-- MySQL/PostgreSQL SELECT LENGTH('SQL'); -- 3-- SQL Server SELECT LEN('SQL'); -- 3
6. REPLACE()
sql
SELECT REPLACE('Hello World', 'World', 'SQL'); -- 'Hello SQL'
7. LEFT()/RIGHT()
sql
SELECT LEFT('Database', 4); -- 'Data' SELECT RIGHT('Database', 3); -- 'ase'
数学函数
1. ABS()
sql
SELECT ABS(-15); -- 15
2. ROUND()
sql
SELECT ROUND(123.4567, 2); -- 123.46
3. CEIL()/CEILING()/FLOOR()
sql
SELECT CEIL(123.45); -- 124 SELECT FLOOR(123.45); -- 123
4. MOD()
sql
SELECT MOD(10, 3); -- 1 (10除以3的余数)
5. POWER()/POW()
sql
SELECT POWER(2, 3); -- 8 (2的3次方)
6. SQRT()
sql
SELECT SQRT(25); -- 5
7. RAND()
sql
-- 生成0-1之间的随机数 SELECT RAND();-- 生成1-100的随机整数(MySQL) SELECT FLOOR(1 + RAND() * 100);
日期和时间函数
1. NOW()/CURRENT_TIMESTAMP
sql
SELECT NOW(); -- 返回当前日期时间 '2023-10-25 15:30:45'
2. CURDATE()/CURRENT_DATE
sql
SELECT CURDATE(); -- '2023-10-25'
3. CURTIME()/CURRENT_TIME
sql
SELECT CURTIME(); -- '15:30:45'
4. DATE()/TIME()
sql
SELECT DATE('2023-10-25 15:30:45'); -- '2023-10-25' SELECT TIME('2023-10-25 15:30:45'); -- '15:30:45'
5. YEAR()/MONTH()/DAY()
sql
SELECT YEAR('2023-10-25'); -- 2023 SELECT MONTH('2023-10-25'); -- 10 SELECT DAY('2023-10-25'); -- 25
6. DATEDIFF()
sql
-- MySQL SELECT DATEDIFF('2023-12-31', '2023-10-25'); -- 67-- SQL Server SELECT DATEDIFF(day, '2023-10-25', '2023-12-31');
7. DATE_ADD()/DATE_SUB()
sql
-- MySQL SELECT DATE_ADD('2023-10-25', INTERVAL 7 DAY); -- '2023-11-01'-- SQL Server SELECT DATEADD(day, 7, '2023-10-25');
8. DAYNAME()/MONTHNAME()
sql
SELECT DAYNAME('2023-10-25'); -- 'Wednesday' SELECT MONTHNAME('2023-10-25'); -- 'October'
转换函数
1. CAST()/CONVERT()
sql
SELECT CAST('123' AS SIGNED); -- 字符串转整数 SELECT CONVERT('2023-10-25', DATE); -- 字符串转日期
2. COALESCE()
sql
SELECT COALESCE(NULL, NULL, 'SQL', NULL, 'Example'); -- 'SQL'
3. NULLIF()
sql
SELECT NULLIF(10, 10); -- NULL SELECT NULLIF(10, 20); -- 10
条件函数
1. CASE WHEN
sql
SELECT product_id,price,CASE WHEN price > 100 THEN 'Expensive'WHEN price > 50 THEN 'Moderate'ELSE 'Cheap'END AS price_category FROM products;
2. IF() (MySQL)
sql
SELECT IF(1 > 0, 'True', 'False'); -- 'True'
3. IIF() (SQL Server)
sql
SELECT IIF(1 > 0, 'True', 'False'); -- 'True'
4. DECODE() (Oracle)
sql
SELECT DECODE(status, 1, 'Active', 0, 'Inactive', 'Unknown') FROM users;
三、窗口函数 (Window Functions)
1. ROW_NUMBER()
sql
SELECT employee_id,salary,ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank FROM employees;
2. RANK()/DENSE_RANK()
sql
SELECT product_id,sales,RANK() OVER (ORDER BY sales DESC) AS rank,DENSE_RANK() OVER (ORDER BY sales DESC) AS dense_rank FROM products;
3. NTILE()
sql
SELECT customer_id,total_purchases,NTILE(4) OVER (ORDER BY total_purchases DESC) AS quartile FROM customers;
4. LEAD()/LAG()
sql
SELECT date,revenue,LAG(revenue, 1) OVER (ORDER BY date) AS prev_day_revenue,LEAD(revenue, 1) OVER (ORDER BY date) AS next_day_revenue FROM daily_sales;
5. FIRST_VALUE()/LAST_VALUE()
sql
SELECT department_id,employee_id,salary,FIRST_VALUE(employee_id) OVER (PARTITION BY department_id ORDER BY salary DESC) AS highest_paid FROM employees;
6. PERCENT_RANK()/CUME_DIST()
sql
SELECT student_id,score,PERCENT_RANK() OVER (ORDER BY score) AS percentile,CUME_DIST() OVER (ORDER BY score) AS cumulative_dist FROM exam_results;
四、系统函数
1. USER()/CURRENT_USER
sql
SELECT USER(); -- 'root@localhost'
2. DATABASE()
sql
SELECT DATABASE(); -- 返回当前数据库名
3. VERSION()
sql
SELECT VERSION(); -- '8.0.26'
4. LAST_INSERT_ID() (MySQL)
sql
-- 获取最后插入的自动增量ID SELECT LAST_INSERT_ID();