Appearance
SQL 函数
SQL 函数是用于执行特定操作的内置或自定义的代码块,它们可以接收输入参数并返回一个结果。SQL 函数在查询中非常有用,可以用于数据转换、计算、格式化等操作。
函数类型
SQL 函数主要分为以下几类:
聚合函数:对一组值执行计算并返回单个值,如
SUM()、AVG()、COUNT()等。标量函数:对单个值执行操作并返回单个值,如
UPPER()、LOWER()、LENGTH()等。日期函数:用于处理日期和时间值,如
CURRENT_DATE、DATE_ADD()、DATEDIFF()等。字符串函数:用于处理字符串值,如
CONCAT()、SUBSTRING()、REPLACE()等。数值函数:用于处理数值,如
ABS()、ROUND()、CEIL()等。系统函数:返回系统信息,如
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 表:
| id | name | age | grade | score |
|---|---|---|---|---|
| 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;注意事项
函数的参数:不同的函数需要不同的参数,使用时需要注意参数的类型和数量。
函数的返回值:函数的返回值类型取决于函数本身和输入参数的类型。
NULL 值的处理:大多数函数在处理 NULL 值时会返回 NULL,需要注意处理。
性能影响:在 WHERE 子句或 JOIN 条件中使用函数可能会影响查询性能,因为函数会对每一行数据进行计算。
数据库差异:不同的数据库系统可能提供不同的函数,或者函数的名称和参数可能不同。
自定义函数:除了内置函数外,许多数据库系统还支持创建自定义函数。
小结
SQL 函数是 SQL 语言中的重要组成部分,它们可以用于执行各种操作,如数据转换、计算、格式化等。SQL 函数主要分为聚合函数、标量函数、日期函数、字符串函数、数值函数和系统函数等几类。在使用 SQL 函数时,需要注意函数的参数、返回值、NULL 值的处理、性能影响和数据库差异等问题。合理使用 SQL 函数可以使查询更加简洁、高效和功能强大。