当前位置: 首页 > article >正文

高级SQL技巧详解与实例

在数据处理与分析领域,高级SQL技巧是提升效率与准确性的关键。本文将结合参考资料,对高级SQL技巧进行系统的整理与解读,并通过实例展示其应用。

一、窗口函数

窗口函数是一种在SQL中执行复杂计算的强大工具,它们允许用户在一组行(称为窗口)上执行计算,而不会将这些行合并成单个结果行。窗口函数在处理排名、累计和运行总和等场景中非常有用。

基本语法

<窗口函数> OVER([PARTITION BY <分区列>][ORDER BY <排序列>])

常见窗口函数

  1. ROW_NUMBER():为每一行分配一个唯一的序号。
  2. RANK():为每一行分配一个序号,但序号间可能有跳跃(如有两行数据相同,则它们共享同一序号,下一行的序号将跳过)。
  3. DENSE_RANK():为每一行分配一个序号,序号间无跳跃(即使两行数据相同,也会为下一行分配连续的序号)。
  4. LEAD()LAG():用于访问同一窗口中前一行或后一行的数据。

实例

SELECT employee_id, department_id, salary,
       ROW_NUMBER() OVER(PARTITION BY department_id ORDER BY salary DESC) AS row_num,
       RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) AS rank,
       DENSE_RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) AS dense_rank,
       LAG(salary, 1) OVER(PARTITION BY department_id ORDER BY salary DESC) AS previous_salary
FROM employees;
二、递归查询

递归查询允许用户在一个查询中多次引用同一个表,这在处理树形结构数据(如组织架构、目录结构)时非常有用。

基本语法

WITH RECURSIVE cte_name AS (
    初始查询
    UNION ALL
    递归查询
)
SELECT * FROM cte_name;

实例

WITH RECURSIVE EmployeeCTE AS (
    SELECT employee_id, manager_id, 1 AS level
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.employee_id, e.manager_id, ecte.level + 1
    FROM employees e
    INNER JOIN EmployeeCTE ecte ON e.manager_id = ecte.employee_id
)
SELECT employee_id, employee_name, level
FROM EmployeeCTE
ORDER BY level, employee_id;
三、公共表表达式(CTEs)

CTE是一种临时的结果集,只在单个查询的执行周期内有效。它有助于使复杂查询更加易读和易维护。

基本语法

WITH cte_name AS (
    查询语句
)
SELECT * FROM cte_name;

实例

WITH SalesCTE AS (
    SELECT employee_id, SUM(amount) AS total_sales
    FROM sales
    GROUP BY employee_id
)
SELECT employee_id, total_sales
FROM SalesCTE
WHERE total_sales > 10000;
四、子查询

子查询是嵌套在另一个查询中的查询,常用于筛选条件和数据过滤。

实例

SELECT employee_id, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
五、集合操作

集合操作允许用户将两个或多个查询结果集进行合并或比较。常见的集合操作符包括UNION、INTERSECT和EXCEPT。

实例

-- 合并两个查询结果集
SELECT name FROM customers
UNION
SELECT name FROM suppliers;

-- 找出两个查询结果集的交集
SELECT name FROM customers
INTERSECT
SELECT name FROM suppliers;

-- 找出只在第一个查询结果集中存在的记录
SELECT name FROM customers
EXCEPT
SELECT name FROM suppliers;
六、其他高级技巧
  1. 临时函数:在支持的数据库中(如PostgreSQL),可以定义临时函数来封装复杂的逻辑,增强代码重用性。
  2. 日期时间操作:包括日期加减、日期格式转换等。
  3. 索引优化:创建适当的索引可以显著提高查询性能。
  4. 自联结:一个表与自身进行联结,常用于处理相对数据。
  5. 分页:使用LIMIT子句进行分页查询,减少大偏移量

http://www.kler.cn/a/376282.html

相关文章:

  • pandas——数据结构
  • 服务器数据恢复—DELL EqualLogic PS6100系列存储简介及如何收集故障信息?
  • 二分法:高效查找的数学利器
  • Java实现图片转pdf
  • PHP反序列化原生类字符串逃逸框架反序列化利用
  • 【flink】之kafka到kafka
  • 华为机试HJ17 坐标移动
  • 《手写Spring渐进式源码实践》实践笔记(第十四章 通过注解自动注入属性信息)
  • JDK动态代理为什么只能代理有接口的类?
  • 【原创分享】生产环境JAVA中间件性能优化调优要点和案例分析
  • 面向过程与面向对象
  • nginx-proxy-manager实现反向代理+自动化证书(实战)
  • 前端项目【本科期间】
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-27
  • uniapp 小程序 H5 app 价格计算 避免精度丢失
  • 深入探讨 Tantivy 及其在 Milvus 中的应用:倒排索引库对比与选择
  • Android Studio开发学习(五)———LinearLayout(线性布局)
  • 微信小程序 uniapp 腾讯地图的调用
  • 设计模式之责任链的通用实践思考
  • C语言静态库
  • 数据结构之链式结构二叉树的实现(初级版)
  • FRIDA-JSAPI:Process使用
  • HTTP 405 Method Not Allowed:解析与解决
  • 【spark】——spark面试题(1)
  • 基于YOLO11/v10/v8/v5深度学习的农作物类别检测与识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
  • Spring Cloud Config快速入门Demo