FROM table1 join_type table2 [ON (join_condition)] [WHERE (query_condition)]
table1:左表(驅動表)table2:右表join_type:連接類型笛卡爾積,無連接條件,慎用於大表。
SELECT * FROM customer CROSS JOIN orders; -- 等價舊語法 SELECT * FROM customer, orders;
僅返回滿足連接條件的行。
-- 隱式內連接(舊語法,不推薦) SELECT * FROM customer c, orders o WHERE c.id = o.customer_id; -- 顯式內連接(標準語法,推薦) SELECT * FROM customer c INNER JOIN orders o ON c.id = o.customer_id;
SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.id = o.customer_id;
SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.id = o.customer_id;
內連接等價於「左外連接 + WHERE 右表主鍵 IS NOT NULL」。現代優化器對 INNER/LEFT JOIN 優化等效,但語義上應根據業務選擇。
將一個 SELECT 語句嵌套在另一個語句的 WHERE、FROM、SELECT 子句中。
-- 標量子查詢:返回單值 SELECT * FROM orders WHERE customer_id = (SELECT id FROM customer WHERE name = '張三'); -- 列子查詢:返回單列多值,配合 IN/ANY/ALL SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customer WHERE city = '北京'); -- 表子查詢:返回結果集,用於 FROM 子句(派生表) SELECT t.name, t.order_cnt FROM (SELECT c.name, COUNT(*) AS order_cnt FROM customer c JOIN orders o ON c.id=o.customer_id GROUP BY c.name) t WHERE t.order_cnt > 5;
合併多個 SELECT 結果集,要求列數、類型兼容。
-- UNION:並集,去重(性能較差) SELECT * FROM orders WHERE price > 200 UNION SELECT * FROM orders WHERE customer_id = 1; -- UNION ALL:並集,不去重(性能優,推薦無重複場景) SELECT * FROM orders WHERE price > 200 UNION ALL SELECT * FROM orders WHERE customer_id = 1;
EXISTS (SELECT 1 FROM ...) 通常優於 IN,可利用索引半連接。LIMIT 100000, 20 改為「記住上次最大 ID」游標分頁:WHERE id > last_max_id LIMIT 20。WITH cte AS (...) SELECT ... 替代嵌套子查詢,邏輯清晰且可複用。掌握連接類型語義差異、子查詢分類與改寫技巧、UNION/UNION ALL 選擇原則,是編寫高性能 SQL 的核心基本功。