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

MySQL 多表查詢核心:內連接與嵌套查詢實戰,主外鍵關系建模

     編輯:MySQL 綜合教學

MySQL 多表查詢核心:內連接與嵌套查詢實戰,主外鍵關系建模

多表查詢是業務開發高頻痛點。本文以「學生-班級-關系表」經典模型,通過可視化圖解,演示如何用 內連接 與 子查詢 高效解決「查詢 1 班學生名單」問題,並深度解析主鍵/外鍵約束的完整性語義。

一、業務模型與 ER 圖

三表結構

表名核心列業務含義
i_studentid (PK), name學生實體,3 條記錄:a、b、c
i_classid (PK)班級實體,2 條記錄:1、2
i_class_studentclass_id (FK), student_id (FK)多對多關系表:1班→a,b;2班→c

學生表數據 班級表數據 關系表數據

二、關系完整性語義

  • 實體完整性:主鍵 id NOT NULL + UNIQUE,保證每行唯一標識。
  • 參照完整性:外鍵 class_id → i_class.id、student_id → i_student.id,防止孤兒記錄,級聯動作由應用/觸發器控制。

關系圖解

三、分步構建查詢邏輯

步驟 1:從關系表獲取 1 班學生 ID

SELECT student_id FROM i_class_student WHERE class_id = 1;

步驟1結果

返回:1, 2

步驟 2:從學生表獲取 ID-Name 映射

SELECT id, name FROM i_student;

步驟2結果

步驟 3:內連接融合兩張結果集

SELECT t1.name 
FROM i_student AS t1 
INNER JOIN (
    SELECT student_id FROM i_class_student WHERE class_id = 1
) AS t2 ON t1.id = t2.student_id;

連接過程 最終結果

結果:a, b ✅

四、等價寫法對比

寫法SQL優缺點
內連接 + 子查詢上文方案語義清晰,優化器易轉換為 Semi-Join
直接多表 JOINSELECT s.name FROM i_student s JOIN i_class_student cs ON s.id=cs.student_id WHERE cs.class_id=1;最簡潔,推薦生產環境
EXISTS 子查詢SELECT name FROM i_student s WHERE EXISTS (SELECT 1 FROM i_class_student cs WHERE cs.student_id=s.id AND cs.class_id=1);大表驅動小表時性能優,語義「存在即可」
IN 子查詢SELECT name FROM i_student WHERE id IN (SELECT student_id FROM i_class_student WHERE class_id=1);MySQL 5.6+ 優化為 Semi-Join,性能同 EXISTS

五、避坑指南

  1. 拒絕 SELECT *:只選業務需要列,減少網絡傳輸、緩存污染、回表開銷。
  2. 關聯列建索引:i_class_student(class_id, student_id) 複合索引覆蓋查詢。
  3. 小表驅動大表:優先過濾選擇性高的表(如 class_id=1 只匹配少量行)。
  4. 注意 NULL 陷阱:NOT IN 子查詢含 NULL 會返回空集,改用 NOT EXISTS。

核心心法:多表查詢本質是「集合運算」。先在關系表按條件縮小集合,再回主表取屬性,配合索引覆蓋,就是最高效的執行路徑。

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