HAVING (HAVING)
«HAVING (HAVING)» فیلتر بعد از «گروه بندی (GROUP BY)» است. چون «WHERE (شرط ردیف)» روی «توابع تجمیعی (Aggregate)» مثل COUNT و SUM کار نمی کند، HAVING آمد تا خروجی گروه ها را فیلتر کند. مثل اینکه اول دانش آموزها را کلاس بندی کنی، بعد فقط کلاس های شلوغ را نگه داری.
سینتکس HAVING
ترتیب اجرای ساده: FROM → WHERE → GROUP BY → HAVING → ORDER BY.
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
مثال 1: کشورهایی با بیش از 5 مشتری
COUNT تعداد ردیف ها در هر گروه را می شمارد. سپس HAVING گروه های کم تعداد را حذف می کند.
SELECT COUNT(CustomerID),
Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
مثال 2: همان شرط، با مرتب سازی نزولی
در پایان، ORDER BY خروجی نهایی را مرتب می کند؛ نه گروه بندی را.
SELECT COUNT(CustomerID),
Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5
ORDER BY COUNT(CustomerID) DESC;
مثال 3: HAVING روی نتیجه JOIN
اول Orders و Employees را با INNER JOIN وصل می کنیم. بعد تعداد سفارش هر کارمند را می سنجیم و بزرگ تر از 10 را نگه می داریم.
SELECT Employees.LastName,
COUNT(Orders.OrderID) AS NumberOfOrders
FROM (Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID)
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 10;
مثال 4: WHERE قبل از گروه بندی، HAVING بعد از آن
WHERE ردیف ها را قبل از گروه بندی محدود می کند. سپس HAVING روی گروه های ساخته شده شرط می گذارد.
SELECT Employees.LastName,
COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;
نکته: اگر پس از گروه بندی نیاز به فیلتر داری، از HAVING استفاده کن. مقایسه دقیق با GROUP BY را ببین و برای وجود ردیف ها سراغ EXISTS برو.
گام های عملی
- SELECT و FROM را بنویس.
- در صورت نیاز، WHERE را اعمال کن.
- ستون های گروه بندی را در GROUP BY بده.
- توابع تجمیعی را محاسبه کن.
- با HAVING گروه ها را فیلتر کن.
- در انتها ORDER BY را اضافه کن.
جمع بندی سریع
- WHERE قبل از GROUP BY فیلتر می کند.
- HAVING بعد از GROUP BY فیلتر می کند.
- HAVING برای شروط روی Aggregate است.
- ORDER BY فقط در پایان می آید.
- JOIN و HAVING ترکیب قدرتمندی هستند.