目录
一、引言
二、10 个不可不知的高级 SQL 技巧
(一)窗口函数:数据分析的得力助手
(二)公共表达式(CTEs):让查询更清晰
(三)聚合函数:数据汇总的利器
(四)递归 CTEs:处理分层数据的神器
(五)临时函数:简化代码的好帮手
(六)使用 CASE WHEN 枢转数据:灵活处理数据
(七)EXCEPT vs NOT IN:查询数据的不同方式
(八)自联结:在同一表中查找关联数据
(九)Rank vs Dense Rank vs Row Number:数据排名的不同策略
(十)日期时间操纵:处理时间相关数据
三、总结与展望
作为一个在数据领域摸爬滚打许久的博主,我深知 SQL(Structured Query Language)—— 结构化查询语言,在数据处理与分析中的核心地位。想当初,我也是从对 SQL 一知半解开始,不断学习和实践,才逐渐掌握了这门强大的工具。在这个过程中,我发现仅仅掌握基础的 SQL 语句,如 SELECT、INSERT、UPDATE、DELETE 等,只能应对一些简单的数据操作任务。而当面对复杂的数据场景和业务需求时,高级 SQL 技巧就显得尤为重要。
今天,我就迫不及待地想和大家分享这些高级 SQL 技巧。无论你是数据分析师、数据科学家、数据库管理员,还是对数据处理感兴趣的技术爱好者,掌握这些技巧,都能让你在数据的海洋中更加游刃有余,轻松挖掘出数据背后隐藏的价值。
窗口函数,也叫开窗函数,是 SQL 中一种非常强大的工具。它能在不改变原表结构的情况下,对数据进行分组、排序和计算。与普通聚合函数不同,窗口函数不会将数据合并为一行,而是为每一行返回一个计算结果,就像是在数据的 “窗口” 中进行操作一样。
在实际应用中,窗口函数常用于计算移动平均值、排名、累计总和等。以销售数据为例,假设我们有一个销售记录表,包含销售日期、销售金额等字段。我们可以使用窗口函数来计算每个月的移动平均值,以此来观察销售数据的趋势。具体的 SQL 语句如下:
SELECT
sale_date,
sale_amount,
AVG(sale_amount) OVER (ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
FROM
sales;
在这个例子中,AVG(sale_amount) OVER (ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) 就是窗口函数的应用。ORDER BY sale_date 表示按照销售日期进行排序,ROWS BETWEEN 2 PRECEDING AND CURRENT ROW 表示窗口范围是当前行及其前两行,这样就可以计算出每个月的移动平均值。通过移动平均值,我们能更清晰地看到销售数据的变化趋势,为销售策略的制定提供有力支持。
公共表达式(CTEs,Common Table Expressions)是一种临时结果集,它可以在一个 SELECT、INSERT、UPDATE 或 DELETE 语句中引用。CTEs 就像是给一段复杂的查询取了一个别名,让我们可以在后续的查询中直接使用这个别名,而不需要重复编写相同的查询逻辑。
CTEs 的主要用途是提高查询的可读性和可维护性,特别是在处理复杂的嵌套查询时。比如,我们有一个员工表和一个部门表,员工表中包含员工 ID、姓名、部门 ID 等字段,部门表中包含部门 ID 和部门名称等字段。现在我们要查询每个部门的员工人数和平均工资,并且只显示员工人数大于 5 的部门。使用 CTEs 可以这样写:
WITH EmployeeDepartment AS (
SELECT
e.employee_id,
e.employee_name,
e.department_id,
d.department_name
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id
),
DepartmentSalary AS (
SELECT
department_id,
department_name,
COUNT(employee_id) AS employee_count,
AVG(salary) AS average_salary
FROM
EmployeeDepartment
GROUP BY
department_id, department_name
)
SELECT
department_id,
department_name,
employee_count,
average_salary
FROM
DepartmentSalary
WHERE
employee_count > 5;
在这个例子中,我们首先定义了一个名为EmployeeDepartment的 CTE,它将员工表和部门表进行了连接,得到了员工的部门信息。然后又定义了一个名为DepartmentSalary的 CTE,它基于EmployeeDepartment计算了每个部门的员工人数和平均工资。最后,我们在主查询中从DepartmentSalary中筛选出员工人数大于 5 的部门。通过使用 CTEs,我们将复杂的查询逻辑分解成了多个步骤,每个步骤都有清晰的定义和用途,使得整个查询更加易读和易于维护。