在SQL的世界里,函数是处理和转换数据的强大工具,它们能够极大地简化复杂查询、提高代码的可读性和执行效率,无论是进行数据统计、字符串操作还是日期计算,掌握SQL函数的使用都是每一位数据库使用者和开发者的必备技能,理解其核心用法,能让我们从数据库中提取出更有价值的信息。

SQL函数种类繁多,但通常可以归为两大主要类别:聚合函数和标量函数。
聚合函数
聚合函数作用于多行数据,并返回一个单一的汇总值,它们常与GROUP BY子句结合使用,对数据进行分组统计。
- COUNT(): 计算行数。
SELECT COUNT(*) FROM employees;会返回employees表中的总员工数。 - SUM(): 计算某一列的总和。
SELECT SUM(salary) FROM employees;返回所有员工的薪资总和。 - AVG(): 计算某一列的平均值。
SELECT AVG(salary) FROM employees;返回平均薪资。 - MAX() / MIN(): 分别返回某一列的最大值和最小值。
SELECT MAX(hire_date), MIN(hire_date) FROM employees;可以查询到最早和最晚的入职日期。 
标量函数
与聚合函数不同,标量函数对单个值进行操作,为每一行输入返回一个单一的值,它们可以进一步细分为字符串函数、数值函数、日期函数等。

字符串函数
- CONCAT(): 连接两个或多个字符串。
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;会将名和姓合并为全名。 - UPPER() / LOWER(): 将字符串转换为大写或小写。
 - LENGTH(): 返回字符串的长度。
 - SUBSTRING(): 从字符串中提取子字符串。
 
数值函数
- ABS(): 返回一个数的绝对值。
 - ROUND(): 对数值进行四舍五入。
 - CEILING() / FLOOR(): 分别返回不小于或不大于给定数值的最小整数。
 
日期和时间函数
- NOW(): 返回当前的日期和时间。
 - CURDATE(): 返回当前的日期。
 - YEAR() / MONTH() / DAY(): 从日期中提取年、月、日部分。
 - DATE_FORMAT(): 按照指定格式显示日期。
 
为了更直观地理解,以下表格小编总结了一些常用函数:
| 函数类别 | 常用函数示例 | 功能描述 | 
|---|---|---|
| 聚合函数 | COUNT(), SUM(), AVG() | 
对一组值进行计算,返回单一汇小编总结果 | 
| 字符串函数 | CONCAT(), UPPER(), SUBSTRING() | 
处理单个字符串值,如连接、大小写转换、截取 | 
| 数值函数 | ROUND(), ABS(), CEILING() | 
对单个数值进行数学运算 | 
| 日期函数 | NOW(), YEAR(), DATE_FORMAT() | 
获取、提取或格式化日期和时间值 | 
函数的实际应用与注意事项
函数可以在SQL语句的多个子句中使用,包括SELECT、WHERE、ORDER BY等,我们可以用WHERE YEAR(hire_date) = 2025;来筛选2025年入职的员工,或用ORDER BY LENGTH(last_name);按姓氏长度排序。
需要注意的是,不同数据库系统(如MySQL, PostgreSQL, SQL Server, Oracle)对某些函数的实现和支持可能略有差异,虽然大多数核心函数是标准化的,但在使用特定或高级函数前,最好查阅相应数据库的官方文档。

相关问答FAQs
问题1:聚合函数和标量函数有什么根本区别? 解答: 根本区别在于它们操作的数据范围和返回的结果数量,聚合函数操作的是一组行(多行数据),经过计算后只返回一个汇总值,例如计算所有员工的平均薪资,而标量函数操作的是单个值(每一行的一个字段),为输入的每一行都返回一个处理后的值,例如将每个员工的姓氏转换为大写。
问题2:如果我想在WHERE子句中使用聚合函数,比如查找薪资高于平均薪资的员工,应该怎么做?
解答: 不能直接在WHERE子句中使用聚合函数,因为WHERE子句在数据分组前执行,而聚合函数在分组后计算,要实现这个需求,应该使用HAVING子句,正确的做法是先通过子查询计算出平均薪资,然后在主查询中比较。
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
或者,如果涉及分组,则使用HAVING,
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 5000;