SQL 函数(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在数据库开发与数据分析领域,SQL 函数如同一把多功能的瑞士军刀,能够帮助开发者高效地处理、转换和分析数据。无论是统计用户行为、计算订单金额,还是解析文本信息,SQL 函数都能提供简洁而强大的解决方案。本文将从基础到进阶,结合实际案例,系统性地讲解 SQL 函数的核心概念、分类及应用场景,帮助读者掌握这一工具的精髓。


一、SQL 函数的定义与分类

1.1 什么是 SQL 函数?

SQL 函数是预定义的代码块,用于执行特定操作并返回结果。它们简化了复杂的逻辑编写,例如计算数值、操作字符串、处理日期时间等。根据功能和调用方式,SQL 函数主要分为两类:

  • 内置函数:数据库系统自带的函数,如 COUNT()SUM()CONCAT() 等。
  • 用户自定义函数(UDF):开发者根据需求自行编写并注册的函数,通常用于复用复杂逻辑。

1.2 函数的分类逻辑

根据功能不同,SQL 函数可分为以下四类:
| 类型 | 描述 | 典型示例 |
|--------------|--------------------------------|----------------------|
| 聚合函数 | 对多行数据进行计算,返回单个值 | AVG(), MAX() |
| 字符串函数 | 操作和处理文本数据 | CONCAT(), SUBSTR() |
| 日期函数 | 处理日期和时间数据 | DATE_ADD(), NOW() |
| 条件函数 | 根据条件返回不同结果 | CASE, IF() |


二、核心 SQL 函数详解与案例

2.1 聚合函数:数据的“统计大师”

聚合函数是 SQL 中最基础且常用的工具,用于对数据集进行统计分析。例如:

  • COUNT():统计行数。
    SELECT COUNT(*) FROM orders;  -- 统计所有订单数量  
    
  • SUM():计算数值列的总和。
    SELECT SUM(price) FROM products;  -- 统计所有商品的总价格  
    
  • AVG():计算数值列的平均值。
    SELECT AVG(salary) FROM employees WHERE department = 'Sales';  
    

比喻:聚合函数就像一个“数据汇总器”,能快速将海量数据浓缩成关键指标,帮助决策者快速了解业务状态。

2.2 字符串函数:文本处理的“瑞士军刀”

字符串函数用于操作文本数据,常见的包括:

  • CONCAT():合并字符串。
    SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;  
    
  • SUBSTR():截取子字符串(不同数据库可能用 SUBSTRING)。
    SELECT SUBSTR(phone_number, 4) FROM customers;  -- 截取电话号码第4位后的部分  
    
  • LENGTH():获取字符串长度。
    SELECT LENGTH(description) FROM products WHERE LENGTH(description) > 100;  
    

案例:假设有一个订单表,需要提取订单号中的年份:

SELECT SUBSTR(order_id, 1, 4) AS year_part FROM orders;  

2.3 日期函数:时间管理的“精准工具”

日期函数用于操作日期和时间,例如:

  • CURDATE():获取当前日期。
  • DATE_ADD():对日期进行加减运算。
    SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH) AS next_month;  -- 返回2023-02-01  
    
  • DATEDIFF():计算两个日期的间隔天数。
    SELECT DATEDIFF(end_date, start_date) FROM projects;  
    

比喻:日期函数如同一个“时间计算器”,能帮助开发者轻松处理时间相关的业务逻辑,如计算用户注册天数或订单有效期。

2.4 条件函数:逻辑判断的“智能开关”

条件函数根据条件返回不同结果,常用的是 CASEIF

  • CASE 函数:多条件分支判断。
    SELECT product_name,  
           CASE  
               WHEN price > 1000 THEN 'High'  
               WHEN price BETWEEN 500 AND 1000 THEN 'Medium'  
               ELSE 'Low'  
           END AS price_level  
    FROM products;  
    
  • IF 函数:简单条件判断(部分数据库如 MySQL 支持)。
    SELECT IF(age >= 18, 'Adult', 'Minor') FROM users;  
    

案例:根据订单金额划分客户等级:

SELECT customer_id,  
       CASE  
           WHEN total > 5000 THEN 'VIP'  
           WHEN total > 1000 THEN 'Regular'  
           ELSE 'New'  
       END AS customer_level  
FROM orders;  

三、进阶技巧:提升 SQL 函数的实用性

3.1 窗口函数:数据分组的“透视镜”

窗口函数(Window Functions)允许在结果集内对数据进行分组计算,同时保留原始行。例如:

  • ROW_NUMBER():为每行分配唯一序号。
    SELECT *, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank  
    FROM employees;  
    
  • SUM() 结合窗口:计算累计销售额。
    SELECT order_date,  
           SUM(amount) OVER (ORDER BY order_date) AS cumulative_sales  
    FROM sales;  
    

比喻:窗口函数如同“数据透视表”,能在不丢失原始数据的情况下,为每行添加动态计算的指标。

3.2 用户自定义函数(UDF):定制化逻辑的“扩展器”

当内置函数无法满足需求时,可创建 UDF。例如,计算字符串的 MD5 值:

-- MySQL 示例  
DELIMITER $$  
CREATE FUNCTION GenerateMD5(input TEXT)  
RETURNS VARCHAR(32)  
DETERMINISTIC  
BEGIN  
    RETURN MD5(input);  
END$$  
DELIMITER ;  

调用方式:

SELECT GenerateMD5('hello') AS md5_result;  

3.3 函数的嵌套与组合:构建复杂逻辑

通过嵌套多个函数,可实现更复杂的操作。例如,提取订单号中的年份并格式化:

SELECT CONCAT('Year: ', SUBSTR(order_id, 1, 4)) AS formatted_year FROM orders;  

四、实战案例:电商数据分析

4.1 案例背景

假设有一个电商数据库,包含 orders(订单)、products(商品)、customers(客户)三张表,需完成以下任务:

  1. 统计各地区订单的平均金额。
  2. 根据订单日期生成“季度”维度。
  3. 过滤出商品名称包含“智能”的产品。

4.2 SQL 实现

-- 1. 统计各地区平均订单金额  
SELECT region,  
       AVG(total_amount) AS avg_order_value  
FROM orders  
GROUP BY region;  

-- 2. 生成季度维度  
SELECT order_date,  
       CONCAT(YEAR(order_date), '-', QUARTER(order_date)) AS quarter  
FROM orders;  

-- 3. 过滤商品名称  
SELECT *  
FROM products  
WHERE product_name LIKE '%智能%';  

4.3 结果解读

通过上述查询,可以快速生成地区销售分析报告、时间维度数据,以及特定商品列表,为市场策略提供数据支持。


结论

SQL 函数是数据库开发中的核心工具,其功能覆盖数据统计、文本处理、时间计算等多个维度。通过掌握基础函数(如 COUNT()SUBSTR())和进阶技巧(如窗口函数、UDF),开发者能够高效地解决实际业务问题。无论是分析销售数据、优化查询性能,还是构建复杂逻辑,SQL 函数都能提供简洁而强大的支持。建议读者通过动手实践,结合具体场景反复练习,逐步将这些函数内化为自己的技能库。


通过本文的系统性讲解,希望读者能建立起对 SQL 函数 的清晰认知,并在实际项目中灵活运用这些工具,提升数据处理的效率与准确性。

最新发布