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

SQL 復雜查詢全解析:連接、子查詢、聯合查詢實戰語法指南

     編輯:DB2 教學

SQL 復雜查詢全解析:連接、子查詢、聯合查詢實戰語法指南

1. 連接查詢

1.1 基礎語法

FROM table1 join_type table2 [ON (join_condition)] [WHERE (query_condition)]
  • table1:左表(驅動表)
  • table2:右表
  • join_type:連接類型

1.2 交叉連接

笛卡爾積,無連接條件,慎用於大表。

SELECT * FROM customer CROSS JOIN orders;
-- 等價舊語法
SELECT * FROM customer, orders;

1.3 內連接

僅返回滿足連接條件的行。

-- 隱式內連接(舊語法,不推薦)
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;

1.4 外連接

  • 左外連接:返回左表所有行 + 右表匹配行,無匹配則 NULL 填充
    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 優化等效,但語義上應根據業務選擇。

2. 子查詢(嵌套查詢)

將一個 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;

3. 聯合查詢

合併多個 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;

進階技巧與最佳實踐

  1. 用 EXISTS 替代 IN:大數據量下 EXISTS (SELECT 1 FROM ...) 通常優於 IN,可利用索引半連接。
  2. 避免 SELECT *:明確列出所需列,減少網絡傳輸、利用覆蓋索引。
  3. 關聯子查詢去相關化:將關聯子查詢改寫為 JOIN 或派生表,讓優化器有更多執行計劃選擇。
  4. 分頁優化:大偏移量 LIMIT 100000, 20 改為「記住上次最大 ID」游標分頁:WHERE id > last_max_id LIMIT 20。
  5. CTE 提升可讀性:WITH cte AS (...) SELECT ... 替代嵌套子查詢,邏輯清晰且可複用。

掌握連接類型語義差異、子查詢分類與改寫技巧、UNION/UNION ALL 選擇原則,是編寫高性能 SQL 的核心基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved