Skip to content

SQL 函数

SQL 函数是用于执行特定操作的内置或自定义的代码块,它们可以接收输入参数并返回一个结果。SQL 函数在查询中非常有用,可以用于数据转换、计算、格式化等操作。

函数类型

SQL 函数主要分为以下几类:

  1. 聚合函数:对一组值执行计算并返回单个值,如 SUM()AVG()COUNT() 等。

  2. 标量函数:对单个值执行操作并返回单个值,如 UPPER()LOWER()LENGTH() 等。

  3. 日期函数:用于处理日期和时间值,如 CURRENT_DATEDATE_ADD()DATEDIFF() 等。

  4. 字符串函数:用于处理字符串值,如 CONCAT()SUBSTRING()REPLACE() 等。

  5. 数值函数:用于处理数值,如 ABS()ROUND()CEIL() 等。

  6. 系统函数:返回系统信息,如 USER()DATABASE() 等。

常用函数

1. 聚合函数

函数名描述示例结果
SUM()计算列值的总和SELECT SUM(age) FROM students;总和值
AVG()计算列值的平均值SELECT AVG(age) FROM students;平均值
COUNT()计算行数SELECT COUNT(*) FROM students;行数
COUNT(DISTINCT)计算不同值的数量SELECT COUNT(DISTINCT grade) FROM students;不同值的数量
MAX()计算列值的最大值SELECT MAX(age) FROM students;最大值
MIN()计算列值的最小值SELECT MIN(age) FROM students;最小值

2. 标量函数

函数名描述示例结果
UPPER()将字符串转换为大写SELECT UPPER(name) FROM students;大写字符串
LOWER()将字符串转换为小写SELECT LOWER(name) FROM students;小写字符串
LENGTH()计算字符串的长度SELECT LENGTH(name) FROM students;字符串长度
TRIM()去除字符串两端的空格SELECT TRIM(name) FROM students;去除空格后的字符串
SUBSTRING()提取字符串的子串SELECT SUBSTRING(name, 1, 2) FROM students;子字符串
CONCAT()连接多个字符串SELECT CONCAT(name, ' - ', grade) FROM students;连接后的字符串
REPLACE()替换字符串中的子串SELECT REPLACE(name, '张', '李') FROM students;替换后的字符串

3. 数值函数

函数名描述示例结果
ABS()计算绝对值SELECT ABS(-10) FROM dual;10
ROUND()四舍五入SELECT ROUND(3.14159, 2) FROM dual;3.14
CEIL()向上取整SELECT CEIL(3.14) FROM dual;4
FLOOR()向下取整SELECT FLOOR(3.99) FROM dual;3
MOD()计算模运算SELECT MOD(10, 3) FROM dual;1
POWER()计算幂运算SELECT POWER(2, 3) FROM dual;8
SQRT()计算平方根SELECT SQRT(16) FROM dual;4

4. 日期函数

函数名描述示例结果
CURRENT_DATE获取当前日期SELECT CURRENT_DATE;2023-10-01
CURRENT_TIMESTAMP获取当前日期和时间SELECT CURRENT_TIMESTAMP;2023-10-01 14:30:45
DATE_ADD()添加日期/时间间隔SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);2023-10-02
DATEDIFF()计算两个日期之间的差值SELECT DATEDIFF('2023-10-05', '2023-10-01');4
DATE_FORMAT()格式化日期SELECT DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d');2023-10-01

示例

示例 1:使用聚合函数

假设我们有以下 students 表:

idnameagegradescore
1张三18高三95
2李四17高二92
3王五16高一85
4赵六18高三88
5钱七17高二90
sql
-- 计算学生的平均年龄
SELECT AVG(age) AS average_age
FROM students;

-- 计算学生的平均分数
SELECT AVG(score) AS average_score
FROM students;

-- 计算每个年级的学生数量
SELECT grade, COUNT(*) AS student_count
FROM students
GROUP BY grade
ORDER BY grade;

-- 计算每个年级的平均分数
SELECT grade, AVG(score) AS average_score
FROM students
GROUP BY grade
ORDER BY grade;

-- 计算分数最高的学生
SELECT name, score
FROM students
WHERE score = (SELECT MAX(score) FROM students);

-- 计算分数最低的学生
SELECT name, score
FROM students
WHERE score = (SELECT MIN(score) FROM students);

示例 2:使用标量函数

sql
-- 将学生姓名转换为大写
SELECT UPPER(name) AS upper_name
FROM students;

-- 将学生姓名转换为小写
SELECT LOWER(name) AS lower_name
FROM students;

-- 计算学生姓名的长度
SELECT name, LENGTH(name) AS name_length
FROM students;

-- 提取学生姓名的前两个字符
SELECT name, SUBSTRING(name, 1, 2) AS name_prefix
FROM students;

-- 连接学生姓名和年级
SELECT CONCAT(name, ' - ', grade) AS student_info
FROM students;

-- 替换学生姓名中的特定字符
SELECT name, REPLACE(name, '张', '李') AS replaced_name
FROM students;

示例 3:使用数值函数

sql
-- 计算绝对值
SELECT ABS(-10) AS absolute_value;

-- 四舍五入
SELECT ROUND(3.14159, 2) AS rounded_value;

-- 向上取整
SELECT CEIL(3.14) AS ceiling_value;

-- 向下取整
SELECT FLOOR(3.99) AS floor_value;

-- 计算模运算
SELECT MOD(10, 3) AS mod_value;

-- 计算幂运算
SELECT POWER(2, 3) AS power_value;

-- 计算平方根
SELECT SQRT(16) AS sqrt_value;

示例 4:使用日期函数

sql
-- 获取当前日期
SELECT CURRENT_DATE AS current_date;

-- 获取当前日期和时间
SELECT CURRENT_TIMESTAMP AS current_timestamp;

-- 添加日期
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 7 DAY) AS next_week;

-- 减去日期
SELECT DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH) AS last_month;

-- 计算两个日期之间的天数
SELECT DATEDIFF('2023-12-31', CURRENT_DATE) AS days_until_new_year;

-- 格式化日期
SELECT DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d') AS formatted_date;
SELECT DATE_FORMAT(CURRENT_DATE, '%d/%m/%Y') AS formatted_date2;
SELECT DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-%d %H:%i:%s') AS formatted_datetime;

示例 5:组合使用多个函数

sql
-- 组合使用字符串函数
SELECT 
    name, 
    CONCAT(UPPER(SUBSTRING(name, 1, 1)), LOWER(SUBSTRING(name, 2))) AS formatted_name
FROM students;

-- 组合使用日期函数和数值函数
SELECT 
    CURRENT_DATE AS today, 
    DATE_ADD(CURRENT_DATE, INTERVAL CEIL(RAND() * 10) DAY) AS random_date
FROM dual;

-- 组合使用聚合函数和标量函数
SELECT 
    grade, 
    COUNT(*) AS student_count, 
    CONCAT('平均分数: ', ROUND(AVG(score), 2)) AS average_score_info
FROM students
GROUP BY grade;

注意事项

  1. 函数的参数:不同的函数需要不同的参数,使用时需要注意参数的类型和数量。

  2. 函数的返回值:函数的返回值类型取决于函数本身和输入参数的类型。

  3. NULL 值的处理:大多数函数在处理 NULL 值时会返回 NULL,需要注意处理。

  4. 性能影响:在 WHERE 子句或 JOIN 条件中使用函数可能会影响查询性能,因为函数会对每一行数据进行计算。

  5. 数据库差异:不同的数据库系统可能提供不同的函数,或者函数的名称和参数可能不同。

  6. 自定义函数:除了内置函数外,许多数据库系统还支持创建自定义函数。

小结

SQL 函数是 SQL 语言中的重要组成部分,它们可以用于执行各种操作,如数据转换、计算、格式化等。SQL 函数主要分为聚合函数、标量函数、日期函数、字符串函数、数值函数和系统函数等几类。在使用 SQL 函数时,需要注意函数的参数、返回值、NULL 值的处理、性能影响和数据库差异等问题。合理使用 SQL 函数可以使查询更加简洁、高效和功能强大。