LEFT JOIN คืออะไร?
ในบทเรียนที่แล้ว เราได้เรียนรู้เกี่ยวกับ INNER JOIN ซึ่งเป็นการรวมข้อมูลจากสองตารางโดยเลือกเฉพาะแถวที่มีค่าตรงกันในทั้งสองตารางเท่านั้น แต่ถ้าเราต้องการข้อมูลจากตารางหนึ่งทั้งหมด ไม่ว่าจะมีค่าตรงกันในอีกตารางหรือไม่ เราจะทำอย่างไร? คำตอบคือการใช้ LEFT JOIN ครับ
LEFT JOIN (หรือบางครั้งเรียกว่า LEFT OUTER JOIN) เป็นการรวมข้อมูลจากสองตาราง โดยจะเลือกข้อมูลจาก ตารางซ้าย ทั้งหมด และเลือกข้อมูลจาก ตารางขวา เฉพาะแถวที่มีค่าตรงกันกับตารางซ้ายเท่านั้น ถ้าไม่มีค่าตรงกันในตารางขวา แถวในตารางขวาที่ถูกเลือกมาจะแสดงเป็น NULL
หลักการทำงานของ LEFT JOIN
ลองจินตนาการว่าเรามีสองตาราง:
- ตารางซ้าย (Left Table):
customers(ข้อมูลลูกค้า) - ตารางขวา (Right Table):
orders(ข้อมูลการสั่งซื้อ)
เราต้องการทราบว่าลูกค้าแต่ละคนมีการสั่งซื้ออะไรบ้าง และแสดงรายชื่อลูกค้าทั้งหมด ไม่ว่าจะมีรายการสั่งซื้อหรือไม่ก็ตาม LEFT JOIN จะช่วยเราได้ดังนี้:
- เลือกข้อมูลทั้งหมดจากตาราง
customers - สำหรับแต่ละแถวใน
customers, ค้นหาแถวที่ตรงกันในตารางordersโดยใช้เงื่อนไขที่กำหนด (เช่นcustomer_id) - ถ้ามีแถวที่ตรงกันใน
orders, ให้รวมข้อมูลจากทั้งสองตารางเข้าด้วยกัน - ถ้าไม่มีแถวที่ตรงกันใน
orders, ให้รวมข้อมูลจากcustomersเข้ากับNULLสำหรับทุกคอลัมน์ของorders
โครงสร้างของ LEFT JOIN
รูปแบบการใช้งาน LEFT JOIN เป็นดังนี้:
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
table1คือตารางซ้าย (Left Table)table2คือตารางขวา (Right Table)ON table1.column_name = table2.column_nameคือเงื่อนไขในการรวมตาราง โดยปกติจะเป็นคอลัมน์ที่ใช้เชื่อมโยงข้อมูลระหว่างสองตาราง (เช่น Foreign Key)
ตัวอย่างการใช้งาน LEFT 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'),
(4, 'David');
-- ตาราง 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-01-15'),
(102, 2, '2023-02-20'),
(103, 1, '2023-03-10');
ถ้าเราต้องการแสดงรายชื่อลูกค้าทั้งหมด พร้อมกับรายการสั่งซื้อของพวกเขา (ถ้ามี) เราสามารถใช้ LEFT JOIN ได้ดังนี้:
SELECT
customers.customer_id,
customers.customer_name,
orders.order_id,
orders.order_date
FROM
customers
LEFT JOIN
orders ON customers.customer_id = orders.customer_id;
ผลลัพธ์ที่ได้จะเป็นดังนี้:
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
จากผลลัพธ์ จะเห็นว่า:
- ลูกค้า Alice มี 2 รายการสั่งซื้อ
- ลูกค้า Bob มี 1 รายการสั่งซื้อ
- ลูกค้า Charlie และ David ไม่มีรายการสั่งซื้อ ทำให้
order_idและorder_dateเป็นNULL
กรณีใช้งานจริงของ LEFT JOIN
LEFT JOIN มีประโยชน์ในหลายสถานการณ์ เช่น:
- รายงาน: สร้างรายงานที่แสดงข้อมูลทั้งหมดจากตารางหลัก แม้ว่าข้อมูลในตารางรองจะไม่สมบูรณ์
- การตรวจสอบความถูกต้องของข้อมูล: ตรวจสอบว่าข้อมูลในตารางหนึ่งมีความสัมพันธ์กับข้อมูลในอีกตารางหนึ่งอย่างถูกต้องหรือไม่
- การวิเคราะห์ข้อมูล: วิเคราะห์ข้อมูลโดยรวมข้อมูลจากหลายตารางเข้าด้วยกัน เพื่อให้ได้มุมมองที่ครอบคลุมมากขึ้น
ตัวอย่างเพิ่มเติม: สมมติว่าเรามีตาราง products และ categories และเราต้องการแสดงรายชื่อสินค้าทั้งหมด พร้อมกับชื่อหมวดหมู่ของสินค้า (ถ้ามี) เราสามารถใช้ LEFT JOIN ได้
ข้อผิดพลาดที่พบบ่อยในการใช้ LEFT JOIN
ข้อผิดพลาดที่พบบ่อยในการใช้ LEFT JOIN ได้แก่:
- ลืมระบุเงื่อนไข
ON: การลืมระบุเงื่อนไขONจะทำให้เกิดCartesian Productซึ่งเป็นการรวมทุกแถวจากตารางซ้ายเข้ากับทุกแถวจากตารางขวา ทำให้ผลลัพธ์มีขนาดใหญ่เกินไปและไม่ถูกต้อง - ใช้เงื่อนไข
WHEREที่ผิดพลาด: การใช้เงื่อนไขWHEREที่อ้างอิงถึงคอลัมน์จากตารางขวา อาจทำให้แถวที่ไม่มีข้อมูลในตารางขวาถูกกรองออกไป ทำให้LEFT JOINทำงานเหมือนINNER JOIN - ความสับสนระหว่าง LEFT JOIN, RIGHT JOIN และ INNER JOIN: การเลือกใช้
JOINที่ไม่ถูกต้อง อาจทำให้ผลลัพธ์ที่ได้ไม่ตรงกับความต้องการ
ตัวอย่างข้อผิดพลาด:
-- ตัวอย่างที่ผิด: ใช้ WHERE clause ที่ทำให้ LEFT JOIN ทำงานเหมือน INNER JOIN
SELECT
customers.customer_id,
customers.customer_name,
orders.order_id
FROM
customers
LEFT JOIN
orders ON customers.customer_id = orders.customer_id
WHERE
orders.order_id IS NOT NULL; -- ผิด!
ในตัวอย่างนี้, WHERE orders.order_id IS NOT NULL จะกรองเฉพาะลูกค้าที่มีรายการสั่งซื้อเท่านั้น ทำให้ LEFT JOIN ทำงานเหมือน INNER JOIN
สรุป
LEFT JOIN เป็นเครื่องมือที่มีประโยชน์ในการรวมข้อมูลจากสองตาราง โดยรักษาข้อมูลทั้งหมดจากตารางซ้ายไว้ การเข้าใจหลักการทำงานและข้อควรระวังในการใช้งาน LEFT JOIN จะช่วยให้คุณสามารถเขียน queries ที่มีประสิทธิภาพและได้ผลลัพธ์ที่ถูกต้อง
ในบทเรียนถัดไป เราจะเรียนรู้เกี่ยวกับ RIGHT JOIN ซึ่งเป็นการรวมข้อมูลในลักษณะที่คล้ายคลึงกัน แต่จะรักษาข้อมูลทั้งหมดจากตารางขวาไว้แทน