Joins (INNER, LEFT, RIGHT, FULL OUTER) และ CTE (WITH)

Sharing is caring!

เมื่อทำงานกับฐานข้อมูลเชิงสัมพันธ์ (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

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *