在SQL(Structured Query Language)中,函数是执行特定任务、返回结果集的强大工具。它们可以简化查询语句,提高数据处理的效率和准确性。根据功能和用途的不同,SQL中的函数大致可以分为几大类:聚合函数、标量函数、字符串函数、数值函数、日期和时间函数、条件函数(或称为逻辑函数)、窗口函数等。本章节将详细探讨这些不同类型的函数及其应用场景。
聚合函数主要用于对一组值执行计算,并返回单个值。这类函数在数据分析和报表生成中尤为重要。常见的聚合函数包括:
COUNT():计算行数或特定列中非NULL值的数量。
SELECT COUNT(*) FROM employees;
计算员工表中的总行数。SELECT COUNT(department_id) FROM employees;
计算有部门ID的员工数量。SUM():计算数值列中值的总和。
SELECT SUM(salary) FROM employees;
计算员工总薪资。AVG():计算数值列的平均值。
SELECT AVG(salary) FROM employees;
计算员工平均薪资。MAX() 和 MIN():分别返回列中的最大值和最小值。
SELECT MAX(salary) FROM employees;
找出最高薪资。SELECT MIN(hire_date) FROM employees;
找出最早的入职日期。标量函数对输入参数执行操作,并返回单个值。这些函数可以应用于SELECT语句的SELECT列表、WHERE子句、ORDER BY子句等地方。根据返回值的类型,标量函数可以进一步细分为字符串函数、数值函数、日期和时间函数等,但在此处我们将其视为一个独立类别讨论。
SELECT LOWER(name) FROM employees;
将员工姓名转换为小写。字符串函数用于处理文本数据,如拼接、截取、转换等。
CONCAT() 或 ||(在某些数据库中):连接两个或多个字符串。
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
SUBSTRING() 或 MID():从字符串中提取子串。
SELECT SUBSTRING(email, 1, CHARINDEX('@', email) - 1) AS local_part FROM users;
LENGTH() 或 LEN():返回字符串的长度。
SELECT LENGTH(description) FROM products;
REPLACE():替换字符串中的部分文本。
SELECT REPLACE(email, '@olddomain.com', '@newdomain.com') FROM users;
数值函数用于执行数学计算,如四舍五入、取绝对值等。
ROUND():对数值进行四舍五入。
SELECT ROUND(salary, 0) FROM employees;
将薪资四舍五入到整数。FLOOR():返回不大于参数的最大整数。
SELECT FLOOR(salary / 1000) * 1000 FROM employees;
将薪资向下取整到最近的千位数。ABS():返回参数的绝对值。
SELECT ABS(balance) FROM accounts;
日期和时间函数用于处理日期和时间值,如获取当前日期、计算日期差等。
NOW() 或 CURRENT_TIMESTAMP:返回当前的日期和时间。
SELECT NOW();
DATE_ADD() 或 ADDDATE():向日期添加指定的时间间隔。
SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH);
DATEDIFF():计算两个日期之间的天数差。
SELECT DATEDIFF('2023-03-15', '2023-01-01');
YEAR(), MONTH(), DAY():分别提取日期中的年、月、日部分。
SELECT YEAR(birthdate) FROM customers;
条件函数根据条件对值进行评估,并返回相应的结果。最典型的条件函数是CASE
语句,但也有一些内置的逻辑函数,如COALESCE()
。
CASE:基于一系列条件对数据进行转换。
SELECT name, CASE WHEN salary > 5000 THEN 'High' ELSE 'Low' END AS salary_level FROM employees;
COALESCE():返回参数列表中第一个非NULL值。
SELECT COALESCE(first_name, 'Unknown') FROM customers;
窗口函数是SQL 2003标准中引入的一种高级功能,它们允许对一组行执行计算,而不需要将这些行组合成单个输出行。窗口函数通常与OVER()子句一起使用,以指定窗口的分区和排序规则。
ROW_NUMBER():为窗口内的每行分配一个唯一的序号。
SELECT name, department, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees;
RANK() 和 DENSE_RANK():根据排序规则为窗口内的行分配排名,但处理并列的方式不同。
SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM scores;
SUM(), AVG() 等聚合函数作为窗口函数使用时,可以在不分组的情况下计算累计总和或平均值。
SELECT name, salary, SUM(salary) OVER (PARTITION BY department ORDER BY hire_date) AS cumulative_salary FROM employees;
SQL中的函数种类繁多,每种函数都有其特定的用途和优势。通过合理使用这些函数,可以极大地提高SQL查询的灵活性和效率。无论是进行简单的数据检索,还是进行复杂的数据分析和报表生成,掌握这些函数都是必不可少的。希望本章内容能帮助读者更好地理解SQL函数的种类及其应用,为后续的数据库管理和数据分析工作打下坚实的基础。