HAVING เทียบกับ WHERE
แยกความแตกต่างระหว่าง HAVING (กรองกลุ่ม) กับ WHERE (กรองแถว) และใช้ทั้งสองอย่างถูกต้องในคำค้นเดียวกัน
HAVING เทียบกับ WHERE เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ขั้นตอนการกรองสองขั้น
WHERE กรองแถวแต่ละแถว BEFORE การจัดกลุ่ม ส่วน HAVING กรองกลุ่ม AFTER การรวมค่า ทั้งสองดูคล้ายกัน แต่ทำงานคนละขั้นตอน
ตัวอย่าง WHERE
WHERE กรองแถวดิบ จึงมองไม่เห็นค่ารวม:
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;ตัวอย่าง HAVING
HAVING กรองกลุ่ม จึงอ้างอิงค่ารวมได้:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersใช้ WHERE และ HAVING ร่วมกัน
ทั้งสองส่วนสามารถปรากฏในคำสั่งสอบถามเดียวกันได้:
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;อย่าใส่ค่ารวมใน WHERE
ตัววางแผนจะทำงานกับ WHERE ก่อนการจัดกลุ่ม ดังนั้นค่ารวมจึงยังไม่พร้อมใช้งาน:
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;ย้ายเงื่อนไขไปยัง WHERE เมื่อทำได้
WHERE กรองข้อมูลก่อนการจัดกลุ่ม จึงมีแถวน้อยลงที่ต้องเข้าสู่การรวมค่า ใช้ HAVING เฉพาะกับเงื่อนไขที่ไม่สามารถเขียนใน WHERE ได้
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;ลำดับการทำงานเชิงตรรกะ
ลำดับตามแนวคิด:
FROM— เลือกตารางและเชื่อมตารางWHERE— กรองแถวGROUP BY— สร้างกลุ่มHAVING— กรองกลุ่มSELECT— เลือกคอลัมน์ORDER BY— เรียงลำดับLIMIT— เลือก N อันดับแรก
HAVING โดยไม่มี GROUP BY
คุณสามารถใช้ HAVING โดยไม่มี GROUP BY ได้ ซึ่งทั้งตารางจะกลายเป็นกลุ่มเดียว:
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1Mชื่อแทนใน HAVING
ฐานข้อมูลบางระบบอนุญาตให้ HAVING อ้างอิงชื่อแทนจาก SELECT ได้ โดย PostgreSQL และ MySQL อนุญาต แต่ SQL มาตรฐานไม่อนุญาต วิธีที่รองรับได้กว้างที่สุดคือเขียนฟังก์ชันรวมซ้ำ:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQLHAVING กับค่ารวมหลายรายการ
ใช้ HAVING สำหรับเงื่อนไขที่ประกอบด้วยค่ารวมหลายรายการ:
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;ข้อควรทราบด้านประสิทธิภาพ
ตัวกรองค่ารวมใน HAVING ไม่สามารถใช้ดัชนีได้ในลักษณะเดียวกับ WHERE ที่กรองคอลัมน์ คุณจึงควรย้ายเงื่อนไขที่ทำได้ไปไว้ใน WHERE
สรุป
WHERE = กรองแถว ส่วน HAVING = กรองกลุ่ม
- ใช้ค่ารวมได้เฉพาะใน
HAVINGไม่ใช่ในWHERE - ย้ายเงื่อนไขไปยัง
WHEREเพื่อเพิ่มความเร็ว - ใช้ทั้งสองส่วนเมื่อจำเป็น
ตรวจสอบความเข้าใจ
คุณต้องการผู้ใช้ที่สั่งซื้อเกิน 10 รายการ ควรใช้ส่วนใดในการกรอง
คำถามที่พบบ่อย
บทเรียน “HAVING เทียบกับ WHERE” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “HAVING เทียบกับ WHERE” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “HAVING เทียบกับ WHERE”
แยกความแตกต่างระหว่าง HAVING (กรองกลุ่ม) กับ WHERE (กรองแถว) และใช้ทั้งสองอย่างถูกต้องในคำค้นเดียวกัน คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “HAVING เทียบกับ WHERE” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY สำหรับคอลัมน์เดียวและหลายคอลัมน์
- HAVING เทียบกับ WHERE
- ข้อผิดพลาดที่พบบ่อย: NULL ในการรวมข้อมูล