SQL มี Operations หลายประเภทสำหรับ Query Database SQL HAVING Statement ทำงานเหมือน Subquery บน Initial Query ทำงานได้ดีเมื่อมี Entries เยอะมากที่มีค่าเหมือนกัน 1 ค่า และต้องการ Filter เพิ่มเติม ในบทความนี้ เราดูวิธีการทำงาน
Preparation: เตรียมข้อมูล
ใน SQL Fiddle นี้ใช้ MySQL สร้าง Sample Schema สำหรับตัวอย่าง:
create table Cars ( id INT PRIMARY KEY, year VARCHAR(50), car_make VARCHAR(50), car_model VARCHAR(50) );
สร้าง Table "Cars" Schema ดู Make Model Year ของแต่ละรถ Block ถัดไป Insert Values เข้า Columns:
insert into Cars (id, year, car_make, car_model) values (1, 2011, 'Mazda', 'Miata MX-5'); insert into Cars (id, year, car_make, car_model) values (2, 1969, 'Ford', 'Mustang'); insert into Cars (id, year, car_make, car_model) values (3, 2007, 'Toyota', '4Runner'); insert into Cars (id, year, car_make, car_model) values (4, 2013, 'Porsche', '911'); insert into Cars (id, year, car_make, car_model) values (5, 1991, 'Buick', 'Coachbuilder'); insert into Cars (id, year, car_make, car_model) values (6, 2007, 'Kia', 'Sportage'); insert into Cars (id, year, car_make, car_model) values (7, 1997, 'Oldsmobile', 'Cutlass Supreme'); insert into Cars (id, year, car_make, car_model) values (8, 2003, 'BMW', '7 Series'); insert into Cars (id, year, car_make, car_model) values (9, 1996, 'Ford', 'F150'); insert into Cars (id, year, car_make, car_model) values (10, 1992, 'Suzuki', 'SJ'); insert into Cars (id, year, car_make, car_model) values (11, 2001, 'Jeep', 'Grand Cherokee'); insert into Cars (id, year, car_make, car_model) values (12, 2000, 'Ford', 'F250'); insert into Cars (id, year, car_make, car_model) values (13, 2003, 'Honda', 'Insight'); insert into Cars (id, year, car_make, car_model) values (14, 2006, 'Chevrolet', 'HHR Panel'); insert into Cars (id, year, car_make, car_model) values (15, 1987, 'Mercedes-Benz', 'S-Class'); insert into Cars (id, year, car_make, car_model) values (16, 2004, 'Chevrolet', 'SSR'); insert into Cars (id, year, car_make, car_model) values (17, 1990, 'Maserati', '228'); insert into Cars (id, year, car_make, car_model) values (18, 2005, 'Saturn', 'Ion'); insert into Cars (id, year, car_make, car_model) values (19, 1987, 'Audi', '5000CS'); insert into Cars (id, year, car_make, car_model) values (20, 1999, 'Chevrolet', 'S10'); insert into Cars (id, year, car_make, car_model) values (21, 2007, 'Jeep', 'Liberty'); insert into Cars (id, year, car_make, car_model) values (22, 2002, 'Lamborghini', 'Murciélago'); insert into Cars (id, year, car_make, car_model) values (23, 2000, 'Hyundai', 'Tiburon'); insert into Cars (id, year, car_make, car_model) values (24, 2011, 'Jeep', 'Patriot'); insert into Cars (id, year, car_make, car_model) values (25, 1985, 'Pontiac', 'Sunbird');
หากอยาก Mock Data เอง แนะนำ mockaroo.com สำหรับทำได้ง่าย Structure Database Schema ได้ง่าย
วิธีใช้ HAVING
SELECT COUNT(id), car_make FROM Cars GROUP BY car_make HAVING COUNT(id) > 0;
ใช้ HAVING เมื่อต้องใช้ Aggregate Function และ WHERE Clause ไม่ได้ ใช้ Aggregate Functions คือ Functions ที่ทำ Operation และ Return Single Value เช่น COUNT, AVG, SUM โค้ดด้านบนคืนค่า:
| COUNT(id) | car_make |
| 1 | Audi |
| 1 | BMW |
| 1 | Buick |
| 3 | Chevrolet |
| 3 | Ford |
| 1 | Honda |
| 1 | Hyundai |
| 3 | Jeep |
| 1 | Kia |
| 1 | Lamborghini |
| 1 | Maserati |
| 1 | Mazda |
| 1 | Mercedes-Benz |
| 1 | Oldsmobile |
| 1 | Pontiac |
| 1 | Porsche |
| 1 | Saturn |
| 1 | Suzuki |
| 1 | Toyota |
เราใช้ Select Statement ดึง SQL COUNT ของ car_makes ที่มีอยู่ และ Group By Clause แยกพวกเขา by car_make
นั่นคือทั้งหมดของ HAVING Clause! เตือนอีกครั้ง HAVING Clause ใน SQL Query เป็น Subfilter ที่ใช้ Aggregate Function ทำ Additional Query Work บน Database
ลองทดลอง Aggregate Functions อื่นๆ เพื่อเพิ่มความรู้ Clause นี้!