การ JOIN ตารางคืออะไร?
ในบทเรียนก่อนหน้า เราได้เรียนรู้เกี่ยวกับการจัดกลุ่มข้อมูลด้วย GROUP BY และการกรองกลุ่มข้อมูลด้วย HAVING ในบทนี้ เราจะมาเรียนรู้เกี่ยวกับการ JOIN ตาราง ซึ่งเป็นวิธีการรวมข้อมูลจากหลายตารางเข้าด้วยกัน เพื่อให้เราสามารถดึงข้อมูลที่เกี่ยวข้องกันจากหลายตารางได้ในคราวเดียว
ลองนึกภาพว่าคุณมีสองตาราง:
- ตาราง
customersที่เก็บข้อมูลลูกค้า เช่น รหัสลูกค้า ชื่อ และที่อยู่ - ตาราง
ordersที่เก็บข้อมูลการสั่งซื้อ เช่น รหัสการสั่งซื้อ รหัสลูกค้า และวันที่สั่งซื้อ
ถ้าคุณต้องการทราบว่าลูกค้าคนไหนสั่งซื้ออะไรบ้าง คุณจะต้องรวมข้อมูลจากทั้งสองตารางนี้เข้าด้วยกัน นี่แหละคือสิ่งที่ JOIN เข้ามาช่วย
ทำไมต้องใช้ JOIN?
การใช้ JOIN ช่วยให้เรา:
- ลดความซ้ำซ้อนของข้อมูล: แทนที่จะเก็บข้อมูลลูกค้าทั้งหมดไว้ในตาราง
ordersเราเพียงแค่เก็บรหัสลูกค้าไว้เท่านั้น - ปรับปรุงโครงสร้างฐานข้อมูล: แยกข้อมูลออกเป็นตารางต่างๆ ทำให้ฐานข้อมูลมีความเป็นระเบียบและง่ายต่อการจัดการ
- ดึงข้อมูลที่เกี่ยวข้องกันได้อย่างมีประสิทธิภาพ: สามารถดึงข้อมูลจากหลายตารางที่เกี่ยวข้องกันได้ใน query เดียว
ประเภทของ JOIN
MySQL มี JOIN หลายประเภท แต่ในบทเรียนนี้ เราจะเน้นที่ 3 ประเภทหลักๆ คือ:
INNER JOINLEFT JOINRIGHT JOIN
เราจะมาดูรายละเอียดของแต่ละประเภทกัน
INNER JOIN
INNER JOIN จะเลือกเฉพาะแถวที่ตรงกันในทั้งสองตารางเท่านั้น หากไม่มีแถวที่ตรงกันในตารางใดตารางหนึ่ง แถวนั้นจะไม่ถูกรวมอยู่ในผลลัพธ์
ตัวอย่าง:
สมมติว่าเรามีตาราง customers:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(255)
);
INSERT INTO customers (customer_id, customer_name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');
และตาราง orders:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE
);
INSERT INTO orders (order_id, customer_id, order_date) VALUES
(101, 1, '2023-10-26'),
(102, 2, '2023-10-27'),
(103, 1, '2023-10-28'),
(104, 4, '2023-10-29');
เราสามารถใช้ INNER JOIN เพื่อดึงข้อมูลลูกค้าและคำสั่งซื้อที่ตรงกันได้ดังนี้:
SELECT
customers.customer_name,
orders.order_id,
orders.order_date
FROM
customers
INNER JOIN
orders ON customers.customer_id = orders.customer_id;
ผลลัพธ์ที่ได้คือ:
+---------------+----------+------------+
| customer_name | order_id | order_date |
+---------------+----------+------------+
| Alice | 101 | 2023-10-26 |
| Bob | 102 | 2023-10-27 |
| Alice | 103 | 2023-10-28 |
+---------------+----------+------------+
จะเห็นว่ามีเพียงลูกค้าที่มีคำสั่งซื้อเท่านั้นที่ปรากฏในผลลัพธ์ ลูกค้าที่มี customer_id เป็น 4 ไม่มีอยู่ในตาราง customers จึงไม่ปรากฏในผลลัพธ์
ข้อควรระวัง: อย่าลืมระบุเงื่อนไข ON เพื่อบอก MySQL ว่าจะรวมตารางด้วยเงื่อนไขอะไร หากลืมระบุหรือระบุผิดพลาด อาจทำให้ได้ผลลัพธ์ที่ไม่ถูกต้อง
LEFT JOIN
LEFT JOIN (หรือ LEFT OUTER JOIN) จะเลือกแถวทั้งหมดจากตารางทางซ้าย (ในตัวอย่างนี้คือตาราง customers) และแถวที่ตรงกันจากตารางทางขวา (ตาราง orders) หากไม่มีแถวที่ตรงกันในตารางทางขวา คอลัมน์จากตารางทางขวาจะเป็น NULL
ตัวอย่าง:
SELECT
customers.customer_name,
orders.order_id,
orders.order_date
FROM
customers
LEFT JOIN
orders ON customers.customer_id = orders.customer_id;
ผลลัพธ์ที่ได้คือ:
+---------------+----------+------------+
| customer_name | order_id | order_date |
+---------------+----------+------------+
| Alice | 101 | 2023-10-26 |
| Alice | 103 | 2023-10-28 |
| Bob | 102 | 2023-10-27 |
| Charlie | NULL | NULL |
+---------------+----------+------------+
จะเห็นว่าลูกค้า Charlie ปรากฏในผลลัพธ์ แม้ว่าจะไม่มีคำสั่งซื้อ เนื่องจากเราใช้ LEFT JOIN ซึ่งจะเลือกแถวทั้งหมดจากตาราง customers คอลัมน์ order_id และ order_date เป็น NULL เนื่องจากไม่มีคำสั่งซื้อที่ตรงกับ customer_id ของ Charlie
กรณีใช้งานจริง: LEFT JOIN มักใช้เมื่อต้องการแสดงข้อมูลทั้งหมดจากตารางหลัก (ตารางทางซ้าย) ไม่ว่าจะมีข้อมูลที่เกี่ยวข้องในตารางอื่นหรือไม่ก็ตาม
RIGHT JOIN
RIGHT JOIN (หรือ RIGHT OUTER JOIN) จะทำงานคล้ายกับ LEFT JOIN แต่สลับด้านกัน จะเลือกแถวทั้งหมดจากตารางทางขวา (ในตัวอย่างนี้คือตาราง orders) และแถวที่ตรงกันจากตารางทางซ้าย (ตาราง customers) หากไม่มีแถวที่ตรงกันในตารางทางซ้าย คอลัมน์จากตารางทางซ้ายจะเป็น NULL
ตัวอย่าง:
SELECT
customers.customer_name,
orders.order_id,
orders.order_date
FROM
customers
RIGHT JOIN
orders ON customers.customer_id = orders.customer_id;
ผลลัพธ์ที่ได้คือ:
+---------------+----------+------------+
| customer_name | order_id | order_date |
+---------------+----------+------------+
| Alice | 101 | 2023-10-26 |
| Bob | 102 | 2023-10-27 |
| Alice | 103 | 2023-10-28 |
| NULL | 104 | 2023-10-29 |
+---------------+----------+------------+
จะเห็นว่าคำสั่งซื้อที่มี order_id เป็น 104 ปรากฏในผลลัพธ์ แม้ว่าจะไม่มีลูกค้าที่มี customer_id เป็น 4 ในตาราง customers คอลัมน์ customer_name เป็น NULL เนื่องจากไม่มีลูกค้าที่ตรงกับ customer_id นี้
กรณีใช้งานจริง: RIGHT JOIN มักใช้เมื่อต้องการแสดงข้อมูลทั้งหมดจากตารางรอง (ตารางทางขวา) ไม่ว่าจะมีข้อมูลที่เกี่ยวข้องในตารางหลักหรือไม่ก็ตาม
ข้อสังเกต: RIGHT JOIN สามารถเขียนใหม่เป็น LEFT JOIN ได้โดยสลับลำดับของตาราง
สรุป
ในบทนี้ เราได้เรียนรู้เกี่ยวกับการ JOIN ตารางใน MySQL และประเภทของ JOIN ที่สำคัญ ได้แก่ INNER JOIN, LEFT JOIN และ RIGHT JOIN แต่ละประเภทมีลักษณะการทำงานและกรณีใช้งานที่แตกต่างกัน การเข้าใจความแตกต่างเหล่านี้จะช่วยให้คุณสามารถดึงข้อมูลจากหลายตารางได้อย่างมีประสิทธิภาพ
ในบทเรียนถัดไป เราจะเจาะลึกถึง INNER JOIN มากยิ่งขึ้น