Having (Having)
در SQL، «HAVING در SQL» برای فیلتر کردن «گروه ها» می آید. «گروه» یعنی دسته های جمع بندی شده. «تابع تجمیعی (Aggregate Function)» مثل COUNT یا SUM روی گروه ها حساب می کند. WHERE روی ردیف هاست؛ اما HAVING روی نتیجه GROUP BY کار می کند.
HAVING در SQL چیست؟
وقتی داده ها را گروه بندی می کنی، دیگر WHERE نمی تواند روی نتیجه جمع بندی کار کند. این جا از «HAVING» استفاده می کنیم. پس: اول WHERE (روی ردیف ها)، بعد GROUP BY، سپس HAVING (روی گروه ها).
قالب نوشتن (Syntax)
SELECT column_name(s);
FROM table_name;
WHERE condition;
GROUP BY column_name(s);
HAVING condition;
ORDER BY column_name(s);
مثال: شمارش مشتری ها با شرط HAVING
کشورهایی را می خواهیم که تعداد مشتری شان بیش از 5 است.
SELECT COUNT(CustomerID), Country;
FROM Customers;
GROUP BY Country;
HAVING COUNT(CustomerID) > 5;
مرتب سازی نتیجه HAVING
حالا همان گروه ها را از زیاد به کم مرتب کن.
SELECT COUNT(CustomerID), Country;
FROM Customers;
GROUP BY Country;
HAVING COUNT(CustomerID) > 5;
ORDER BY COUNT(CustomerID) DESC;
مثال: سفارش های هر کارمند
کارمندانی را می خواهیم که بیش از 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;
ترکیب 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 در SQL را ببین. همچنین درباره Group By و فیلتر اولیه ردیف ها در WHERE مطالعه کن. اگر نیاز به وجود داشتن رکورد داشتی، سراغ EXISTS برو.
جمع بندی سریع
- WHERE برای ردیف هاست؛ HAVING برای گروه هاست.
- اول GROUP BY، سپس HAVING اجرا می شود.
- توابع تجمیعی مثل COUNT در HAVING می آیند.
- می توانی بعدش ORDER BY هم بدهی.
- WHERE و HAVING را می توان ترکیب کرد.