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

JOIN ตารางใน MySQL: ดึงข้อมูลจากหลายตาราง

หลักการ JOIN

JOIN ใช้รวมข้อมูลจาก 2 ตารางขึ้นไป โดยอาศัยคอลัมน์ที่เกี่ยวข้อง (มักเป็น Primary Key - Foreign Key)

ประเภท JOIN หลัก

JOIN Typeคำอธิบาย
INNER JOINเฉพาะแถวที่มีคู่ในทั้ง 2 ตาราง (ค่าเริ่มต้นของ JOIN)
LEFT JOINทุกแถวของตารางซ้าย + ข้อมูลตารางขวาที่ match (NULL ถ้าไม่มี)
RIGHT JOINทุกแถวของตารางขวา + ข้อมูลตารางซ้ายที่ match
CROSS JOINCartesian 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 บน FKADD INDEX