Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

FULL OUTER JOIN คืออะไร?

บทความนี้อธิบายถึง `FULL OUTER JOIN` ซึ่งเป็นการรวมข้อมูลจากสองตารางโดยแสดงข้อมูลทั้งหมดจากทั้งสองตาราง ไม่ว่าจะมีข้อมูลที่ตรงกันหรือไม่ก็ตาม แม้ว่า MySQL จะไม่...

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 เพื่อให้ได้ผลลัพธ์ที่เทียบเท่า

หลักการทำงาน:

  1. ใช้ LEFT JOIN เพื่อเลือกข้อมูลทั้งหมดจากตารางทางซ้าย และข้อมูลที่ตรงกันจากตารางทางขวา
  2. ใช้ RIGHT JOIN เพื่อเลือกข้อมูลทั้งหมดจากตารางทางขวา และข้อมูลที่ตรงกันจากตารางทางซ้าย
  3. ใช้ 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 อื่น

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service