首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL FROM 子查詢與 EXISTS/NOT EXISTS 實戰指南:衍生表、存在性檢查與效能優化

     編輯:MySQL 綜合教學

MySQL FROM 子查詢與 EXISTS/NOT EXISTS 實戰指南:衍生表、存在性檢查與效能優化

子查詢出現在 FROM 子句中稱為 FROM 子查詢(衍生表),出現在 WHERE 中配合 EXISTS 則用於存在性檢查。兩者機制與適用場景截然不同。

FROM 子查詢:生成臨時衍生表

語法:

SELECT ... FROM (subquery) AS name ...

子查詢產生臨時表,必須指定別名(AS name)。可返回標量、列、行或表,但不能是相關子查詢。

實戰示例

表 table1(s1, s2):(1,5), (2,12), (3,20)。先將 s2 乘 2 再篩選:

SELECT s1, s2 FROM (SELECT s1, s2*2 AS s2 FROM table1) AS temp WHERE s1 > 1

返回 (2,24), (3,40)。衍生表 temp 讓複雜邏輯分步執行,結構清晰。

EXISTS / NOT EXISTS 子查詢:高效的存在性判斷

語法:

SELECT ... FROM table WHERE EXISTS (subquery)

邏輯:將主查詢每行數據代入子查詢驗證,若子查詢返回至少一行(TRUE)則保留該行。NOT EXISTS 則保留無匹配行。

實戰案例:主從表關聯驗證

查詢 article 中 uid 存在於 user 表的記錄:

SELECT * FROM article 
WHERE EXISTS (SELECT * FROM user WHERE article.uid = user.uid)

第 4 條記錄 uid 在 user 中不存在,被過濾。若改用 NOT EXISTS 則保留第 4 條。

關鍵提示與優化建議

  • EXISTS (subquery) 僅返回 TRUE/FALSE,SELECT * 可替換為 SELECT 1,官方說明執行時忽略選擇列表。
  • 實際執行計劃經優化器重寫,未必逐行對比;效能敏感場景需 EXPLAIN 實測。
  • EXISTS 常可用 JOIN、IN、條件表達式替代,具體哪種最優需視數據分佈、索引情況而定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved