SQL 函数概述
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();
-
-
-
-
-
-
-