SQL 子查詢全位置解析:可編寫子查詢的 7 大子句

🔍 SQL 子查詢全位置解析:可編寫子查詢的 7 大子句

子查詢可以出現在 SQL 語句的多個關鍵位置,不同位置的子查詢具有獨特的行為和限制。以下是系統化總結:


📌 1. WHERE 子句(最常用)

SELECTFROMWHERE 列 操作符 (SELECT ...);

類型

  • 標量子查詢(單值)
  • 行子查詢(單行多列)
  • 集合子查詢(多行單列)
    示例
-- 標量子查詢
SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);-- 集合子查詢
SELECT * FROM customers
WHERE id IN (SELECT cust_id FROM orders);

📊 2. FROM 子句(派生表)

SELECTFROM (SELECT ...) AS 別名 
WHERE 條件;

特點

  • 必須指定別名
  • 可包含任意復雜查詢
  • 實質是創建臨時視圖
    示例
SELECT dept, avg_sal
FROM (SELECT dept_id, AVG(salary) AS avg_salFROM employeesGROUP BY dept_id
) AS dept_avg;

🎯 3. SELECT 子句(標量子查詢)

SELECT,(SELECT ...) AS 別名 
FROM;

限制

  • 必須返回單行單列
  • 通常為關聯子查詢(引用外部列)
  • 每行都會執行一次
    示例
SELECT name,salary,(SELECT AVG(salary) FROM employees) AS avg_sal,salary - (SELECT AVG(salary) FROM employees) AS diff
FROM employees;

🔍 4. HAVING 子句

SELECT 聚合列 
FROMGROUP BYHAVING 聚合函數() 操作符 (SELECT ...);

特點

  • 在分組后執行
  • 可訪問聚合函數結果
    示例
SELECT dept_id, AVG(salary) 
FROM employees
GROUP BY dept_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

🔄 5. JOIN 子句

SELECTFROM1 
JOIN (SELECT ...) AS 別名 ON 連接條件;

優勢

  • 預先過濾/聚合連接表
  • 減少連接數據量
    示例
SELECT c.name, o.order_count
FROM customers c
JOIN (SELECT cust_id, COUNT(*) AS order_countFROM ordersGROUP BY cust_id
) o ON c.id = o.cust_id;

?? 6. INSERT 語句

插入數據來源
INSERT INTO 目標表 ()
SELECT ... FROM 源表;

示例

INSERT INTO premium_users (id, name)
SELECT id, name 
FROM users
WHERE total_spend > 10000;
插入值計算
INSERT INTO(1,2) 
VALUES ((SELECT ...), (SELECT ...)
);

限制

  • 每個子查詢必須返回單值
    示例
INSERT INTO stats (total_users, avg_salary)
VALUES ((SELECT COUNT(*) FROM users),(SELECT AVG(salary) FROM employees)
);

?? 7. UPDATE 語句

UPDATESET= (SELECT ...) 
WHERE 條件;

關鍵點

  • SET 子句的子查詢必須返回單值
  • WHERE 子句可嵌套子查詢
    示例
-- 更新員工薪資為部門平均
UPDATE employees e
SET salary = (SELECT AVG(salary)FROM employees WHERE dept_id = e.dept_id
);

?? 8. 特殊位置注意事項

ORDER BY 子句(少用)
SELECTFROMORDER BY (SELECT ...);

限制

  • 子查詢必須返回單值
  • 每行執行一次,性能差
    示例
SELECT name, salary
FROM employees
ORDER BY (SELECT AVG(salary) FROM employees);
CREATE VIEW 語句
CREATE VIEW 視圖名 AS
SELECT ... FROM (SELECT ...);

?? 子查詢通用注意事項

  1. NULL 處理

    • NOT IN 遇 NULL 返回空集 → 用 NOT EXISTS 替代
    -- 危險
    WHERE id NOT IN (SELECT ...) -- 安全
    WHERE NOT EXISTS (SELECT 1 FROM ...)
    
  2. 性能陷阱

    • 關聯子查詢(Correlated Subquery)導致 O(n2) 復雜度
    • 解決方案:
      -- 低效
      SELECT * FROM t1 
      WHERE col = (SELECT ... FROM t2 WHERE t2.id = t1.id)-- 高效:轉為 JOIN
      SELECT t1.* 
      FROM t1 
      JOIN (SELECT ... FROM t2) sub ON t1.id = sub.id
      
  3. 返回結果限制

    位置允許的行/列是否需別名
    WHERE單行或多行(取決操作符)
    FROM任意
    SELECT單行單列可選
    HAVING單行或多行
    SET (UPDATE)單行單列
  4. 可讀性優化

    • 超過 2 層嵌套時改用 CTE(公共表表達式):
    -- 嵌套子查詢(難維護)
    SELECT ...
    FROM (SELECT ... FROM (SELECT ...)) -- CTE 優化版
    WITH step1 AS (SELECT ...),step2 AS (SELECT ... FROM step1)
    SELECT ... FROM step2;
    

💎 子查詢位置決策指南

使用場景首選位置替代方案
行級條件過濾WHEREJOIN
創建臨時數據集FROMCTE/臨時表
動態計算列值SELECT應用層計算
分組后過濾HAVING子查詢 + WHERE
批量插入數據INSERT SELECTETL工具
基于查詢結果更新UPDATE SET多語句事務
復雜數據集連接前預處理JOIN物化視圖

📌 黃金法則

  1. 能用 JOIN 解決不用子查詢(優化器更易優化)
  2. 標量子查詢優先放 SELECT,集合查詢優先放 WHERE
  3. 關聯子查詢是 性能最后選項 - 必須用 EXPLAIN 分析
  4. MySQL 中避免在 SELECT 子查詢更新相同表(錯誤 1093)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86749.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86749.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#高級:Winform桌面開發中DataGridView的詳解(新)

一、數據填充&#xff08;反射&#xff09; 1.封裝 /// <summary> /// 渲染DataGridView /// </summary> /// <param name"dataGridView">被渲染控件</param> /// <param name"list">數據集</param> /// <param …

人臉活體識別2:Pytorch實現人臉眨眼 張嘴 點頭 搖頭識別(含訓練代碼和數據集)

人臉活體識別2&#xff1a;Pytorch實現人臉眨眼 張嘴 點頭 搖頭識別(含訓練代碼和數據集) 目錄 人臉活體識別2&#xff1a;Pytorch實現人臉眨眼 張嘴 點頭 搖頭識別(含訓練代碼和數據集) 1. 前言 2.人臉活體識別方法 &#xff08;1&#xff09;基于人臉動作的檢測?? &a…

Webpack 自定義插件開發指南:構建流程詳解與實戰開發全攻略

一. webpack打包流程 開發 Webpack 插件的第一步&#xff0c;就是明確&#xff1a;我的插件要接入 Webpack 構建流程的哪個階段&#xff0c;解決什么問題。 了解流程之前首先要了解插件的兩個核心概念&#xff1a;compiler&#xff0c;compilation 1. compiler&#xff1a;全局…

本地部署Dify+Ragflow及使用(一)

概念說明 RAGflow&#xff1a; 吃透知識&#xff1a;將企業文檔&#xff08;如技術白皮書&#xff09;解析為結構化知識片段。精準檢索&#xff1a;當用戶提問時&#xff0c;從知識庫中召回最相關內容。 模型供應商&#xff1a; 提供大腦&#xff1a;為 Dify 提供生成答案的模…

2025.06.24【R語言】|clusterProfiler安裝與常見報錯FAQ全解

文章目錄 一、clusterProfiler安裝方法1. Bioconductor官方推薦2. Conda安裝&#xff08;個人推薦 適合服務器/依賴復雜環境&#xff09;3. 檢查安裝 二、常見依賴包安裝三、常見報錯與解決方案1. 報錯&#xff1a;could not find function "bitr"2. 報錯&#xff1a…

【轉】PostgreSql的鏡像地址

docker.io/postgres 項目中國可用鏡像列表 | 高速可靠的 Docker 鏡像資源 docker.io/postgrest/postgrest:v12.2.8 linux/amd64 docker.io17.34MB2025-04-04 13:14 346 docker.io/postgrest/postgrest:v12.2.12 linux/amd64 docker.io17.38MB2025-05-27 22:02 79 docker.io…

爬蟲005----Selenium框架

在總結爬蟲 &#x1f577; 框架之前&#xff0c;先總結一下selenium框架&#xff0c;也可以說是selenium庫&#xff0c;在自動化測試中是老生常談了&#xff08;長時間??不用&#xff0c;已經忘記了&#xff0c;實際測試工作中做UI自動化的也很少了&#xff0c;上次搞UI自動化…

記一次 Kafka 磁盤被寫滿的排查經歷

開篇扯犢子 今天踏進辦公聽到不是同事的早安&#xff0c;而是“有一個好消息&#xff0c;一個壞消息&#xff0c;你想聽哪個&#xff1f;” 我一愣&#xff0c;心想“大早上&#xff0c;就要玩刺激的嗎&#xff1f;” 但是還是淡定的回復說“無所謂&#xff0c;哥什么場面沒見…

python多線程:各線程的輸出在控制臺中同一行原因分析

代碼例子 import threading import timedef error_worker():print("子線程開始")time.sleep(1)raise Exception("子線程出錯了&#xff01;")t threading.Thread(targeterror_worker) t.start()print("主線程繼續執行&#xff0c;不受子線程異常影響…

Promptify與ReActAgent

一、Promptify 定位&#xff1a;NLP 任務的「自動化流水線」 1. 解決什么問題&#xff1f; 傳統 LLM 應用開發痛點&#xff1a; 反復調試&#xff1a;需手工編寫/調整 prompt 格式&#xff08;如調整分隔符、示例數量&#xff09;兼容性差&#xff1a;不同模型需重寫適配代碼…

如何將視頻從 iPhone 發送到 Android 設備

如果您想將視頻從 iPhone 發送到 Android 設備&#xff0c;尤其是視頻尺寸較大時&#xff0c;您需要一種高效的傳輸方法。本文將為您提供 7 種實用方法&#xff0c;讓您輕松發送大型視頻文件或短視頻片段&#xff0c;并且不會損失視頻質量。 第 1 部分&#xff1a;如何通過 iRe…

Stable Diffusion入門-ControlNet 深入理解 第四課:風格遷移與重繪控制模型——讓AI也有“藝術天賦”!

大家好&#xff0c;歡迎回到 Stable Diffusion入門-ControlNet 深入理解 系列的第四課&#xff01; 如果你還沒有看過上一課&#xff0c;趕緊補課哦&#xff1a;Stable Diffusion入門-ControlNet 深入理解 第三課。 上一課我們講解了 ControlNet 結構類模型&#xff0c;今天我…

國產鴻蒙系統開放應用側載,能威脅到Windows地位嗎?

上個月華為正式發布了 HarmonyOS PC 操作系統&#xff0c;關于生態方面大家其實一直蠻擔心。 例如不兼容Windows應用、不支持應用側載等。 不過&#xff0c;在最近舉行的華為開發者大會 2025 電腦分論壇上&#xff0c;華為終端 BG 平板與 PC 產品線總裁&#xff08;朱懂東&am…

Linux登錄檢查腳本

登錄檢查腳本 提高兼容性&#xff08;適應不同Linux發行版&#xff09;增強可視化效果和可讀性增加關鍵資源警戒提示優化表格對齊和顏色使用添加系統安全狀態檢查 #!/bin/bash# 改進版系統登錄提示腳本 # 優化點&#xff1a;兼容性增強、資源警戒提示、表格美化、安全狀態檢查…

jenkinsfile調用groovy

先決條件 gitlab存放jenkinsfile以及groovy代碼,jenkins我個人使用的是2.486具體的部署方法自己搞定,一堆文檔. gitlab創建一個devops8項目組以及my-jenkins-demo2項目用于演示過程 創建群組 這里已經創建好相關群組. 進入群組創建新項目 創建一個空白項目 配置項目選項 說明…

Ubuntu20.04離線安裝Realtek b852無線網卡驅動

最近有個項目&#xff0c;需要在 Ubuntu20.04 LTS 下開發&#xff0c;首先是安裝 Linux&#xff0c;我們可以從下面的網址下載&#xff1a; https://releases.ubuntu.com/20.04/ 本以為一切順利&#xff0c;結果剛開始就給我整不會了。我的電腦是聯想設計師GeekPro7&#xff…

1 Studying《Computer Architecture A Quantitative Approach》5-7

目錄 5 Thread-Level Parallelism 5.1 Introduction 5.2 Centralized Shared-Memory Architectures 5.3 Performance of Symmetric Shared-Memory Multiprocessors 5.4 Distributed Shared-Memory and Directory-Based Coherence 5.5 Synchronization: The Basics 5.6 M…

融智興科技: RFID超高頻柔性抗金屬標簽解析

在當今科技飛速發展的時代&#xff0c; RFID技術憑借其獨特的優勢&#xff0c;在眾多領域得到了廣泛應用。然而&#xff0c;在金屬環境中&#xff0c;傳統RFID標簽往往面臨著諸多挑戰&#xff0c;如信號干擾、識別距離短等問題。融智興科技推出的RFID 超高頻柔性抗金屬標簽&…

PHP Error: 深入解析與解決策略

PHP Error: 深入解析與解決策略 引言 PHP作為世界上最流行的服務器端腳本語言之一,在全球范圍內被廣泛使用。然而,在PHP的開發過程中,錯誤處理是一個非常重要的環節。本文將深入探討PHP錯誤處理的相關知識,包括錯誤類型、錯誤配置、錯誤日志以及常見的錯誤解決策略。 PH…

零基礎langchain實戰二:大模型輸出格式化成json

零基礎langchain實戰一&#xff1a;模型、提示詞和解析器-CSDN博客 書接上文 大模型輸出格式化 在下面例子中&#xff1a;我們需要將大模型的輸出格式化成json。 import os from dotenv import load_dotenvload_dotenv() # 加載 .env 文件 api_key os.getenv("DEEPS…