高级SQL技巧
掌握高级SQL技巧可以显著提升数据库查询效率、简化复杂操作并解决专业数据处理问题。以下是一些重要的高级SQL技巧:
1. 窗口函数 (Window Functions)
- 允许在不减少行数的情况下进行计算
- 常用函数:
ROW_NUMBER()
,RANK()
,DENSE_RANK()
,LEAD()
,LAG()
,FIRST_VALUE()
,LAST_VALUE()
sql
SELECT
employee_id,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;
2. 公用表表达式 (CTEs)
- 使用WITH子句创建临时结果集,提高可读性
- 支持递归查询
sql
WITH dept_stats AS (
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
)
SELECT * FROM dept_stats WHERE avg_salary > 50000;
3. 递归查询
- 处理层次结构数据,如组织结构图、BOM表
sql
WITH RECURSIVE org_hierarchy AS (
-- 基础查询(锚成员)
SELECT id, name, manager_id, 1 as level
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- 递归部分(递归成员)
SELECT e.id, e.name, e.manager_id, h.level + 1
FROM employees e
JOIN org_hierarchy h ON e.manager_id = h.id
)
SELECT * FROM org_hierarchy;
4. 透视与逆透视 (PIVOT/UNPIVOT)
- 将行转为列(透视)或列转为行(逆透视)
sql
-- SQL Server/Oracle PIVOT示例
SELECT * FROM (
SELECT product, region, sales
FROM sales_data
)
PIVOT (
SUM(sales) FOR region IN ('East' AS East, 'West' AS West, 'North' AS North)
);
5. 高级连接技术
- 自连接:表与自身连接
- 交叉连接:笛卡尔积
- 自然连接:自动匹配相同列名
- 外连接:LEFT/RIGHT/FULL OUTER JOIN
6. 高级聚合
- GROUPING SETS:多维度聚合
- CUBE:所有可能的组合聚合
- ROLLUP:层次结构聚合
sql
SELECT department, job_title, COUNT(*)
FROM employees
GROUP BY CUBE(department, job_title);
7. 分析函数
- 计算移动平均、累计总和等
sql
SELECT
date,
sales,
AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_avg
FROM daily_sales;
8. 动态SQL
- 在运行时构建和执行SQL语句
- 适用于存储过程和脚本
9. 索引优化技巧
- 函数索引
- 部分索引
- 覆盖索引
- 索引提示
10. 高级子查询
- 相关子查询
- EXISTS/NOT EXISTS
- IN/NOT IN与JOIN的性能比较
11. 分区表查询
- 利用分区剪枝(Partition Pruning)提高性能
- 跨分区查询
12. JSON/XML处理
- 现代数据库对半结构化数据的支持
sql
-- PostgreSQL JSON示例
SELECT
user_data->>'name' as user_name,
user_data->'address'->>'city' as city
FROM users;
掌握这些高级技巧可以让你处理复杂数据场景时更加得心应手,显著提高查询效率和分析能力。