เมื่อทำงานกับฐานข้อมูลเชิงสัมพันธ์ (Relational Database) หนึ่งในคำสั่งที่ใช้บ่อยคือ JOIN สำหรับการรวมข้อมูลจากหลายตาราง และ CTE (Common Table Expression) ที่ช่วยให้ Query ซับซ้อนอ่านง่ายขึ้น บทความนี้จะเจาะลึก Joins หลายประเภท (INNER, LEFT, RIGHT, FULL OUTER) และการใช้ CTE
ตารางตัวอย่าง
เราจะใช้สองตารางเป็นตัวอย่าง:
CREATE TABLE customers ( id SERIAL PRIMARY KEY, name VARCHAR(100) ); CREATE TABLE orders ( id SERIAL PRIMARY KEY, customer_id INT, product VARCHAR(100) );
ข้อมูลตัวอย่าง:
INSERT INTO customers (name) VALUES ('Alice'), ('Bob'), ('Charlie'); INSERT INTO orders (customer_id, product) VALUES (1, 'Laptop'), (2, 'Phone'), (2, 'Keyboard');
1. INNER JOIN
INNER JOIN ดึงเฉพาะข้อมูลที่มีความสัมพันธ์ตรงกันทั้งสองตาราง
SELECT c.name, o.product FROM customers c INNER JOIN orders o ON c.id = o.customer_id;
2. LEFT JOIN
LEFT JOIN ดึงข้อมูลทั้งหมดจากตารางซ้าย (customers) และดึงข้อมูลจากตารางขวา (orders) เฉพาะที่ตรงกัน ถ้าไม่ตรงจะได้ NULL
SELECT c.name, o.product FROM customers c LEFT JOIN orders o ON c.id = o.customer_id;
3. RIGHT JOIN
RIGHT JOIN ดึงข้อมูลทั้งหมดจากตารางขวา (orders) และดึงข้อมูลจากตารางซ้าย (customers) เฉพาะที่ตรงกัน
SELECT c.name, o.product FROM customers c RIGHT JOIN orders o ON c.id = o.customer_id;
4. FULL OUTER JOIN
FULL OUTER JOIN รวมข้อมูลจากทั้งสองตาราง แสดงทั้งข้อมูลที่ตรงกันและไม่ตรงกัน
SELECT c.name, o.product FROM customers c FULL OUTER JOIN orders o ON c.id = o.customer_id;
CTE (WITH)
CTE (Common Table Expression) คือ Query ชั่วคราวที่สร้างขึ้นด้วยคำสั่ง WITH
ทำให้ Query ที่ซับซ้อนอ่านง่ายขึ้น และสามารถใช้ซ้ำใน Query หลักได้
ตัวอย่าง CTE
WITH order_count AS ( SELECT customer_id, COUNT(*) as total_orders FROM orders GROUP BY customer_id ) SELECT c.name, oc.total_orders FROM customers c LEFT JOIN order_count oc ON c.id = oc.customer_id;
การใช้ CTE ซ้อนกัน (Recursive CTE)
CTE ยังสามารถใช้แบบ Recursive ได้ เช่น การ Query โครงสร้าง Tree หรือ Hierarchy
WITH RECURSIVE subordinates AS ( SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, e.manager_id FROM employees e INNER JOIN subordinates s ON e.manager_id = s.id ) SELECT * FROM subordinates;

สรุปการใช้งาน JOIN และ CTE
- INNER JOIN → ดึงข้อมูลที่ตรงกันทั้งสองตาราง
- LEFT JOIN → ดึงทั้งหมดจากตารางซ้าย
- RIGHT JOIN → ดึงทั้งหมดจากตารางขวา
- FULL OUTER JOIN → ดึงทั้งหมดจากทั้งสองตาราง
- CTE → ทำให้ Query ซับซ้อนอ่านง่ายขึ้น
SEO Keywords
SQL JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL OUTER JOIN,CTE WITH SQL,SQL Recursive,การใช้ SQL JOIN,สอน SQL JOIN,SQL CTE