GROUP BY دستور
-
دستور GROUP BY تمام سطرهایی که مقدار یکسانی در ستون مشخص شده دارند را تجمیع میکند.
- معمولا در استفاده از دستور GROUP BY از توابع تجمیعی
COUNT
,MAX
,MIN
,SUM
,AVG
استفاده میکنند. - نحوه استفاده از دستور GROUP BY:
SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) ORDER BY column_name(s)
- مثال:
در مثال زیر تعداد CustomerIDهایی که شهرشان یکی است را میشمارد و تعدادشان را کنار نام شهرشان نمایش میدهد.
SELECT COUNT(CustomerID) AS CountCustomer, City FROM Customers GROUP BY City
نتیجه:
City | CountCustomer |
---|---|
Tehran | 3 |
Karaj | 1 |
Tabriz | 1 |
Isfahan | 1 |
- میتوانید برای نمایش نتیجه GROUP BY به صورت مرتب از ORDER BY استفاده کنید.
SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country ORDER BY COUNT(CustomerID) DESC
- در JOIN نیز میتوانید از GROUP BY استفاده کنید.
- در نمونه زیر از ادغام جداول Orders و Customers مقادیر CustomerName و تعداد Order هایی که هر مشتری داشته است را واکشی میکنیم.
SELECT Customers.CustomerName,COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders JOIN Customers ON Orders.CustomerID = Customers.CustomerID GROUP BY CustomerName
HAVING دستور
- HAVING عملکرد مشابه WHERE را دارد ولی چون WHERE را نمیتوان برای توابع تجمعی استفاده کرد هنگام استفاده از توابع تجمعی برای اعمال شرط از HAVING استفاده میکنیم.
SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING condition ORDER BY column_name(s)
- مثال:
در این مثال تعداد مشتریان هر شهر شمرده شده و مواردی که تعداد مشتریان بالای ۵ نفر باشد انتخاب میشوند و درنهایت تعداد مشتریان بالای ۵ نفر در کنار نام شهرشان به صورت نزولی چاپ میشوند.
SELECT COUNT(CustomerID), City FROM Customers GROUP BY City HAVING COUNT(CustomerID) > 5 ORDER BY COUNT(CustomerID) DESC
مثال:
در مثال زیر جدول های Employees و Orders ادغام شدند و مواردی که FirstName آنها Ali یا Zahra هستند واکشی شدند سپس بر روی جدول تولید شده تابع تجمیعی اعمال شد و تعداد Order های ثبت شده برای هر اسم محاسبه گردید و درنهایت مواردی که تعداد Orderهای آن ها بالای ۲۵ مورد باشد به صورت نام و تعداد مجموع Orderهای ثبت شده برای هر نام چاپ میشود.
SELECT Employees.FirstName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID WHERE FirstName = ‘Ali’ OR FirstName = ‘Zahra’ GROUP BY FirstName HAVING COUNT(Orders.OrderID) > 25