สถานการณ์: 2 ตาราง เชื่อมด้วย Foreign Key
- demo77: User Table (userid PK, username)
- demo78: Country Table (id PK, FK → demo77.userid)
สร้างตารางพร้อม FK
CREATE TABLE demo77 (
userid INT NOT NULL PRIMARY KEY,
username VARCHAR(20)
);
CREATE TABLE demo78 (
id INT NOT NULL PRIMARY KEY,
countryname VARCHAR(20),
CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES demo77(userid)
);
ข้อมูล
demo77:
+--------+----------+ | userid | username | +--------+----------+ | 1 | John | | 2 | Bob | | 3 | Mike | +--------+----------+
demo78:
+----+-------------+ | id | countryname | +----+-------------+ | 1 | US | | 2 | AUS | +----+-------------+
คำสั่ง JOIN: ดึง Username
SELECT username FROM demo77 JOIN demo78 ON demo77.userid = demo78.id;
ผลลัพธ์
+----------+ | username | +----------+ | John | | Bob | +----------+
Mike (id=3) ไม่ออกมา เพราะไม่มีใน demo78 (INNER JOIN)
ประเภท JOIN และผลลัพธ์
| JOIN Type | SQL | ผลลัพธ์ |
|---|---|---|
| INNER JOIN | JOIN ... ON | John, Bob (Match ทั้งคู่) |
| LEFT JOIN | LEFT JOIN ... ON | John, Bob, Mike (User ทั้งหมด + Country ถ้ามี) |
| RIGHT JOIN | RIGHT JOIN ... ON | John, Bob (Country ทั้งหมด + User ถ้ามี) |
LEFT JOIN: แสดง User ทั้งหมด
SELECT u.username, c.countryname FROM demo77 u LEFT JOIN demo78 c ON u.userid = c.id;
+----------+-------------+ | username | countryname | +----------+-------------+ | John | US | | Bob | AUS | | Mike | NULL | +----------+-------------+
Best Practices
- ใช้ Table Aliases (u, c) อ่านง่าย
- ระบุคอลัมน์ชัดเจน:
SELECT u.username, c.countryname - Index บน FK Column (demo78.id) — PK มี Index อยู่แล้ว
- ใช้
INNER JOINคำสั่งเต็ม แทนJOINเพื่อความชัดเจน
Foreign Key Constraints
CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES demo77(userid)
ON DELETE CASCADE -- ลบ User → ลบ Country Record
ON UPDATE CASCADE; -- Update User ID → Update Country ID
ตรวจสอบ FK ที่มีอยู่
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = 'demo78';