LEFT JOIN (หรือ LEFT OUTER JOIN) คืนค่า ทุกแถวจากตารางซ้าย (left table) และข้อมูลที่ตรงจากตารางขวา (right table) หากไม่ตรงจะเป็น NULL
รูปแบบคำสั่ง
SELECT left_table.col1, left_table.col2, right_table.col3
FROM left_table
LEFT JOIN right_table
ON left_table.join_column = right_table.join_column;
ตัวอย่างสมบูรณ์: พร้อม Foreign Key Constraint
1. สร้างตารางแม่ (Parent Table)
CREATE TABLE ParentTable (
UniqueId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
EmployeeName VARCHAR(10)
);
INSERT INTO ParentTable (EmployeeName) VALUES
('John'), ('Carol'), ('Sam'), ('Bob');
ข้อมูล ParentTable:
+----------+--------------+
| UniqueId | EmployeeName |
+----------+--------------+
| 1 | John |
| 2 | Carol |
| 3 | Sam |
| 4 | Bob |
+----------+--------------+
2. สร้างตารางลูก (Child Table) พร้อม Foreign Key
CREATE TABLE ChildTable (
UniqueId INT NOT NULL PRIMARY KEY,
EmployeeAddress VARCHAR(100),
CONSTRAINT fk_uniqueId FOREIGN KEY (UniqueId) REFERENCES ParentTable(UniqueId)
);
3. เพิ่มข้อมูลในตารางลูก (บางแถวไม่มีที่อยู่)
INSERT INTO ChildTable VALUES
(1, '15 West Shady Lane Starkville, MS 39759'),
(2, '72 West Rock Creek St. Oxford, MS 38655'),
(3, NULL), -- ไม่มีที่อยู่
(4, '119 North Sierra St. Marysville, OH 43040');
ข้อมูล ChildTable:
+----------+-------------------------------------------+
| UniqueId | EmployeeAddress |
+----------+-------------------------------------------+
| 1 | 15 West Shady Lane Starkville, MS 39759 |
| 2 | 72 West Rock Creek St. Oxford, MS 38655 |
| 3 | NULL |
| 4 | 119 North Sierra St. Marysville, OH 43040 |
+----------+-------------------------------------------+
4. LEFT JOIN ทั้งสองตาราง
SELECT
p.UniqueId,
p.EmployeeName,
c.EmployeeAddress
FROM ParentTable p
LEFT JOIN ChildTable c ON p.UniqueId = c.UniqueId;
ผลลัพธ์:
+----------+--------------+-------------------------------------------+
| UniqueId | EmployeeName | EmployeeAddress |
+----------+--------------+-------------------------------------------+
| 1 | John | 15 West Shady Lane Starkville, MS 39759 |
| 2 | Carol | 72 West Rock Creek St. Oxford, MS 38655 |
| 3 | Sam | NULL |
| 4 | Bob | 119 North Sierra St. Marysville, OH 43040 |
+----------+--------------+-------------------------------------------+
สังเกต: Sam (Id=3) ยังคงแสดง แม้ไม่มีที่อยู่ใน ChildTable (แสดง NULL)
เปรียบเทียบ JOIN ประเภทต่างๆ
| JOIN Type | คืนค่า | ใช้เมื่อ |
|---|---|---|
| INNER JOIN | เฉพาะแถวที่ตรงกันทั้งคู่ | ต้องการข้อมูลที่มีความสัมพันธ์ครบ |
| LEFT JOIN | ทุกแถวซ้าย + ขวาที่ตรง (NULL ถ้าไม่ตรง) | ต้องการข้อมูลซ้ายทั้งหมด พร้อมข้อมูลขวาที่มี |
| RIGHT JOIN | ทุกแถวขวา + ซ้ายที่ตรง (NULL ถ้าไม่ตรง) | ต้องการข้อมูลขวาทั้งหมด |
| CROSS JOIN | Cartesian product (ทุกคู่) | การจับคู่ทุกกรณี |
เคล็ดลับ
- ใช้ alias (p, c) ทำให้โค้ดสั้นและอ่านง่าย
- Foreign Key ช่วยรักษาความสมบูรณ์ข้อมูล (Integrity) แต่ไม่จำเป็นสำหรับ JOIN
- Index บนคอลัมน์ JOIN (UniqueId) จะทำให้ JOIN เร็วขึ้นมาก