หลักการ JOIN
JOIN ใช้รวมข้อมูลจาก 2 ตารางขึ้นไป โดยอาศัยคอลัมน์ที่เกี่ยวข้อง (มักเป็น Primary Key - Foreign Key)
ประเภท JOIN หลัก
| JOIN Type | คำอธิบาย |
| INNER JOIN | เฉพาะแถวที่มีคู่ในทั้ง 2 ตาราง (ค่าเริ่มต้นของ JOIN) |
| LEFT JOIN | ทุกแถวของตารางซ้าย + ข้อมูลตารางขวาที่ match (NULL ถ้าไม่มี) |
| RIGHT JOIN | ทุกแถวของตารางขวา + ข้อมูลตารางซ้ายที่ match |
| CROSS JOIN | Cartesian product (ทุกคู่แถว) |
ตัวอย่าง: 2 ตาราง demo52 (ชื่อ) และ demo53 (อายุ)
CREATE TABLE demo52 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
CREATE TABLE demo53 (
id INT NOT NULL PRIMARY KEY,
age INT NOT NULL,
CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES demo52(id)
);
INSERT INTO demo52 VALUES (1,'John'), (2,'David'), (3,'Mike');
INSERT INTO demo53 VALUES (1,23), (2,22), (3,26);
INNER JOIN: ดึงชื่อพนักงาน id=1
SELECT name FROM demo52 t1
JOIN demo53 t2 ON t1.id = t2.id
WHERE t1.id = 1;
ผลลัพธ์
+------+
| name |
+------+
| John |
+------+
ตัวอย่างเพิ่มเติม: JOIN หลายคอลัมน์
SELECT e.employee_name, d.department_name, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.salary > 50000;
LEFT JOIN: แสดงทุกพนักงาน แม้ไม่มีแผนก
SELECT e.employee_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
Best Practices
- ใช้ alias (t1, t2, e, d) ลดความยาวและอ่านง่าย
- ระบุคอลัมน์ที่ต้องการ
SELECT t1.name, t2.age ไม่ใช้ SELECT *
- สร้าง INDEX บนคอลัมน์ JOIN (FK, PK)
- ใช้
INNER JOIN แทน JOIN เพื่อความชัดเจน
- หลีกเลี่ยง JOIN หลายตารางในคำสั่งเดียว (ยากต่อการ debug และ optimize)
ปัญหาที่พบบ่อย
| ปัญหา | สาเหตุ | แก้ไข |
| Duplicate rows | ข้อมูลฝั่งขวา มีหลายแถวต่อ 1 PK | ใช้ DISTINCT หรือ GROUP BY |
| Missing rows | ใช้ INNER JOIN แทน LEFT JOIN | เปลี่ยนเป็น LEFT JOIN |
| Slow query | ไม่มี INDEX บน FK | ADD INDEX |