多表查詢是 SQL 核心技能。本文系統梳理 18 大類多表查詢模式:基本多表 SELECT、別名應用、UNION 集合運算、簡單/複雜子查詢、ANY/SOME/ALL 量詞、派生表、子查詢作表達式、關聯子查詢、多表 UNION、排序優化、條件 UNION、內連接、外連接、IN/NOT IN 範圍限定、關聯子查詢、HAVING 分組過濾,並附帶實戰避坑指南。
-- 隱式內連接(舊語法,不推薦) SELECT a.id, a.name, b.math FROM tb_demo a, tb_demo_tel b WHERE a.id = b.id; -- 顯式內連接(標準語法) SELECT a.id, a.name, b.math FROM tb_demo a INNER JOIN tb_demo_tel b ON a.id = b.id;
別名規則:定義別名後不可再使用原表名;多表有同名欄位時必須加前綴(表名/別名)。
SELECT id, name FROM table1 UNION -- 去重 SELECT id, name FROM table2; SELECT id, name FROM table1 UNION ALL -- 保留重複 SELECT id, name FROM table2;
前提:欄位數、順序、資料型別相容。
WHERE id IN (SELECT id FROM t WHERE ...)> ANY -- 大於子查詢任一值 > ALL -- 大於子查詢所有值 = ANY -- 等於任一值 (等價 IN) != ALL -- 不等於所有值 (等價 NOT IN)
SELECT * FROM (SELECT ... FROM t) AS alias,必須加別名。SELECT (SELECT AVG(score) FROM t) AS avg_score FROM t; 建議加別名便於應用層取值。ORDER BY。GROUP BY ... HAVING 實現優先順序輸出(如指定出版社置頂)。-- IN 範圍 SELECT * FROM t WHERE code IN (SELECT code FROM t WHERE code BETWEEN 'A' AND 'Z'); -- HAVING 分組過濾(聚合後過濾) SELECT name, math FROM t GROUP BY id HAVING math > 95;
JOIN ... ON。= → ✅ 用 IN / ANY / ALL。AS alias。UNION 欄位數/型別不一致 → ✅ 統一欄位列表,必要時 CAST。ON 子句,否則退化為內連接。熟練掌握這 18 種模式,應對 99% 多表查詢場景綽綽有餘。