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

《MySQL必知必會》學習筆記:子查詢從入門到實戰

     編輯:MySQL 綜合教學

子查詢:嵌套 SELECT 的強大威力

子查詢(Subquery)是指出現在另一條 SQL 語句內部的 SELECT 語句,常用於將多步驟查詢合併為單條語句。

準備工作:建立三張測試表

-- 客戶表
CREATE TABLE customers (
    cust_id INT PRIMARY KEY,
    cust_name VARCHAR(10),
    cust_tel VARCHAR(10)
);

-- 訂單表
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    cust_id INT,
    order_time DATETIME,
    FOREIGN KEY (cust_id) REFERENCES customers(cust_id)
);

-- 訂單明細表
CREATE TABLE orderitems (
    item_id INT PRIMARY KEY,
    order_id INT,
    content VARCHAR(20),
    quantity INT,
    FOREIGN KEY (order_id) REFERENCES orders(order_id)
);

測試數據截圖:

customers 表

orders 表

orderitems 表

場景:查詢訂購「apple」的所有客戶資訊

傳統分步查詢:

  1. SELECT order_id FROM orderitems WHERE content = 'apple';
  2. SELECT cust_id FROM orders WHERE order_id IN (...);
  3. SELECT cust_name, cust_tel FROM customers WHERE cust_id IN (...);

子查詢合併寫法(由內而外)

-- 步驟 1+2 合併
SELECT cust_id FROM orders
WHERE order_id IN (
    SELECT order_id FROM orderitems WHERE content = 'apple'
);

-- 完整三層嵌套
SELECT cust_name, cust_tel FROM customers
WHERE cust_id IN (
    SELECT cust_id FROM orders
    WHERE order_id IN (
        SELECT order_id FROM orderitems WHERE content = 'apple'
    )
);

分步查詢結果

兩層子查詢結果

三層子查詢最終結果

關鍵規則:
1. 子查詢 SELECT 列數必須與外層 IN / = 比較的列數一致
2. 嵌套層數理論無限制,但效能考量建議 ≤ 3 層
3. 格式化縮進、分行寫法大幅提升可讀性

子查詢作為計算欄位

需求:顯示每位客戶的訂單總數

-- 單客戶查詢
SELECT COUNT(*) AS order_total FROM orders WHERE cust_id = 1;

-- 作為計算欄位
SELECT cust_name, cust_tel,
    (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS order_total
FROM customers;

單客戶訂單數

計算欄位結果

相關子查詢:內層引用外層表別名(orders.cust_id = customers.cust_id),外層每行都會執行一次內層查詢。大數據量時建議改用 JOIN + GROUP BY 或 衍生表 優化。

最佳實踐總結

  1. 先分步驗證:每一步單獨跑通,確認結果正確
  2. 由內而外組合:逐層包裝成子查詢,每層驗證
  3. 注意列匹配:IN 子查詢返回單列,EXISTS 不關心列
  4. 效能考量:
      - 優先考慮 JOIN 替代 IN 子查詢
      - EXISTS 通常比 IN 快(可短路)
      - 避免在 SELECT 列表放相關子查詢(N+1 問題)
      - 必要時用 WITH CTE (MySQL 8.0+) 拆解複雜邏輯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved