常見數據庫關鍵字示例 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.pswp.cn/web/77047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77047.shtml
英文地址,請注明出處:http://en.pswp.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;自定義類型…