首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 入門實戰:LEFT JOIN、RIGHT JOIN、INNER JOIN 圖解與範例

     編輯:MySQL 資料庫相關知識

建立測試資料

CREATE TABLE emp (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(10)
);

CREATE TABLE emp_dept (
    dept_id VARCHAR(4) NOT NULL,
    emp_id INT NOT NULL,
    emp_name VARCHAR(10),
    PRIMARY KEY (dept_id, emp_id)
);

INSERT INTO emp VALUES
(1,'Dennis-1'),(2,'Dennis-2'),(3,'Dennis-3'),(4,'Dennis-4'),(5,'Dennis-5'),
(6,'Dennis-6'),(7,'Dennis-7'),(8,'Dennis-8'),(9,'Dennis-9'),(10,'Dennis-10');

INSERT INTO emp_dept VALUES
('R&D',1,'Dennis-1'),('Dev',2,'Dennis-2'),('R&D',3,'Dennis-3'),
('Test',4,'Dennis-4'),('Test',5,'Dennis-5');

LEFT JOIN:以左表為基準

SELECT a.id, a.name, b.dept_id
FROM emp a LEFT JOIN emp_dept b ON (a.id = b.emp_id);

結果: 10 筆資料,emp 中 6-10 號員工無部門資料顯示 NULL。

應用: 查詢 emp 有但 emp_dept 沒有的員工:

SELECT a.id, a.name, b.dept_id
FROM emp a LEFT JOIN emp_dept b ON (a.id = b.emp_id)
WHERE b.dept_id IS NULL;

RIGHT JOIN:以右表為基準

SELECT a.id, a.name, b.dept_id
FROM emp a RIGHT JOIN emp_dept b ON (a.id = b.emp_id);

結果: 僅 5 筆,以 emp_dept 為基準,emp 中多出的 6-10 號不顯示。

交換表位置:FROM emp_dept b RIGHT JOIN emp a 結果與 LEFT JOIN 相同。

INNER JOIN(或舊式 WHERE 連接)

SELECT a.id, a.name, b.dept_id
FROM emp a, emp_dept b
WHERE a.id = b.emp_id;

結果: 僅 5 筆雙方都有資料的記錄,等同於 INNER JOIN。

總結對比

Join 類型基準表結果筆數適用場景
LEFT JOIN左表左表全筆主表完整保留,輔表可能無資料
RIGHT JOIN右表右表全筆同上,習慣用 LEFT JOIN 統一
INNER JOIN雙方匹配交集只需雙方都存在的資料

實務上建議統一使用 LEFT JOIN,以「主表在左」原則編寫,提升可讀性。

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