การใช้งาน JOIN ใน SQL เป็นวิธีการเชื่อมต่อข้อมูลจากหลาย ๆ ตารางเข้าด้วยกัน โดยอิงจากคอลัมน์ที่สัมพันธ์กันระหว่างตารางต่าง ๆ ซึ่งช่วยให้เราสามารถดึงข้อมูลที่เกี่ยวข้องจากหลายแหล่งมาประมวลผลพร้อมกันได้
รูปแบบ JOIN หลัก ๆ ที่ใช้ใน SQL มีดังนี้
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- CROSS JOIN
- SELF JOIN
ตารางฐานข้อมูลตัวอย่าง
เราจะใช้สองตารางต่อไปนี้เป็นตัวอย่าง
สร้างตาราง Customers
CREATE TABLE Customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100)
);แทรกข้อมูลลงในตาราง Customers
INSERT INTO Customers (customer_id, customer_name)
VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'Diana');
สร้างตาราง Orders
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
product_name VARCHAR(100),
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);แทรกข้อมูลลงในตาราง Orders
INSERT INTO Orders (order_id, customer_id, product_name)
VALUES
(101, 1, 'Laptop'),
(102, 2, 'Phone'),
(103, 1, 'Tablet'),
(104, 4, 'Monitor');
การใช้งาน INNER JOIN
INNER JOIN จะดึงข้อมูลที่มีการจับคู่กันในทั้งสองตารางตามเงื่อนไขที่กำหนด เช่น customer_id ใน Customers และ Orders ตรงกัน ข้อมูลที่ไม่ตรงกันจะถูกละทิ้ง
ตัวอย่าง
SELECT Customers.customer_name, Orders.product_name
FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id;ในตัวอย่างนี้เราดึงชื่อของลูกค้าจาก Customers และชื่อสินค้าในออเดอร์จาก Orders โดยข้อมูลที่แสดงจะเป็นเฉพาะลูกค้าที่มีออเดอร์เท่านั้น
ผลลัพธ์

การใช้งาน LEFT JOIN
LEFT JOIN จะดึงข้อมูลทั้งหมดจากตารางซ้าย (ในที่นี้คือ Customers) แม้ว่าจะไม่มีการจับคู่กับข้อมูลในตารางขวา (ในที่นี้คือ Orders) ข้อมูลในตารางขวาที่ไม่สามารถจับคู่ได้จะถูกเติมค่า NULL
ตัวอย่าง
SELECT Customers.customer_name, Orders.product_name
FROM Customers
LEFT JOIN Orders
ON Customers.customer_id = Orders.customer_id;ในตัวอย่างนี้ LEFT JOIN จะแสดงข้อมูลจาก Customers ทั้งหมด แม้ว่าบางคนจะไม่มีการสั่งสินค้า เช่น Charlie ที่ไม่มีรายการใน Orders จะถูกเติมด้วยค่า NULL สำหรับคอลัมน์ product_name
ผลลัพธ์

การใช้งาน RIGHT JOIN
RIGHT JOIN คล้ายกับ LEFT JOIN แต่จะดึงข้อมูลทั้งหมดจากตารางขวา (ในที่นี้คือ Orders) และเติมค่า NULL สำหรับข้อมูลในตารางซ้ายที่ไม่มีการจับคู่
ตัวอย่าง
SELECT Customers.customer_name, Orders.product_name
FROM Customers
RIGHT JOIN Orders
ON Customers.customer_id = Orders.customer_id;ในตัวอย่างนี้ RIGHT JOIN จะแสดงข้อมูลจาก Orders ทั้งหมด แม้ว่าบางรายการจะไม่มีลูกค้าที่จับคู่จาก Customers ในที่นี้ทุก order_id มีการจับคู่กับ customer_id ที่ตรงกัน ทำให้ไม่มีค่า NULL
ผลลัพธ์

การใช้งาน FULL OUTER JOIN
FULL OUTER JOIN จะดึงข้อมูลจากทั้งสองตาราง หากมีการจับคู่ข้อมูล ข้อมูลนั้นจะถูกแสดง หากไม่มีการจับคู่ ข้อมูลจะถูกเติมด้วยค่า NULL
ตัวอย่าง
SELECT Customers.customer_name, Orders.product_name
FROM Customers
FULL OUTER JOIN Orders
ON Customers.customer_id = Orders.customer_id;ในตัวอย่างนี้ ข้อมูลจากทั้งสองตารางจะแสดงทั้งหมด หากมีการจับคู่ข้อมูล จะแสดงทั้งคู่ หากไม่มีก็จะเติม NULL อย่างเช่น Charlie ที่ไม่มีการสั่งสินค้า จะถูกเติมด้วย NULL ในคอลัมน์สินค้า
ผลลัพธ์ (รันบน MS SQL Server)

หมายเหตุ: MySQL หรือ MariaDB ไม่รองรับ FULL OUTER JOIN โดยตรง
การใช้งาน CROSS JOIN
CROSS JOIN จะสร้าง Cartesian product โดยจับคู่ข้อมูลทุกแถวจากตารางซ้ายกับทุกแถวจากตารางขวา ซึ่งจะได้ผลลัพธ์เป็นจำนวนแถวเท่ากับการคูณจำนวนแถวของสองตาราง
ตัวอย่าง
SELECT Customers.customer_name, Orders.product_name
FROM Customers
CROSS JOIN Orders;ในตัวอย่างนี้ CROSS JOIN จะจับคู่ทุกแถวของทั้งสองตารางเข้าด้วยกัน ส่งผลให้ได้ข้อมูลที่ผสมกันระหว่างลูกค้าและสินค้า
ผลลัพธ์

การใช้งาน SELF JOIN
SELF JOIN เป็นการทำ JOIN บนตารางเดียวกัน โดยใช้ตัวมันเองในการเชื่อมโยงข้อมูล เช่น การเชื่อมโยงข้อมูลพนักงานและหัวหน้าพนักงานในตารางเดียวกัน
ตัวอย่าง
สมมติว่ามีตาราง Employees ที่แสดงถึงพนักงานและหัวหน้า ดังนี้
-- สร้างตาราง Employees
CREATE TABLE Employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(50),
manager_id INT
);
-- แทรกข้อมูลลงในตาราง Employees
INSERT INTO Employees (employee_id, employee_name, manager_id) VALUES
(1, 'John', NULL),
(2, 'Sarah', 1),
(3, 'Mike', 1),
(4, 'Anna', 2);ตาราง Employees

เขียนโค้ด SQL ดังนี้
SELECT e1.employee_name AS Employee, e2.employee_name AS Manager
FROM Employees e1
LEFT JOIN Employees e2
ON e1.manager_id = e2.employee_id;ในตัวอย่างนี้ ตารางเดียวกันถูกใช้สองครั้ง (ตัวแรก e1 และตัวที่สอง e2) เพื่อดึงข้อมูลพนักงานและหัวหน้าพนักงาน โดยเชื่อมโยงผ่าน manager_id
ผลลัพธ์

