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

MySQL 子查詢與標量子查詢實戰教程:從基礎語法到關聯查詢替代方案

     編輯:MySQL 綜合教學

MySQL 子查詢與標量子查詢實戰教程:從基礎語法到關聯查詢替代方案

子查詢將一個 SELECT 的結果作為另一條 SQL 的中間條件。MySQL 支持標準 SQL 所有子查詢形式,並有擴展特性。本文涵蓋一般子查詢、標量子查詢、比較操作、與 JOIN 的抉擇。

一般子查詢:IN 子查詢經典案例

查詢狀態正常(status=1)用戶發布的文章:

SELECT * FROM article 
WHERE uid IN (SELECT uid FROM user WHERE status=1)

子查詢先返回 uid 列表 (1,2),外層查詢等價於 WHERE uid IN (1,2)。

標量子查詢:單值返回的精準控制

標量子查詢返回單一值(數字/字符串),可直接參與 = > < >= <= <> 比較,通常置於比較式右側。

SELECT * FROM article 
WHERE uid = (SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1)

子查詢返回最大 uid=2,外層轉為 WHERE uid = 2。
另例:查詢某表列值等於另一表最大值:

SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2)

子查詢 vs 表連接:何時必須用子查詢?

許多場景子查詢與 JOIN 效果相近,但以下情況只能用子查詢:

  • 聚合函數結果直接參與比較:WHERE col = (SELECT MAX(...) FROM ...)
  • 關聯子查詢引用外層表列:
SELECT * FROM article AS t 
WHERE 2 = (SELECT COUNT(*) FROM article WHERE article.uid = t.uid)

查詢「發表恰好 2 篇文章的用戶的所有文章」。外層別名 t 被內層引用,JOIN 難以直接表達。

提示

  • 使用 = > < 等比較運算符時,子查詢必須返回標量;唯一例外是 = 可配合行子查詢。
  • 能用 JOIN 解決的優先考慮 JOIN,通常效率更高且可讀性更好。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved