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

