จากบทเรียนการ ใช้คำสั่ง SELECT ในภาษา SQL พร้อมตัวอย่างใช้งานจริง (MySQL)
เมื่อระบบฐานข้อมูลมีข้อมูลจำนวนมาก เราไม่นิยมเก็บข้อมูลทั้งหมดไว้ในตารางเดียว แต่จะแยกข้อมูลออกเป็นหลายตารางเพื่อลดความซ้ำซ้อน เช่น
เมื่อจำเป็นต้องแสดงข้อมูลร่วมกัน เช่น
"ลูกค้าคนใดซื้อสินค้าอะไร"
จึงต้องใช้คำสั่ง JOIN เพื่อเชื่อมโยงข้อมูลจากหลายตารางเข้าด้วยกัน กล่าวง่าย ๆ คือ:
JOIN คือการนำข้อมูลจากหลายตารางที่มีความสัมพันธ์กันมาแสดงเป็นผลลัพธ์เดียว
| customer_id | customer_name | province |
|---|---|---|
| 1 | สมชาย | ลำปาง |
| 2 | สมหญิง | เชียงใหม่ |
| 3 | อนันต์ | กรุงเทพฯ |
| 4 | ศิริพร | เชียงราย |
| product_id | product_name | price |
|---|---|---|
| 101 | Notebook Acer | 18900 |
| 102 | iPhone 17 | 42900 |
| 103 | Logitech Mouse | 350 |
| 104 | Gaming Monitor | 7990 |
| order_id | customer_id | product_id | quantity |
|---|---|---|---|
| 1 | 1 | 101 | 1 |
| 2 | 1 | 103 | 2 |
| 3 | 2 | 102 | 1 |
| 4 | 3 | 104 | 2 |
จะเห็นว่า orders เก็บเพียงรหัสลูกค้าและรหัสสินค้าเท่านั้น หากต้องการทราบว่า "สมชายซื้ออะไร" เราจึงจำเป็นต้องใช้ JOIN
INNER JOIN จะแสดงเฉพาะข้อมูลที่จับคู่กันได้ตรงกันทั้งสองตารางเท่านั้น
SELECT columns
FROM table1
INNER JOIN table2
ON table1.id = table2.id;SELECT customers.customer_name, orders.quantity
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;| ลูกค้า | จำนวน |
|---|---|
| สมชาย | 1 |
| สมชาย | 2 |
| สมหญิง | 1 |
| อนันต์ | 2 |
เป็นรูปแบบที่นำไปใช้งานจริงมากที่สุด เพื่อดึงข้อมูลที่เชื่อมโยงกันแบบสมบูรณ์
SELECT customers.customer_name, products.product_name, orders.quantity
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id
INNER JOIN products ON orders.product_id = products.product_id;| ลูกค้า | สินค้า | จำนวน |
|---|---|---|
| สมชาย | Notebook Acer | 1 |
| สมชาย | Logitech Mouse | 2 |
| สมหญิง | iPhone 17 | 1 |
| อนันต์ | Gaming Monitor | 2 |
ตั้งชื่อย่อให้ตารางเพื่อให้เขียนคำสั่งสั้นลงและอ่านง่ายขึ้น โดยเฉพาะเมื่อต้อง JOIN หลายตาราง
SELECT c.customer_name, p.product_name, o.quantity
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
INNER JOIN products p ON o.product_id = p.product_id;จะแสดงข้อมูลทุกแถวของตารางด้านซ้าย (ตารางตั้งหลัก) แม้ว่าตารางด้านขวาจะไม่มีข้อมูลที่ตรงกันเลยก็ตาม (จะแสดงเป็นค่า NULL)
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;| ลูกค้า | Order |
|---|---|
| สมชาย | 1 |
| สมชาย | 2 |
| สมหญิง | 3 |
| อนันต์ | 4 |
| ศิริพร | NULL |
ข้อสังเกต: ศิริพรยังไม่เคยมีประวัติสั่งซื้อสินค้าเลย แต่ก็ยังแสดงรายชื่อออกมา โดยฝั่ง Order จะเป็น NULL
จะแสดงข้อมูลทุกแถวของตารางด้านขวาเป็นหลัก แม้ไม่มีข้อมูลฝั่งซ้ายมาจับคู่ก็ตาม
SELECT customers.customer_name, orders.order_id
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;SELECT c.customer_name, p.product_name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
INNER JOIN products p ON o.product_id = p.product_id
WHERE c.province = 'ลำปาง';SELECT c.customer_name, p.product_name, p.price
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
INNER JOIN products p ON o.product_id = p.product_id
ORDER BY p.price DESC;SELECT c.customer_name, SUM(o.quantity) AS total
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
GROUP BY c.customer_name;| ลูกค้า | จำนวนที่ซื้อ |
|---|---|
| สมชาย | 3 |
| สมหญิง | 1 |
| อนันต์ | 2 |
| ประเภท JOIN | ความหมายและการทำงาน |
|---|---|
| INNER JOIN | แสดงเฉพาะข้อมูลที่มี Key ตรงกันและจับคู่กันได้ทั้งสองตารางเท่านั้น |
| LEFT JOIN | แสดงข้อมูลทุกแถวของตารางซ้าย (หลัก) แม้ว่าตารางขวาจะไม่มีข้อมูลตรงกัน (พ่น NULL) |
| RIGHT JOIN | แสดงข้อมูลทุกแถวของตารางขวา (หลัก) แม้ว่าตารางซ้ายจะไม่มีข้อมูลตรงกัน |