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 มีหลายขั้นตอนหรืออยากอ่านง่าย
แบบฝึกหัด
- ใช้ subquery หา order ที่ยอดสูงกว่าค่าเฉลี่ย
- ใช้ CTE สรุปยอดขายรวมแยกตามลูกค้า
- Join CTE กับ
customersเพื่อแสดงชื่อลูกค้า - เพิ่มเงื่อนไขแสดงเฉพาะลูกค้าที่มียอดรวมมากกว่า 5000