GROUP BY দিয়ে গ্রুপ করা után HAVING ক্লজ ব্যবহার করে অ্যাক্টিভ ফাংশনের ফলাফল (যেমন SUM) অনুযায়ী ফিল্টার করা যায়। WHERE গ্রুপের আগে, HAVING গ্রুপের পর কাজ করে।
টেবিল তৈরি ও ডেটা ইনসার্ট
mysql> create table DemoTable782 (Name varchar(100), Score int); Query OK, 0 rows affected (1.18 sec)
mysql> insert into DemoTable782 values('John', 156);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable782 values('Carol', 250);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable782 values('Bob', 140);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('John', 126);
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable782 values('John', 140);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Bob', 280);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Bob', 250);
Query OK, 1 row affected (0.41 sec)
mysql> insert into DemoTable782 values('Carol', 189);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Carol', 299);
Query OK, 1 row affected (0.21 sec)
রেকর্ড দেখানো
mysql> select * from DemoTable782;
আউটপুট:
+-------+-------+ | Name | Score | +-------+-------+ | John | 156 | | Carol | 250 | | Bob | 140 | | John | 126 | | John | 140 | | Bob | 280 | | Bob | 250 | | Carol | 189 | | Carol | 299 | +-------+-------+ 9 rows in set (0.00 sec)
নাম অনুযায়ী গ্রুপ করে যোগফল ৫০০-এর বেশি হলে ফিল্টার
mysql> SELECT Name, SUM(Score) AS Total FROM DemoTable782 GROUP BY Name HAVING Total > 500;
ফলাফল:
+-------+-------+ | Name | Total | +-------+-------+ | Carol | 738 | | Bob | 670 | +-------+-------+ 2 rows in set (0.00 sec)
গণনা
- Carol: 250 + 189 + 299 = 738
- Bob: 140 + 280 + 250 = 670
- John: 156 + 126 + 140 = 420 (৫০০-এর কম, তাই বাদ)
WHERE vs HAVING
WHERE সারি-স্তরে ফিল্টার করে (গ্রুপের আগে), HAVING গ্রুপ-স্তরে ফিল্টার করে (অ্যাক্টিভ ফাংশনের পর)।