常见数据库关键字示例 SQL 及执行顺序分析(带详细注释)

示例 SQL 及执行顺序分析(带详细注释)

在这里插入图片描述


示例 1:基础查询(含多表关联、过滤、分组、排序)
SELECT -- 1. 选择字段(包含聚合函数和别名)e.department, COUNT(e.employee_id) AS total_employees,  -- 聚合函数AVG(e.salary) AS avg_salary, MAX(e.salary) AS max_salary 
FROM employees e 
JOIN departments d ON e.department_id = d.department_id  -- 2. 表关联(JOIN)
WHERE e.hire_date >= '2020-01-01'  -- 3. 行级过滤(WHERE)
GROUP BY e.department  -- 4. 分组(GROUP BY)
HAVING AVG(e.salary) > 5000  -- 5. 分组后过滤(HAVING)
ORDER BY avg_salary DESC  -- 6. 排序(ORDER BY)
LIMIT 10;  -- 7. 限制结果(LIMIT)

示例 2:窗口函数与子查询
SELECT -- 1. 选择字段(包含窗口函数)e.*, SUM(e.salary) OVER (PARTITION BY department) AS dept_total_salary,  -- 窗口函数(SUM OVER)RANK() OVER (ORDER BY salary DESC) AS salary_rank  -- 排名函数(RANK OVER)
FROM (-- 子查询(先执行)SELECT * FROM employees WHERE age BETWEEN 25 AND 35  -- 子查询过滤
) e 
WHERE e.department = 'Tech'  -- 2. 外层过滤(WHERE)
ORDER BY salary_rank  -- 3. 排序(ORDER BY)
LIMIT 5;  -- 4. 限制结果(LIMIT)

示例 3:多表关联 + UNION + DISTINCT
SELECT -- 第一个 SELECT 分支o.order_id, c.customer_name, o.total_amount, COUNT(DISTINCT oi.product_id) AS products_count 
FROM orders o 
JOIN customers c ON o.customer_id = c.customer_id 
LEFT JOIN order_items oi ON o.order_id = oi.order_id 
WHERE o.order_date BETWEEN '2023-01-01' AND '2023-12-31'  -- 过滤订单日期
GROUP BY o.order_id, c.customer_name, o.total_amount 
HAVING products_count > 2  -- 分组后过滤
UNION  -- 合并结果集
SELECT -- 第二个 SELECT 分支(不同结构)'Summary' AS order_id, 'Total Customers' AS customer_name, COUNT(DISTINCT c.customer_id) AS total_customers, NULL AS products_count 
FROM customers c 
WHERE c.registration_date >= '2023-01-01' 
ORDER BY total_amount DESC  -- 全局排序
LIMIT 5;  -- 限制最终结果

执行顺序与逻辑关系

SQL 执行流程(通用顺序)
  1. FROM/JON:处理表关联(如 JOIN)和子查询。
  2. WHERE:过滤行级条件。
  3. GROUP BY:按字段分组。
  4. HAVING:过滤分组后的结果。
  5. WINDOW FUNCTION:计算窗口函数(依赖分组后的数据)。
  6. SELECT:选择字段并计算表达式(如聚合函数、别名)。
  7. DISTINCT:去重(若存在)。
  8. ORDER BY:排序结果。
  9. LIMIT/OFFSET:限制返回行数。

关键子句间的逻辑关系

子句依赖关系输出结果
FROM基础表或子查询的原始数据
WHERE依赖 FROM 的结果过滤后的行数据
GROUP BY依赖 WHERE 的结果按字段分组后的数据集
HAVING依赖 GROUP BY 的结果过滤分组后的组
WINDOW FUNCTION依赖 GROUP BYHAVING 的结果(若存在)添加窗口函数计算的列
SELECT依赖所有前置子句的结果最终输出的字段(含聚合函数、别名、窗口函数结果)
ORDER BY依赖 SELECT 的结果排序后的结果集
LIMIT/OFFSET依赖 ORDER BY 的结果(若存在)最终返回的有限行数

表格总结:各 SQL 的关键字段与执行顺序

SQL 示例关键子句执行顺序注释要点
示例 1SELECT, FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT1. JOIN → 2. WHERE → 3. GROUP BY → 4. HAVING → 5. SELECT → 6. ORDER BY → 7. LIMIT- JOIN 先于 WHERE 执行
- GROUP BY 必须包含非聚合字段 department
- HAVING 过滤分组后的平均工资
示例 2SELECT (窗口函数), FROM (子查询), WHERE, ORDER BY, LIMIT1. 子查询 → 2. WHERE → 3. 窗口函数 → 4. SELECT → 5. ORDER BY → 6. LIMIT- 子查询先执行过滤年龄
- 窗口函数依赖分组后的数据(隐式分组)
- RANK() 为全局排名
示例 3SELECT, FROM (多表 JOIN), WHERE, GROUP BY, HAVING, UNION, ORDER BY, LIMIT1. JOIN → 2. WHERE → 3. GROUP BY → 4. HAVING → 5. UNION → 6. SELECT → 7. ORDER BY → 8. LIMIT- UNION 合并两个不同结构的 SELECT 结果
- DISTINCT 去重产品 ID
- 最终排序全局生效

关键点说明

  1. 窗口函数的特殊性

    • 示例 2 中的 SUM(...) OVER (PARTITION BY ...)GROUP BY 之后执行,允许对分组后的数据进行计算,但不会合并行。
    • 窗口函数可与非聚合字段(如 e.*)同时出现在 SELECT 中。
  2. 子查询的优先级

    • 示例 2 的内层子查询(SELECT * FROM employees WHERE age BETWEEN 25 AND 35)在外部查询的 FROM 阶段优先执行。
  3. DISTINCT 的位置

    • 示例 3 中的 COUNT(DISTINCT product_id)GROUP BY 阶段计算,确保统计唯一产品数量。
  4. UNION 的处理

    • 示例 3 的 UNION 合并两个 SELECT 结果后,才会执行全局的 ORDER BYLIMIT

通过以上分析,可清晰理解 SQL 各子句的执行顺序及相互依赖关系,帮助优化查询性能和结果准确性。

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

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

相关文章

设计模式--建造者模式详解

建造者模式 建造者模式也属于创建型模式,它提供了一种创建对象的最佳方式 定义:将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示(假设有不同的建造者实现类,可以产生不同的产品&#xff09…

PCB 过孔铜厚的深入指南

***前言:在上一期的文章中介绍了PCB制造的工艺流程,但仍然想在过孔的铜厚和PCB的过孔厚径比两个方面再深入介绍。 PCB铜厚的定义 电路中铜的厚度以盎司(oz)**表示。那么,为什么用重量单位来表示厚度呢? 盎司(oz)的定义 将1盎司(28.35 克)的铜…

如何配置 Conda 使用镜像源加速

如何配置 Conda 使用镜像源加速 为了提高使用 Anaconda 或 Miniconda 时包管理的速度,特别是在国内网络环境下,可以通过配置镜像源来实现更快的下载。以下是详细的步骤说明: 1. 安装 Conda(如果尚未安装) 如果你还没…

【k8s】k8s是怎么实现自动扩缩的

Kubernetes 提供了多种自动扩缩容机制,主要包括 Pod 水平自动扩缩(HPA)、垂直 Pod 自动扩缩(VPA) 和 集群自动扩缩(Cluster Autoscaler)。以下是它们的实现原理和配置方法: 1. Pod …

Reflex 完全指南:用 Python 构建现代 Web 应用的终极体验

“写 Python,就能构建 Web 前端。”——这不再是梦想,而是由 Reflex 带来的现实。 过去,构建一个现代 Web 应用意味着你要学会前端(React/JS/HTML/CSS) 后端(Flask/Django) API 交互&#xff08…

Vue实战(08)解决 Vue 项目中路径别名 `@` 在 IDE 中报错无法识别的问题

一、引言 ​ 在 Vue 项目开发过程中,路径别名是一个非常实用的特性,它能够帮助开发者简化文件引用路径,提高代码的可读性和可维护性。其中, 作为一个常见的路径别名,通常被用来指向项目的 src 目录。然而,…

5.学习笔记-SpringMVC(P61-P70)

SpringMVC-SSM整合-接口测试 (1)业务层接口使用junit接口做测试 (2)表现层用postman做接口测试 (3)事务处理— 1)在SpringConfig.java,开启注解,是事务驱动 2)配置事务管理器(因为事务管理器是要配置数据源对象&…

[论文阅读]REPLUG: Retrieval-Augmented Black-Box Language Models

REPLUG: Retrieval-Augmented Black-Box Language Models REPLUG: Retrieval-Augmented Black-Box Language Models - ACL Anthology NAACL-HLT 2024 在这项工作中,我们介绍了RePlug(Retrieve and Plug),这是一个新的检索增强型…

Mysql的深度分页查询优化

一、深度分页为什么慢? 当执行 SELECT * FROM orders ORDER BY id LIMIT 1000000, 10 时: MySQL 会扫描前 1,000,010 行,丢弃前 100 万行,仅返回 10 行。偏移量(offset)越大,扫描行数越多&…

最新扣子(Coze)案例教程:Excel数据生成统计图表,自动清洗数据+转换可视化图表+零代码,完全免费教程

大家好,我是斜杠君。 知识星球群有同学和我说每天的工作涉及很多数据表的重复操作,想学习Excel数据表通过大模型自动转数据图片的功能。 今天斜杠君就带大家一起搭建一个智能体,以一个销售行业数据为例,可以快速实现自动清洗Exc…

Uniapp 中缓存操作指南

在 Uniapp 中,你可以使用三种方式操作缓存:同步方法、异步方法和 Vuex 持久化存储。以下是详细的设置、获取和清除缓存的方法: 1. 同步方法 设置缓存 uni.setStorageSync(key, value); // 示例 uni.setStorageSync(token, abc123); 获取缓存 const value = uni.getStor…

k8s的yaml文件里的volume跟volumeMount的区别

volume 是 Pod 级别的资源,用于定义存储卷。它是一个独立于容器的存储资源,可以被一个或多个容器共享使用。volume 的定义位于 Pod 的 spec.volumes 部分。 特点 独立性:volume 是 Pod 的一部分,而不是容器的一部分。它独立于容…

梅毒单阳能否通过国企体检?

国企体检通常会参照公务员体检标准进行,梅毒检测是其中的常规项目。 一、明确“梅毒单阳”的定义 检测指标解析 TPPA阳性RPR阴性:可能为既往感染已治愈,或极早期/晚期梅毒; RPR阳性TPPA阴性:需警惕假阳性&#xff08…

Python 爬虫实战 | 企名科技

文章目录 一、企名科技1、目标网站2、网站特点3、确定解密位置4、扣js代码 一、企名科技 1、目标网站 网址:https://wx.qmpsee.com/articleDetail?idfeef62bfdac45a94b9cd89aed5c235be目标数据:获取消费行业研究下面的13篇文章数据 2、网站特点 服…

Pikachu靶场

本质是信任了不可信的客户端输入。防御核心: 永不信任客户端提交的权限参数(如 user_id, role)。强制服务端校验用户身份与操作权限。定期审计权限模型,避免业务迭代引入新漏洞。 水平越权 1,按照网站的提示要求登录 进…

C++区别于C语言的提升用法(万字总结)

1.namespace产生原因 在C语言中,变量,函数,以至于类都是大量存在的,因此会产生大量的名称存在于全局作用域中,可能产生很多冲突,至此c的祖师爷为避免命名冲突和名字的污染,造出来了关键字names…

数据库day-07

一、实验名称和性质 子查询 验证 设计 二、实验目的 1.掌握子查询的嵌套查询; 2.掌握集合操作 3.了解EXISTS嵌套查询方法; 三、实验的软硬件环境要求 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块…

【前端】【业务场景】【面试】在前端开发中,如何实现文件的上传与下载功能,并且处理可能出现的错误情况?

前端文件上传与下载攻略 本文目标&#xff1a;帮你快速掌握文件上传 & 下载的核心实现方式&#xff0c;并在常见出错场景下保持“优雅不崩溃”。 一、文件上传 1. 基础结构 <input type"file" id"fileInput" /> <button id"uploadBtn&…

Kafka 消息积压监控和报警配置的详细步骤

Kafka 消息积压监控和报警配置的详细步骤示例&#xff0c;涵盖常用工具&#xff08;如 Prometheus Grafana、云服务监控&#xff09;和自定义脚本方法&#xff1a; 一、监控配置 方法1&#xff1a;使用 Prometheus Grafana kafka-exporter 步骤1&#xff1a;部署 kafka-ex…

【C++】内存管理:内存划分、动态内存管理(new、delete用法)

文章目录 一、C/C中的内存划分二、C语言中动态内存管理方式三、C中动态内存管理方式1、new、delete基本用法(1)、内置类型(2)、自定义类型 2、operator new与operator delete函数3、new和delete的实现原理&#xff08;1&#xff09;内置类型&#xff08;2&#xff09;自定义类型…