Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

Clause HAVING คืออะไร?

บทความนี้อธิบายการใช้งาน `HAVING` clause ใน MySQL ซึ่งใช้สำหรับกรองข้อมูล *หลังจาก* ที่ได้ทำการจัดกลุ่มด้วย `GROUP BY` clause แล้ว โดย `HAVING` ทำงานคล้ายกับ `W...

Clause HAVING คืออะไร? กรองข้อมูลหลังจัดกลุ่มอย่างมืออาชีพ

ในบทความก่อนหน้า เราได้เรียนรู้เกี่ยวกับการใช้งาน GROUP BY clause เพื่อจัดกลุ่มข้อมูลใน MySQL กันไปแล้ว แต่ถ้าเราต้องการที่จะกรองข้อมูล *หลังจาก* ที่ทำการจัดกลุ่มไปแล้วล่ะ? นั่นแหละครับคือหน้าที่ของ HAVING clause

HAVING Clause คืออะไร?

HAVING clause เป็นส่วนหนึ่งของคำสั่ง SELECT ที่ใช้ในการกรองผลลัพธ์ที่ได้จากการจัดกลุ่มด้วย GROUP BY clause พูดง่ายๆ คือมันเหมือน WHERE clause แต่ใช้สำหรับกรองข้อมูลที่ได้จากการจัดกลุ่มแล้วเท่านั้น

ความแตกต่างที่สำคัญระหว่าง WHERE และ HAVING:

  • WHERE ใช้กรองแถวก่อนที่จะทำการจัดกลุ่ม
  • HAVING ใช้กรองกลุ่มข้อมูลที่ได้จากการจัดกลุ่มแล้ว

โครงสร้างของ HAVING Clause

โครงสร้างการใช้งาน HAVING clause จะอยู่ต่อจาก GROUP BY clause ในคำสั่ง SELECT ดังนี้:

SELECT column1, column2, aggregate_function(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2
HAVING condition;

คำอธิบาย:

  • column1, column2: คอลัมน์ที่ใช้ในการจัดกลุ่ม
  • aggregate_function(column3): ฟังก์ชัน aggregate เช่น COUNT(), SUM(), AVG(), MIN(), MAX() ที่ใช้คำนวณค่าในแต่ละกลุ่ม
  • table_name: ชื่อตาราง
  • WHERE condition: เงื่อนไขในการกรองแถวก่อนที่จะทำการจัดกลุ่ม (optional)
  • GROUP BY column1, column2: ระบุคอลัมน์ที่ใช้ในการจัดกลุ่ม
  • HAVING condition: เงื่อนไขในการกรองกลุ่มข้อมูลที่ได้จากการจัดกลุ่ม

ตัวอย่างการใช้งาน HAVING Clause

สมมติว่าเรามีตาราง orders ที่เก็บข้อมูลการสั่งซื้อสินค้า ดังนี้:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    product_name VARCHAR(255),
    quantity INT,
    price DECIMAL(10, 2)
);

INSERT INTO orders (order_id, customer_id, product_name, quantity, price) VALUES
(1, 101, 'Keyboard', 2, 75.00),
(2, 102, 'Mouse', 3, 25.00),
(3, 101, 'Monitor', 1, 300.00),
(4, 103, 'Keyboard', 1, 75.00),
(5, 102, 'Headphones', 2, 50.00),
(6, 101, 'Mouse Pad', 4, 10.00),
(7, 103, 'Monitor', 2, 300.00),
(8, 104, 'Webcam', 1, 100.00);

ตัวอย่างที่ 1: ต้องการหาลูกค้าที่มียอดสั่งซื้อรวมมากกว่า 200 บาท

SELECT customer_id, SUM(quantity * price) AS total_order_value
FROM orders
GROUP BY customer_id
HAVING SUM(quantity * price) > 200;

คำอธิบาย:

  • เราใช้ GROUP BY customer_id เพื่อจัดกลุ่มข้อมูลตามลูกค้า
  • SUM(quantity * price) คำนวณยอดสั่งซื้อรวมของแต่ละลูกค้า
  • HAVING SUM(quantity * price) > 200 กรองเฉพาะลูกค้าที่มียอดสั่งซื้อรวมมากกว่า 200 บาท

ผลลัพธ์:

+-------------+---------------------+
| customer_id | total_order_value |
+-------------+---------------------+
|         101 |              490.00 |
|         103 |              675.00 |
+-------------+---------------------+

ตัวอย่างที่ 2: ต้องการหา product ที่ถูกสั่งซื้อมากกว่า 2 ชิ้น

SELECT product_name, SUM(quantity) AS total_quantity
FROM orders
GROUP BY product_name
HAVING SUM(quantity) > 2;

คำอธิบาย:

  • เราใช้ GROUP BY product_name เพื่อจัดกลุ่มข้อมูลตามชื่อสินค้า
  • SUM(quantity) คำนวณจำนวนสินค้าที่ถูกสั่งซื้อทั้งหมดของแต่ละ product
  • HAVING SUM(quantity) > 2 กรองเฉพาะ product ที่ถูกสั่งซื้อมากกว่า 2 ชิ้น

ผลลัพธ์:

+--------------+----------------+
| product_name | total_quantity |
+--------------+----------------+
| Keyboard     |              3 |
| Mouse        |              3 |
| Mouse Pad    |              4 |
+--------------+----------------+

กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย

กรณีใช้งานจริง:

  • วิเคราะห์ข้อมูลการขายเพื่อหาร้านค้าที่มีรายได้เฉลี่ยต่อเดือนสูงกว่าเป้าหมาย
  • ตรวจสอบข้อมูลการเข้าชมเว็บไซต์เพื่อหาหน้าที่ผู้ใช้ใช้เวลานานกว่าค่าเฉลี่ย
  • วิเคราะห์ข้อมูลการใช้งานแอปพลิเคชันเพื่อหากลุ่มผู้ใช้ที่มีพฤติกรรมการใช้งานที่ผิดปกติ

ข้อผิดพลาดที่พบบ่อย:

  • การใช้ WHERE แทน HAVING: หากต้องการกรองข้อมูลที่ได้จากการจัดกลุ่มแล้ว ต้องใช้ HAVING เท่านั้น การใช้ WHERE จะทำให้เกิดข้อผิดพลาด หรือได้ผลลัพธ์ที่ไม่ถูกต้อง
  • การอ้างอิงคอลัมน์ที่ไม่ได้อยู่ใน GROUP BY clause หรือ Aggregate Function ใน HAVING clause: MySQL จะไม่อนุญาตให้คุณอ้างอิงคอลัมน์ที่ไม่ได้อยู่ใน GROUP BY clause หรือ Aggregate Function ใน HAVING clause เพราะค่าของคอลัมน์เหล่านั้นจะไม่แน่นอนในแต่ละกลุ่ม
  • สับสนลำดับการทำงาน: อย่าลืมว่า WHERE ทำงานก่อน GROUP BY และ HAVING ทำงานหลัง GROUP BY

ตัวอย่างข้อผิดพลาด:

-- ตัวอย่างที่ผิด: พยายามกรองตามราคา (price) ใน HAVING clause โดยที่ price ไม่ได้อยู่ใน GROUP BY หรือ Aggregate Function
SELECT customer_id, SUM(quantity * price) AS total_order_value
FROM orders
GROUP BY customer_id
HAVING price > 50;  -- จะเกิด error เพราะ price ไม่ได้อยู่ใน GROUP BY หรือ Aggregate Function

วิธีแก้ไข: ถ้าต้องการกรองตามราคา (price) ต้องใช้ WHERE clause ก่อนที่จะทำการจัดกลุ่ม

SELECT customer_id, SUM(quantity * price) AS total_order_value
FROM orders
WHERE price > 50
GROUP BY customer_id;

สรุป

HAVING clause เป็นเครื่องมือที่สำคัญสำหรับการกรองข้อมูลที่ได้จากการจัดกลุ่มด้วย GROUP BY clause การเข้าใจความแตกต่างระหว่าง WHERE และ HAVING รวมถึงการหลีกเลี่ยงข้อผิดพลาดที่พบบ่อย จะช่วยให้คุณสามารถเขียน query ที่มีประสิทธิภาพและได้ผลลัพธ์ที่ถูกต้องแม่นยำ

ในบทความถัดไป เราจะไปเรียนรู้เกี่ยวกับการ JOIN ตาราง ซึ่งเป็นอีกหนึ่ง concept ที่สำคัญในการจัดการฐานข้อมูล MySQL อย่าพลาดติดตามนะครับ!

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service