Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: ทำ LEFT JOIN ระหว่าง 2 ตารางพร้อม Foreign Key

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 JOINCartesian product (ทุกคู่)การจับคู่ทุกกรณี

เคล็ดลับ

  • ใช้ alias (p, c) ทำให้โค้ดสั้นและอ่านง่าย
  • Foreign Key ช่วยรักษาความสมบูรณ์ข้อมูล (Integrity) แต่ไม่จำเป็นสำหรับ JOIN
  • Index บนคอลัมน์ JOIN (UniqueId) จะทำให้ JOIN เร็วขึ้นมาก