RIGHT JOIN คืออะไร?
หลังจากที่เราได้เรียนรู้เรื่อง LEFT JOIN กันไปแล้ว ในบทนี้เราจะมาทำความรู้จักกับ RIGHT JOIN ซึ่งเป็นพี่น้องฝาแฝดที่ทำงานคล้ายกัน แต่มีจุดเน้นที่แตกต่างกัน
RIGHT JOIN (หรือ RIGHT OUTER JOIN) เป็นการรวมข้อมูลจากสองตาราง โดยเลือกข้อมูลทั้งหมดจากตารางทางด้านขวา (right table) และเลือกเฉพาะข้อมูลที่ตรงกันจากตารางทางด้านซ้าย (left table) เท่านั้น หากไม่มีข้อมูลที่ตรงกันในตารางซ้าย จะแสดงผลเป็น NULL สำหรับคอลัมน์จากตารางซ้ายนั้น
ความแตกต่างระหว่าง LEFT JOIN และ RIGHT JOIN
หัวใจสำคัญที่ต้องจำคือ:
LEFT JOIN: เอาข้อมูลทั้งหมดจากตารางซ้าย และข้อมูลที่ตรงกันจากตารางขวาRIGHT JOIN: เอาข้อมูลทั้งหมดจากตารางขวา และข้อมูลที่ตรงกันจากตารางซ้าย
ถ้าเรามองในแง่ของตารางที่จะถูก "รักษา" ข้อมูลไว้ทั้งหมด:
LEFT JOIN: รักษาข้อมูลทั้งหมดจากตารางซ้ายRIGHT JOIN: รักษาข้อมูลทั้งหมดจากตารางขวา
จริงๆ แล้ว RIGHT JOIN สามารถเขียนใหม่ให้เป็น LEFT JOIN ได้เสมอ โดยการสลับตำแหน่งของตาราง แต่บางครั้งการใช้ RIGHT JOIN จะทำให้โค้ดอ่านง่ายขึ้นในบางสถานการณ์
โครงสร้างของ RIGHT JOIN
รูปแบบการใช้งาน RIGHT JOIN ใน SQL มีดังนี้:
SELECT column1, column2, ...
FROM table_name_left
RIGHT JOIN table_name_right
ON table_name_left.column_name = table_name_right.column_name;
อธิบาย:
SELECT column1, column2, ...: ระบุคอลัมน์ที่ต้องการแสดงผลFROM table_name_left: ระบุตารางทางด้านซ้ายRIGHT JOIN table_name_right: ระบุว่าเป็นการRIGHT JOINกับตารางทางด้านขวาON table_name_left.column_name = table_name_right.column_name: ระบุเงื่อนไขในการรวมตาราง โดยปกติจะเป็นการเปรียบเทียบคอลัมน์ที่เชื่อมโยงกัน (Foreign Key)
ตัวอย่างการใช้งาน RIGHT JOIN
สมมติว่าเรามีสองตาราง:
customers: เก็บข้อมูลลูกค้าorders: เก็บข้อมูลการสั่งซื้อ
ตาราง 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,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
INSERT INTO orders (order_id, customer_id, order_date) VALUES
(101, 1, '2023-10-26'),
(102, 2, '2023-10-27'),
(103, 2, '2023-10-28'),
(104, 4, '2023-10-29'); -- ลูกค้า ID 4 ไม่มีในตาราง customers
สังเกตว่ามี order ที่มี customer_id = 4 ซึ่งไม่มีอยู่ในตาราง customers
เราต้องการแสดงรายการการสั่งซื้อทั้งหมด พร้อมชื่อลูกค้าที่สั่งซื้อ หากไม่มีลูกค้าที่สั่งซื้อ (เช่น customer_id = 4) ให้แสดงชื่อลูกค้าเป็น NULL เราสามารถใช้ RIGHT JOIN ได้ดังนี้:
SELECT
o.order_id,
c.customer_name,
o.order_date
FROM
customers c
RIGHT JOIN
orders o ON c.customer_id = o.customer_id;
ผลลัพธ์:
order_id | customer_name | order_date
----------|---------------|------------
101 | Alice | 2023-10-26
102 | Bob | 2023-10-27
103 | Bob | 2023-10-28
104 | NULL | 2023-10-29
จะเห็นว่า order_id = 104 แสดง customer_name เป็น NULL เนื่องจากไม่มีลูกค้าที่มี customer_id = 4 ในตาราง customers
กรณีใช้งานจริงของ RIGHT JOIN
RIGHT JOIN มักถูกใช้ในสถานการณ์ที่ต้องการแสดงข้อมูลทั้งหมดจากตาราง "หลัก" (ในที่นี้คือ orders) และข้อมูลที่เกี่ยวข้องจากตารางอื่น (customers) แม้ว่าข้อมูลที่เกี่ยวข้องนั้นอาจไม่มีอยู่จริง
ตัวอย่างเช่น:
- แสดงรายการสินค้าทั้งหมดในคลังสินค้า พร้อมจำนวนที่ถูกสั่งซื้อ (ถ้ามี)
- แสดงรายการพนักงานทั้งหมดในบริษัท พร้อมจำนวนโปรเจกต์ที่รับผิดชอบ (ถ้ามี)
- แสดงรายการประเทศทั้งหมด พร้อมจำนวนประชากร (ถ้ามีข้อมูล)
ข้อควรระวังและข้อผิดพลาดที่พบบ่อย
- สลับตารางผิด: จำไว้เสมอว่า
RIGHT JOINจะเลือกข้อมูลทั้งหมดจากตารางทางด้านขวา หากสลับตารางผิด ผลลัพธ์จะไม่เป็นไปตามที่ต้องการ - ลืมเงื่อนไข
ON: หากลืมระบุเงื่อนไขONจะทำให้เกิด Cartesian Product ซึ่งจะสร้างผลลัพธ์ที่มีจำนวนแถวมากเกินไปและไม่ถูกต้อง - เข้าใจผิดว่าเป็น
LEFT JOIN: เนื่องจากRIGHT JOINสามารถเขียนใหม่ให้เป็นLEFT JOINได้ การเลือกใช้ขึ้นอยู่กับความเหมาะสมและความเข้าใจของแต่ละคน แต่ต้องระวังไม่ให้สับสน - ประสิทธิภาพ: ในบางกรณี การใช้
RIGHT JOINอาจทำให้ Query Optimizer ทำงานได้ไม่ดีเท่าที่ควร ลองพิจารณาใช้LEFT JOINแทนโดยการสลับตาราง
สรุป
RIGHT JOIN เป็นเครื่องมือที่มีประโยชน์ในการรวมข้อมูลจากสองตาราง โดยเน้นที่การรักษาข้อมูลทั้งหมดจากตารางทางด้านขวาไว้ แม้ว่าข้อมูลที่เกี่ยวข้องจากตารางทางด้านซ้ายอาจไม่มีอยู่จริง การเข้าใจหลักการทำงานและข้อควรระวังของ RIGHT JOIN จะช่วยให้คุณสามารถเขียน Queries ที่มีประสิทธิภาพและถูกต้องมากยิ่งขึ้น
ในบทต่อไป เราจะมาเรียนรู้เรื่อง FULL OUTER JOIN ซึ่งเป็นการรวมข้อมูลจากทั้งสองตารางโดยไม่ทิ้งข้อมูลใดๆ เลย