首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL 兩表聯查:內連接導致數據丟失,改用左外連接保留主表所有記錄

     編輯:程式設計疑難解答

原查詢使用隱式內連接(逗號 + WHERE),導致 `teacher_region_info` 無匹配記錄時,`teacher_info` 數據也不顯示。需改為左外連接。

原錯誤查詢

SELECT ... 
FROM teacher_info, teacher_region_info 
WHERE teacher_info.teacher_id = teacher_region_info.teacher_id
-- 等價於 INNER JOIN,雙方必須有匹配

錯誤的 UNION 嘗試


SELECT ... FROM ... WHERE teacher_info.teacher_id = teacher_region_info.teacher_id
UNION
SELECT ... FROM ... WHERE teacher_info.teacher_id != NULL  -- 錯誤:!= NULL 永遠為 UNKNOWN

正確寫法:LEFT JOIN


SELECT 
  ti.teacher_id, ti.tearcher_name, ti.teacher_number, ti.tearcher_type, 
  ti.teacher_image, ti.teacher_gender, ti.teacher_birthday, ti.identity_number,
  ti.company, ti.technical_title, ti.technical_grade, ti.major_type_id,
  ti.major_id, ti.courses_offer, ti.phone, ti.email, ti.relative_material,
  ti.LEVEL, ti.country, ti.province, ti.city, ti.region,
  tri.city AS region_city  -- 明確別名避免衝突
FROM teacher_info ti
LEFT JOIN teacher_region_info tri 
  ON ti.teacher_id = tri.teacher_id;

四種連接類型對比

連接類型關鍵字結果集
內連接INNER JOIN / JOIN僅雙方匹配的行
左外連接LEFT JOIN / LEFT OUTER JOIN左表所有行 + 右表匹配行(無則 NULL)
右外連接RIGHT JOIN右表所有行 + 左表匹配行
全外連接FULL JOIN / FULL OUTER JOIN雙方所有行(無匹配填 NULL)

關鍵點

  • 使用表別名(`ti`、`tri`)簡化列引用,避免歧義。
  • `ON` 條件放連接邏輯,`WHERE` 放過濾條件,語義清晰。
  • 左表 `teacher_info` 為主表,保留所有教師信息,右表無匹配字段顯示 `NULL`。

學習建議

系統學習 SQL 連接類型(內/左/右/全),理解集合運算(交集/左差/右差/并集),是寫好查詢的基礎。

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