高级 SQL 技巧讲解

在这里插## 标题入图片描述

大家好,我是程序员小羊!

前言:

SQL(结构化查询语言)是管理和操作数据库的核心工具。从基本的查询语句到复杂的数据处理,掌握高级 SQL 技巧不仅能显著提高数据分析的效率,还能解决业务中的复杂问题。本文将深入探讨一些高级 SQL 技巧,包括窗口函数、复杂联结、CTE(公用表表达式)、递归查询、动态 SQL、性能优化等。


一、窗口函数(Window Functions)

窗口函数是一种强大的分析工具,能够在不改变原始数据行的情况下进行聚合运算和排名操作。

1. 基本语法

窗口函数通常与关键字 OVER() 一起使用,用于指定窗口范围。

SELECT employee_id, department_id, salary, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_in_department
FROM employees;

解释

  • RANK():对每个部门(department_id)内的员工按薪资从高到低排名。
  • PARTITION BY:指定分组范围。
  • ORDER BY:定义排序逻辑。
2. 常用窗口函数
  • 排名函数ROW_NUMBER()RANK()DENSE_RANK() 用于对数据分组并排序。
  • 聚合函数SUM()AVG()COUNT() 等可以按分组计算累计值。
  • 滑动窗口计算:使用 ROWS BETWEENRANGE BETWEEN 定义滑动范围,如计算滚动平均值:
    SELECT order_date, customer_id, SUM(order_amount) OVER (PARTITION BY customer_id ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_sum
    FROM orders;
    

二、复杂联结(Complex Joins)

SQL 中的联结是数据处理的核心之一,高级 SQL 技巧往往体现在复杂联结的使用上。

1. 多表联结

当涉及多个表时,联结逻辑需要更清晰,避免数据重复或遗漏:

SELECT a.customer_name, b.order_id, c.product_name
FROM customers a
JOIN orders b ON a.customer_id = b.customer_id
JOIN products c ON b.product_id = c.product_id
WHERE c.category = 'Electronics';

解释:多表联结根据外键关系查询数据,例如查询购买电子产品的客户信息。

2. 自联结(Self Join)

自联结用于将一个表与自身进行关联,常用于层级数据查询:

SELECT e1.employee_id AS employee, e2.employee_id AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id;

解释:查询员工及其直接经理的信息。

3. 交叉联结(Cross Join)

交叉联结生成笛卡尔积,适用于所有组合的情况。

SELECT a.customer_name, b.product_name 
FROM customers a
CROSS JOIN products b;

注意:在实际使用中,需要限制结果集以免数据过多。


三、公用表表达式(CTE)

CTE 是提升代码可读性的重要工具,尤其在需要多步查询时表现出色。

1. 基本用法
WITH CTE_sales AS (SELECT employee_id, SUM(sale_amount) AS total_salesFROM salesGROUP BY employee_id
)
SELECT * 
FROM CTE_sales 
WHERE total_sales > 10000;

解释

  • WITH 定义 CTE 子查询,为后续查询提供简化视图。
  • 适合复杂查询分步骤实现。
2. 嵌套 CTE

可以通过嵌套多个 CTE 来处理复杂逻辑:

WITH CTE_orders AS (SELECT customer_id, SUM(order_amount) AS total_amount FROM orders GROUP BY customer_id
),
CTE_high_spenders AS (SELECT customer_id FROM CTE_orders WHERE total_amount > 10000
)
SELECT * 
FROM customers 
WHERE customer_id IN (SELECT customer_id FROM CTE_high_spenders);

四、递归查询

递归查询主要用于处理树形结构或分层数据。

1. 递归 CTE
WITH RECURSIVE employee_hierarchy AS (SELECT employee_id, manager_id, 1 AS levelFROM employeesWHERE manager_id IS NULLUNION ALLSELECT e.employee_id, e.manager_id, h.level + 1FROM employees eJOIN employee_hierarchy h ON e.manager_id = h.employee_id
)
SELECT * 
FROM employee_hierarchy;

解释

  • RECURSIVE 允许 CTE 自身引用。
  • 此例从顶级经理开始,递归查找所有下属及其层级关系。

五、动态 SQL

动态 SQL 允许根据输入动态生成查询,常用于存储过程或复杂查询中。

1. 动态拼接 SQL

在某些情况下需要根据用户输入生成动态 SQL:

DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM ' + @table_name + ' WHERE ' + @column_name + ' = @value';
EXEC sp_executesql @sql, N'@value NVARCHAR(100)', @value = 'example';

注意:确保输入经过验证,避免 SQL 注入风险。


六、性能优化技巧

SQL 性能优化对于处理大规模数据尤为重要。以下是一些常用的优化技巧:

1. 索引的使用
  • 单列索引与复合索引:根据查询条件创建合适的索引。例如:
    CREATE INDEX idx_customer_name ON customers (customer_name);
    
  • 避免全表扫描:通过索引提高过滤和排序的效率。
2. 分析执行计划

通过 EXPLAIN 或类似工具分析查询执行计划,定位瓶颈:

EXPLAIN SELECT * FROM orders WHERE customer_id = 1;
3. 避免不必要的复杂查询
  • 减少嵌套查询:使用联结替代子查询,提高效率。
  • 选择性查询:仅查询必要的列,避免使用 SELECT *
4. 分区与分片

对于大表,可以使用分区优化查询性能:

CREATE TABLE orders_partitioned (order_id INT,customer_id INT,order_date DATE
)
PARTITION BY RANGE (order_date) (PARTITION p1 VALUES LESS THAN ('2024-01-01'),PARTITION p2 VALUES LESS THAN ('2025-01-01')
);
5. 缓存查询结果

对于频繁使用的查询结果,可以缓存到中间表或物化视图中:

CREATE MATERIALIZED VIEW recent_orders AS 
SELECT * 
FROM orders 
WHERE order_date > CURRENT_DATE - INTERVAL '30 days';

七、事务管理

1. 事务的基本操作

SQL 中的事务保证数据操作的一致性:

BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;

注意:在多步操作中加入 ROLLBACK 逻辑处理失败场景。

2. 隔离级别的选择

根据业务需求选择合适的隔离级别:

  • READ UNCOMMITTED:允许脏读,性能最高。
  • READ COMMITTED:禁止脏读,默认级别。
  • REPEATABLE READ:避免不可重复读。
  • SERIALIZABLE:完全隔离,性能最低。

总结

高级 SQL 技巧涵盖了从分析、建模到性能优化的方方面面。通过窗口函数进行复杂分析、使用 CTE 提高可读性、递归查询处理层级数据、动态
SQL
提高灵活性,开发者能够高效解决业务中的各种复杂需求。同时,关注性能优化和事务管理是处理大规模数据时不可忽视的关键环节。掌握这些高级技巧,能让你在数据处理中更加得心应手,充分发挥
SQL 的强大能力。

结尾

今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pom中无法下载下来的类外部引用只给一个jar的时候

比如jar在桌面上放着,操作步骤如下: 选择桌面,输入cmd ,执行mvn install:install-file -DgroupIdcom -DartifactIdaspose-words -Dversion15.8.0 -Dpackagingjar -Dclassifierjdk11 -Dfilejar包名称 即可把jar包引入成功。

【软件测试】设计测试用例的万能公式

文章目录 概念设计测试用例的万能公式常规思考逆向思维发散性思维万能公式水杯测试弱网测试如何进行弱网测试 安装卸载测试 概念 什么是测试用例? 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包…

在连通无向图中寻找欧拉回路(Eulerian Circuit)

在连通无向图中寻找欧拉回路(Eulerian Circuit) 问题描述解决方案概述算法步骤伪代码C代码示例如何在迷宫中找出一条路示例:在简单迷宫中应用欧拉回路结论问题描述 给定一个连通无向图 $ G = (V, E) $,我们需要找到一条路径,该路径正向和反向通过 $ E $ 中的每条边恰好一…

ANSYS Maxwell:3PH 感应电机 - 第 1 部分 - 力与热耦合

在此博客中,我们使用 Ansys RMxprt 创建了 3PH 感应电机的 1D 模型,并从设计中自动开发具有所有设置、边界条件和激励的麦克斯韦模型。 ANSYS RMxprt 1D 模型 - 3PH 感应电机设计 请参阅上一篇博客下面的链接,了解如何设置电机设计的 RMxp…

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是:直接相连的主机之间,进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准: 既包含了数据链路层的内容, 也包含了一些物理层的内容…

递归(二)---力扣22括号生成,力扣78求子集

22. 括号生成https://leetcode.cn/problems/generate-parentheses/ 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))&quo…

数据分布之指数分布(sample database classicmodels _No.10)

数据分布之指数分布(sample database classicmodels _No.10) 准备工作,可以去下载 classicmodels 数据库具体如下 点击:classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章…

C++语言之类与对象1

什么是类 类是一种抽象的数据类型,作为对象的蓝图或模板,它将具有相同属性和行为的对象进行统一抽象封装。其中属性描述对象的特征,如 “汽车” 类中的颜色、品牌等;方法则定义对象可执行的操作,像 “汽车” 类的启动、…

Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!

作者:来自 Elastic Platform Product Team Elastic Search AI 平台(Elasticsearch、Kibana 和机器学习)的 8.16 版本包含大量新功能,可提高性能、优化工作流程和简化数据管理。 使用更好的二进制量化 (Better Binary Quantizatio…

【Golang】——Gin 框架简介与安装

文章目录 1. Gin 框架概述1.1 什么是 Gin 框架?1.2 为什么选择 Gin?1.3 使用场景 2. 安装 Go 与 Gin 框架2.1 安装 Go 语言环境2.2 初始化 Go 项目2.3 安装 Gin 框架 3. 编写第一个 Gin 应用3.1 Gin 最小化示例代码代码解读3.2 运行程序3.3 测试服务 4. …

RGB与YCbCr转换算法

目录 RGB与YCbCr转换算法RGB与YCbCr色域介绍RGB模型YCbCr色域简介YCbCr的应用YUV 和 YCbCr 的区别 色彩转换公式 RGB 转 YCbCr 实现RGB 转 YCbCr 的 Matlab 实现RGB 转 YCbCr 的 FPGA 实现 YCbCr 转 RGB 实现YCbCr 转 RGB 的 Matlab 实现YCbCr 转 RGB 的 FPGA 实现 RGB与YCbCr转…

WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇(本文) WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前言…

MAC上的Office三件套报53错误解决方案(随笔记)

目录 现象原因解决方式1. 可视化2. 命令行 参考链接 现象 最近Mac Mini M4非常热门,我也种草买了一台丐中丐版本来体验一下。 在安装Office三件套后,遇到了一个53的错误: Run-time error 53:File not found: Library/Application Support/A…

人工智能与SEO优化中的关键词策略解析

内容概要 在当今数字化快速发展的时代,人工智能(AI)与搜索引擎优化(SEO)的结合正变得愈发重要。关键词策略是SEO优化的一项基础工作,它直接影响到网站的可见性和流量。通过运用智能算法,企业能…

【数据库】如何保证数据库迁移过程中数据的一致性?

在数据库迁移过程中,保证数据的一致性是非常重要的,尤其是在涉及到多个表、多个数据库或分布式系统的情况下。以下是一些确保数据一致性的最佳实践和方法: 1. 备份数据 在开始迁移之前,进行全面的数据备份是确保数据一致性的第…

Kubernetes 10 问,测测你对 k8s 的理解程度

Kubernetes 10 问 假设集群有 2 个 node 节点,其中一个有 pod,另一个则没有,那么新的 pod 会被调度到哪个节点上? 应用程序通过容器的形式运行,如果 OOM(Out-of-Memory)了,是容器重…

Spring:IoC/DI加载properties文件

Spring框架可以通过Spring的配置文件完成两个数据源druid和C3P0的配置(Spring:IOC/DI配置管理第三方bean),但是其中包含了一些问题,我们来分析下: 这两个数据源中都使用到了一些固定的常量如数据库连接四要素&#xf…

时钟之CSS+JS版

写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单&#xff0c;缺点当然是不够灵活。下一篇会基于HTML5的canvas标签&#xff0c;使用JS绘制。会更灵活&#xff0c;元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…

云计算虚拟化-kvm创建虚拟机

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 虚拟化&#xff0c;简单来说就是把一台服务器/PC电脑&#xff0c;虚拟成多台独立的虚拟机&#xff0c;每台虚拟机之间相互隔…

<QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全

原因&#xff1a;Chrome 不信任 ssc 证书 使启用了 HTTPS&#xff0c;即使有使用 自签名证书 (self-signed certificate 非由可信的证书颁发机构 【CA&#xff0c;Certificate Authority】签发的&#xff09;。浏览器 Chrome 默认不信任自签名证书&#xff0c;也会报 NET::ERR_…