高级sql技巧

news2024/11/15 9:57:32

一、窗口函数(Window Functions)

  1. 基本概念
    • 窗口函数是一种特殊的函数,它可以在不改变结果集行数的情况下,对每一行进行计算。与聚合函数不同,聚合函数会将多行数据聚合成一行,而窗口函数会为每一行计算一个值。
    • 例如,计算每个员工的工资在部门内的排名。假设我们有一个员工表employees,包含字段employee_iddepartment_idsalary
SELECT 
    employee_id,
    department_id,
    salary,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as salary_rank
FROM 
    employees;

  • 在这个例子中,RANK()函数就是一个窗口函数。PARTITION BY department_id表示按照部门进行分组,在每个部门内部进行计算。ORDER BY salary DESC是对每个分组内的数据按照工资降序排序,然后计算排名。
  1. 常用窗口函数类型
    • 排名函数
      • 除了RANK()函数外,还有DENSE_RANK()ROW_NUMBER()RANK()函数在排名时,如果有相同的值,会占用相同的名次,下一个名次会跳过相应的数量。例如,有两个并列第一,那么下一个名次是第三。DENSE_RANK()函数在遇到相同值排名时,下一个名次不会跳过,例如,有两个并列第一,下一个名次是第二。ROW_NUMBER()函数则是按照顺序依次排名,不考虑是否有相同的值。
    • 聚合函数作为窗口函数
      • 可以将聚合函数(如SUMAVGMAXMIN)作为窗口函数使用。例如,计算每个员工的工资与部门平均工资的差值。
SELECT 
    employee_id,
    department_id,
    salary,
    salary - AVG(salary) OVER (PARTITION BY department_id) as salary_diff_from_avg
FROM 
    employees;

  • 这里AVG(salary) OVER (PARTITION BY department_id)计算了每个部门的平均工资,然后用每个员工的工资减去部门平均工资得到差值。

二、公共表表达式(CTE - Common Table Expressions)

  1. 定义和语法
    • CTE 是一个临时结果集,它可以在一个 SQL 语句中定义,并且可以在后续的查询中引用。语法如下:
WITH cte_name (column1, column2,...) AS (
    -- 子查询,用于定义CTE的内容
    SELECT column1, column2,...
    FROM some_table
    WHERE some_condition
)
SELECT *
FROM cte_name;

  • 例如,我们要查找购买了价格最高的产品的客户。首先,我们可以使用 CTE 找到价格最高的产品价格。

WITH max_price_cte AS (
    SELECT MAX(price) as max_price
    FROM products
)
SELECT 
    customers.customer_name,
    orders.order_date
FROM 
    customers
    JOIN orders ON customers.customer_id = orders.customer_id
    JOIN order_items ON orders.order_id = order_items.order_id
    JOIN products ON order_items.product_id = products.product_id,
    max_price_cte
WHERE 
    products.price = max_price_cte.max_price;

  1. 递归 CTE
    • 递归 CTE 是一种特殊的 CTE,它可以引用自身。常用于处理具有层次结构的数据,如组织结构树、文件系统目录结构等。
    • 例如,假设有一个员工表employees,包含employee_idmanager_idemployee_name字段,我们要查询某个经理及其所有下属的员工姓名。

WITH RECURSIVE subordinates_cte (employee_id, employee_name, manager_id) AS (
    -- 递归的初始查询,找到经理
    SELECT employee_id, employee_name, manager_id
    FROM employees
    WHERE employee_id = 1 -- 假设经理的ID为1
    UNION ALL
    -- 递归部分,找到下属
    SELECT e.employee_id, e.employee_name, e.manager_id
    FROM employees e
    JOIN subordinates_cte s ON e.manager_id = s.employee_id
)
SELECT *
FROM subordinates_cte;
  • 在这个例子中,首先通过初始查询找到了经理的记录。然后在递归部分,通过将员工表和 CTE 自身进行连接,找到经理下属的员工记录,不断重复这个过程,直到没有下属为止。

三、动态 SQL

  1. 概念和应用场景
    • 动态 SQL 是指在 SQL 语句中可以动态地构建和执行 SQL 代码。这在需要根据不同的条件生成不同的查询语句时非常有用。例如,在一个报表系统中,用户可以选择不同的筛选条件(如日期范围、产品类别等),动态 SQL 可以根据用户的选择构建相应的查询。
  2. 实现方式(以存储过程为例)
    • 在许多数据库管理系统中,可以使用存储过程来实现动态 SQL。下面是一个简单的示例,假设我们有一个表sales,包含sales_dateproduct_idsales_amount字段,我们要根据用户输入的日期范围查询销售数据。

CREATE PROCEDURE get_sales_in_date_range (start_date DATE, end_date DATE)
LANGUAGE SQL
BEGIN
    DECLARE dynamic_sql VARCHAR(1000);
    SET dynamic_sql = 'SELECT * FROM sales WHERE sales_date BETWEEN '' ' || start_date || ' '' AND '' ' || end_date || ' '';';
    PREPARE stmt FROM dynamic_sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END;

  • 在这个存储过程中,首先定义了一个变量dynamic_sql来存储动态构建的 SQL 语句。然后通过拼接字符串的方式将日期范围条件添加到查询语句中。接着使用PREPARE语句准备要执行的 SQL 语句,EXECUTE语句执行它,最后使用DEALLOCATE PREPARE释放资源。

四、索引优化技巧

  1. 选择合适的索引类型
    • B - 树索引(B - Tree Index):这是最常用的索引类型。它适用于大多数情况,特别是在查询条件涉及范围查询(如><BETWEEN)、等值查询(如=)和排序操作(ORDER BY)时非常有效。例如,在一个包含客户订单信息的表orders中,对customer_id字段创建 B - 树索引,可以快速查询某个客户的所有订单。
    • 哈希索引(Hash Index):哈希索引主要用于等值查询,它通过哈希函数将索引键转换为哈希值来快速定位数据。但是它不支持范围查询和排序操作。例如,在一个用于存储用户登录信息的表中,对username字段创建哈希索引,可以快速验证用户登录时输入的用户名是否存在。
  2. 复合索引(Composite Index)的使用
    • 复合索引是包含多个列的索引。在创建复合索引时,要考虑列的顺序。一般来说,应该将最常用于查询条件的列放在最左边。例如,在一个employees表中,经常按照department_idjob_title查询员工信息,那么可以创建一个复合索引(department_id, job_title)。当查询条件是department_id = 1 AND job_title = 'Manager'时,这个复合索引可以有效地提高查询速度。但是如果查询条件只有job_title,这个复合索引可能不会被充分利用。
  3. 避免过度索引
    • 索引虽然可以提高查询速度,但也会增加数据插入、更新和删除的成本。因为每次对数据进行这些操作时,数据库都需要更新相关的索引。所以要避免为很少使用的列或者已经有其他高效索引覆盖的列创建索引。例如,如果已经有一个(column1, column2)的复合索引,并且大多数查询可以通过这个复合索引满足,就不需要再为column1单独创建索引。

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

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

相关文章

实施工程师简历「精选篇」

【#实施工程师简历#】一份出色的实施工程师简历&#xff0c;是获得优质工作机会的重要跳板。那么&#xff0c;如何打造一份令人眼前一亮的实施工程师简历呢&#xff1f;以下是幻主简历网整理的实施工程师简历「精选篇」&#xff0c;欢迎大家阅读收藏&#xff01; 实施工程师简历…

Linux篇(权限管理命令)

目录 一、权限概述 1. 什么是权限 2. 为什么要设置权限 3. Linux中的权限类别 4. Linux中文件所有者 4.1. 所有者分类 4.2. 所有者的表示方法 属主权限 属组权限 其他权限 root用户&#xff08;超级管理员&#xff09; 二、普通权限管理 1. ls查看文件权限 2. 文件…

惊爆!72.1K star 的 Netdata:实时监控与可视化的超炫神器!

在当今复杂的 IT 环境中&#xff0c;实时监控与可视化对于保障系统的稳定运行和性能优化至关重要。 无论是服务器、应用程序&#xff0c;还是网络设备&#xff0c;及时获取性能数据能够帮助我们快速定位问题、优化资源配置。 Netdata&#xff0c;作为一个开源的实时监控工具&a…

姓名改成商标名称,李子柒已成身份证名字!

近日李子柒紫气东来&#xff0c;以中国非物质文化遗产“漆器”生动地展现了中国漆器的独特美学和工艺之美&#xff0c;这条视频在微博已超过1.3亿观看&#xff0c;在国外视频平台订阅超二千万粉丝成海外中文创作第一人。 李子柒原名李佳佳&#xff0c;在网上看到她已经正式将身…

论云游戏的性能与性价比,ToDesk、青椒云、顺网云游戏等具体实操看这篇就够了

文章目录 一、前言二、云电脑产品基础介绍2.1 ToDesk云电脑2.1.1 ToDesk云电脑硬件参数2.1.2 ToDesk云电脑鲁大师跑分2.1.3 ToDesk云电脑收费方式2.1.4 ToDesk云电脑特色功能 2.2 青椒云2.2.1 青椒云游戏娱乐硬件配置2.2.2 青椒云云电脑鲁大师跑分2.2.3 青椒云收费方式2.2.4 青…

服务器数据恢复——Ext4文件系统使用fsck后mount不上的数据恢复案例

关于Ext4文件系统的几个概念&#xff1a; 块组&#xff1a;Ext4文件系统的全部空间被划分为若干个块组&#xff0c;每个块组结构基本上相同。 块组描述符表&#xff1a;每个块组都对应一个块组描述符&#xff0c;这些块组描述符统一放在文件系统的前部&#xff0c;称为块组描述…

ubuntu 下mosquitto TLS配置

1、/etc/mosquitto/mosquitto.conf文件配置 persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d listener 1883 listener 8883 0.0.0.0 password_file /etc/mosquitto/pwfile cert…

隧道论文阅读2-采用无人融合扫描数据的基于深度学习的垂直型隧道三维数字损伤图

目前存在的问题&#xff1a; 需要开发新的无人测量系统测量垂直隧道图像数据量巨大&#xff0c;基于深度学习完成损伤评估跟踪获取图像位置的困难&#xff0c;对大型基础设施感兴趣区域(roi)的2d和3d地图建立进行了研究&#xff0c;对整个目标结构的损伤定位仍然具有挑战性。为…

【C++动态规划 最长公共子序列】1035. 不相交的线|1805

本文涉及知识点 C动态规划 LeetCode1035. 不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j] 且绘制的…

SELINUX和防火墙

SELINUX 简介&#xff1a; SELinux通过对进程和文件的访问进行精细的控制和限制&#xff0c;可以在系统级别上实现强制访问控制&#xff0c;即使是root用户也无法绕过这种控制。它基于策略规则来确定哪些进程可以访问哪些文件&#xff0c;从而有效地减少了系统遭受恶意攻击的…

计算机毕业设计Python+大模型农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

VUE实现点击导航栏进行切换右边内容

首先看看效果&#xff0c;左边导航栏进行切换&#xff0c;右边内容进行切换 代码如下 <div><el-tabs :tab-position"tabPosition" style"height: 800px;"><el-tab-pane label"通知通告">通知通告</el-tab-pane><el-t…

Power BI - Get Data from SQLite

1.简单介绍 Power BI支持连接的数据源很多&#xff0c;比如SQL Server, PostgreSQL,MYSQL, Dataverse等。如果要连接小型数据源Sqlite&#xff0c;由于没有内置的直接连接Sqlite选项&#xff0c;需要使用ODBC driver来进行连接 这边尝试一下使用Power BI去连接本地Sqlite数据…

DAY63||拓扑排序精讲 |dijkstra(朴素版)精讲

拓扑排序精讲 117. 软件构建 题目描述 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依赖于文件 B&#xff0c;则必须在处理文件 A 之前处理文…

爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)

目录 一.环境检测 1. 什么是环境检测 2.案例讲解 二 .吐环境脚本 1. 简介 2. 基础使用方法 3.数据返回 4. 完整代理使用 5. 代理封装 6. 封装所有使用方法 jsdom补环境 1. 环境安装 2. 基本使用 3. 添加参数形式 Selenium补环境 1. 简介 2.实战案例 1. 逆向目…

DICOM图像解析:深入解析DICOM格式文件的高效读取与处理(续)

目录 一、DICOM图像高效解析 1、处理压缩的像素数据 常见压缩算法及其处理方法 解压缩示例 2、多帧图像的处理 多帧图像解析流程 三维图像的体绘制 3、序列和嵌套数据元素 序列数据的解析 二、错误处理与数据验证 常见错误类型 错误处理策略 三、使用现有的DICOM库…

「QT」高阶篇 之 d-指针 的用法

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

如何绑定洛谷账号

首先注册洛谷 然后登陆 点击键盘F12 点击加号 点击应用程序 在name中找到__client_id和_uid 再复制相应的value到下图右侧 然后点击confirm即可 愿我们都能成为我们想要去成为的人&#xff01; 花会沿路盛开&#xff0c;我们以后的路也会&#xff01; 追风赶月莫停留&…

5G CPE:为什么活动会场与商铺的网络成为最新选择

在快节奏的现代社会中&#xff0c;无论是举办一场盛大的活动还是经营一家繁忙的商铺&#xff0c;稳定的网络连接都是不可或缺的基石。然而&#xff0c;面对复杂的布线难题或高昂的商业宽带费用&#xff0c;许多场所往往陷入两难境地。幸运的是&#xff0c;5G CPE&#xff08;Cu…

【ACM独立出版|高校主办】第四届信号处理与通信技术国际学术会议(SPCT 2024)

第四届信号处理与通信技术国际学术会议&#xff08;SPCT 2024&#xff09; 2024 4th International Conference on Signal Processing and Communication Technology 2024年12月27-29日 中国深圳 www.icspct.com 会议亮点&#xff1a; 1、ACM独立出版&#xff0c;EI稳…