FULL OUTER JOIN คืออะไร?
ในบทก่อนหน้า เราได้เรียนรู้เกี่ยวกับ INNER JOIN, LEFT JOIN และ RIGHT JOIN ซึ่งเป็นวิธีการรวมข้อมูลจากสองตารางโดยมีเงื่อนไขบางอย่าง บทความนี้จะพาคุณไปรู้จักกับ FULL OUTER JOIN ซึ่งเป็นการรวมข้อมูลจากทั้งสองตารางโดยไม่ทิ้งข้อมูลใดๆ เลย ไม่ว่าจะมีข้อมูลที่ตรงกันหรือไม่ก็ตาม
FULL OUTER JOIN คืออะไร?
FULL OUTER JOIN (หรือบางครั้งเรียกว่า FULL JOIN) เป็นการรวมข้อมูลจากสองตาราง โดยจะเลือกข้อมูลทั้งหมดจากทั้งสองตาราง ไม่ว่าจะมีข้อมูลที่ตรงกันหรือไม่ก็ตาม หากมีข้อมูลที่ตรงกัน ข้อมูลจากทั้งสองตารางจะถูกนำมารวมกัน หากไม่มีข้อมูลที่ตรงกัน ข้อมูลจากตารางหนึ่งจะถูกนำมาแสดง และคอลัมน์จากอีกตารางที่ไม่มีข้อมูลที่ตรงกันจะแสดงผลเป็น NULL
ข้อจำกัดใน MySQL: น่าเสียดายที่ MySQL ไม่รองรับ FULL OUTER JOIN โดยตรง แต่เราสามารถจำลองการทำงานของ FULL OUTER JOIN ได้โดยใช้ UNION ALL ร่วมกับ LEFT JOIN และ RIGHT JOIN ซึ่งจะอธิบายในรายละเอียดต่อไป
การจำลอง FULL OUTER JOIN ใน MySQL
เนื่องจาก MySQL ไม่รองรับ FULL OUTER JOIN โดยตรง เราจึงต้องใช้เทคนิคการรวม LEFT JOIN, RIGHT JOIN และ UNION ALL เพื่อให้ได้ผลลัพธ์ที่เทียบเท่า
หลักการทำงาน:
- ใช้
LEFT JOINเพื่อเลือกข้อมูลทั้งหมดจากตารางทางซ้าย และข้อมูลที่ตรงกันจากตารางทางขวา - ใช้
RIGHT JOINเพื่อเลือกข้อมูลทั้งหมดจากตารางทางขวา และข้อมูลที่ตรงกันจากตารางทางซ้าย - ใช้
UNION ALLเพื่อรวมผลลัพธ์จากLEFT JOINและRIGHT JOINเข้าด้วยกัน
ตัวอย่าง:
สมมติว่าเรามีสองตารางคือ customers และ orders
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(255)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE
);
INSERT INTO customers (customer_id, customer_name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'David');
INSERT INTO orders (order_id, customer_id, order_date) VALUES
(101, 1, '2023-01-15'),
(102, 2, '2023-02-20'),
(103, 1, '2023-03-10'),
(104, 5, '2023-04-05');
ตาราง customers เก็บข้อมูลลูกค้า และตาราง orders เก็บข้อมูลการสั่งซื้อ
หากเราต้องการรวมข้อมูลจากทั้งสองตาราง โดยแสดงข้อมูลลูกค้าทุกคน และข้อมูลการสั่งซื้อทั้งหมด (ไม่ว่าลูกค้าจะมีคำสั่งซื้อหรือไม่ และไม่ว่าคำสั่งซื้อจะมีลูกค้าที่ตรงกันหรือไม่) เราสามารถใช้คำสั่งต่อไปนี้:
SELECT
c.customer_id,
c.customer_name,
o.order_id,
o.order_date
FROM
customers c
LEFT JOIN
orders o ON c.customer_id = o.customer_id
UNION ALL
SELECT
c.customer_id,
c.customer_name,
o.order_id,
o.order_date
FROM
customers c
RIGHT JOIN
orders o ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL;
คำอธิบาย:
- ส่วนแรกของคำสั่ง (
LEFT JOIN) เลือกข้อมูลทั้งหมดจากตารางcustomersและข้อมูลที่ตรงกันจากตารางorders - ส่วนที่สองของคำสั่ง (
RIGHT JOIN) เลือกข้อมูลทั้งหมดจากตารางordersและข้อมูลที่ตรงกันจากตารางcustomersโดยมีWHERE c.customer_id IS NULLเพื่อกรองเอาเฉพาะรายการในordersที่ไม่มีcustomer_idในcustomers(ป้องกันการ duplicate กับผลลัพธ์จากLEFT JOIN) UNION ALLรวมผลลัพธ์จากทั้งสองส่วนเข้าด้วยกัน
ผลลัพธ์:
+-------------+---------------+----------+------------+
| customer_id | customer_name | order_id | order_date |
+-------------+---------------+----------+------------+
| 1 | Alice | 101 | 2023-01-15 |
| 1 | Alice | 103 | 2023-03-10 |
| 2 | Bob | 102 | 2023-02-20 |
| 3 | Charlie | NULL | NULL |
| 4 | David | NULL | NULL |
| NULL | NULL | 104 | 2023-04-05 |
+-------------+---------------+----------+------------+
จากผลลัพธ์ เราจะเห็นว่า:
- ลูกค้า Alice มีสองคำสั่งซื้อ (101 และ 103)
- ลูกค้า Bob มีหนึ่งคำสั่งซื้อ (102)
- ลูกค้า Charlie และ David ไม่มีคำสั่งซื้อ (
order_idและorder_dateเป็นNULL) - คำสั่งซื้อ 104 ไม่มีลูกค้าที่ตรงกัน (
customer_idและcustomer_nameเป็นNULL)
เหตุผลเชิงออกแบบและการ Trade-offs
การใช้ FULL OUTER JOIN (หรือการจำลองใน MySQL) มีประโยชน์เมื่อเราต้องการแสดงข้อมูลทั้งหมดจากทั้งสองตาราง โดยไม่สนใจว่าจะมีข้อมูลที่ตรงกันหรือไม่ ตัวอย่างเช่น ในสถานการณ์ข้างต้น เราต้องการแสดงข้อมูลลูกค้าทุกคน แม้ว่าบางคนจะไม่มีคำสั่งซื้อ และเราต้องการแสดงข้อมูลการสั่งซื้อทั้งหมด แม้ว่าบางคำสั่งซื้อจะไม่มีลูกค้าที่ตรงกัน
Trade-offs: การใช้ FULL OUTER JOIN อาจทำให้ query ซับซ้อนขึ้น โดยเฉพาะอย่างยิ่งเมื่อต้องจำลองใน MySQL นอกจากนี้ ผลลัพธ์อาจมี NULL ในหลายคอลัมน์ ซึ่งอาจต้องมีการจัดการเพิ่มเติมใน application layer
แนวปฏิบัติที่ดี
- ทำความเข้าใจความต้องการ: ก่อนที่จะใช้
FULL OUTER JOINให้แน่ใจว่าคุณเข้าใจความต้องการของ application อย่างชัดเจน และพิจารณาว่าFULL OUTER JOINเป็นวิธีที่ดีที่สุดในการแก้ปัญหาหรือไม่ - ใช้ alias: ใช้ alias สำหรับชื่อตารางและคอลัมน์เพื่อให้ query อ่านง่ายขึ้น
- จัดการ NULL: เตรียมพร้อมที่จะจัดการกับ
NULLในผลลัพธ์ อาจต้องใช้ฟังก์ชันเช่นCOALESCEเพื่อแทนที่NULLด้วยค่าอื่น - ทดสอบอย่างละเอียด: ทดสอบ query อย่างละเอียดเพื่อให้แน่ใจว่าได้ผลลัพธ์ที่ถูกต้อง
สรุป
FULL OUTER JOIN เป็นเครื่องมือที่มีประโยชน์ในการรวมข้อมูลจากสองตาราง โดยไม่ทิ้งข้อมูลใดๆ แม้ว่า MySQL จะไม่รองรับ FULL OUTER JOIN โดยตรง แต่เราสามารถจำลองการทำงานได้โดยใช้ UNION ALL ร่วมกับ LEFT JOIN และ RIGHT JOIN การทำความเข้าใจหลักการทำงานและข้อควรระวังในการใช้งาน จะช่วยให้คุณสามารถใช้ FULL OUTER JOIN ได้อย่างมีประสิทธิภาพ
ในบทถัดไป เราจะไปเรียนรู้เกี่ยวกับ Subquery ซึ่งเป็น query ที่ซ้อนอยู่ภายใน query อื่น