Logo

07 Subquery และ CTE

Subquery และ CTE

เมื่อ query เริ่มซับซ้อน เราสามารถแบ่งขั้นตอนด้วย subquery หรือ CTE เพื่อให้ SQL อ่านง่ายขึ้น

Subquery ใน WHERE

หาลูกค้าที่เคยมียอดสั่งซื้อเกินค่าเฉลี่ย

SELECT *
FROM orders
WHERE amount > (
  SELECT AVG(amount)
  FROM orders
);

Subquery ใน FROM

SELECT
  customer_id,
  total_amount
FROM (
  SELECT
    customer_id,
    SUM(amount) AS total_amount
  FROM orders
  GROUP BY customer_id
) AS customer_summary
WHERE total_amount >= 5000;

CTE คืออะไร

CTE หรือ Common Table Expression ใช้ WITH เพื่อสร้างผลลัพธ์ชั่วคราวก่อน query หลัก

WITH customer_summary AS (
  SELECT
    customer_id,
    SUM(amount) AS total_amount
  FROM orders
  GROUP BY customer_id
)
SELECT *
FROM customer_summary
WHERE total_amount >= 5000;

CTE เหมาะกับ query ที่ต้องแบ่งหลายขั้นตอน

CTE หลายตัว

WITH paid_orders AS (
  SELECT *
  FROM orders
  WHERE status = 'paid'
),
customer_summary AS (
  SELECT
    customer_id,
    SUM(amount) AS total_amount
  FROM paid_orders
  GROUP BY customer_id
)
SELECT *
FROM customer_summary
ORDER BY total_amount DESC;

ใช้ CTE ตอน JOIN

WITH customer_summary AS (
  SELECT
    customer_id,
    SUM(amount) AS total_amount
  FROM orders
  GROUP BY customer_id
)
SELECT
  c.name,
  s.total_amount
FROM customer_summary AS s
INNER JOIN customers AS c
  ON s.customer_id = c.customer_id;

เลือกใช้อะไรดี

  • ใช้ subquery เมื่อ logic สั้นและไม่ต้อง reuse
  • ใช้ CTE เมื่อ query มีหลายขั้นตอนหรืออยากอ่านง่าย

แบบฝึกหัด

  1. ใช้ subquery หา order ที่ยอดสูงกว่าค่าเฉลี่ย
  2. ใช้ CTE สรุปยอดขายรวมแยกตามลูกค้า
  3. Join CTE กับ customers เพื่อแสดงชื่อลูกค้า
  4. เพิ่มเงื่อนไขแสดงเฉพาะลูกค้าที่มียอดรวมมากกว่า 5000