با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره آموزش کامل SQL را دنبال می کنند. شاید گاهی با این مشکل مواجه شده باشید که در هنگام استفاده از دستور شرطی WHERE امکان استفاده از توابع ریاضی SQL از جمله MIN, SUM, AVG و … را ندارید. برای حل این مشکل و ایجاد قابلیت استفاده از توابع ریاضی در یک دستور شرطی ، SQL به شما دستور شرطی HAVING را پیشنهاد می کند. برای آشنایی با دستور شرطی HAVING در SQL ، در ادامه این بخش با ما همراه باشید.
دستور شرطی HAVING به زبان SQL اضافه شد. چرا که در دستور WHERE امکان استفاده از توابع ریاضی SQL وجود ندارد.
ساختار دستور HAVING :
1 2 3 4 5 6 | SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING condition ORDER BY column_name(s); |
در این قسمت، به بخشی از رکوردهای یک جدول که در مثال های این آموزش، از آن، استفاده خواهیم کرد، اشاره می کنیم.
بخشی از رکوردهای جدول “Customers” :
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
۱ | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | ۱۲۲۰۹ | Germany |
۲ | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | ۰۵۰۲۱ | Mexico |
۳ | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | ۰۵۰۲۳ | Mexico |
۴ | Around the Horn | Thomas Hardy | ۱۲۰ Hanover Sq. | London | WA1 1DP | UK |
۵ | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
مثال زیر فیلدهای Country و مجموع CustomerID را از جدول Customers ، به شرط اینکه مجموع CustomerID هر فیلد Country، از ۵ بزرگتر باشد را ، بصورت گروه بندی شده بر اساس Country ، نمایش می دهد:
1 2 3 4 | SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 5; |
مثال زیر نیز نتایج مثال بالا را، بر اساس فیلد CustomerID ، بصورت نزولی گروه بندی می کند:
1 2 3 4 5 | SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 5 ORDER BY COUNT(CustomerID) DESC; |
در این قسمت، به بخشی از رکوردهای یک جدول که در مثال های این آموزش، از آن، استفاده خواهیم کرد، اشاره می کنیم.
بخشی از رکوردهای جدول “Orders” :
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
۱۰۲۴۸ | ۹۰ | ۵ | ۱۹۹۶-۰۷-۰۴ | ۳ |
۱۰۲۴۹ | ۸۱ | ۶ | ۱۹۹۶-۰۷-۰۵ | ۱ |
۱۰۲۵۰ | ۳۴ | ۴ | ۱۹۹۶-۰۷-۰۸ | ۲ |
بخشی از رکوردهای جدول “Employees” :
EmployeeID | LastName | FirstName | BirthDate | Photo | Notes |
---|---|---|---|---|---|
۱ | Davolio | Nancy | ۱۹۶۸-۱۲-۰۸ | EmpID1.pic | Education includes a BA…. |
۲ | Fuller | Andrew | ۱۹۵۲-۰۲-۱۹ | EmpID2.pic | Andrew received his BTS…. |
۳ | Leverling | Janet | ۱۹۶۳-۰۸-۳۰ | EmpID3.pic | Janet has a BS degree…. |
مثال زیر رکوردهای جدول Employees را که مجموع فیلد OrderID آنها در جدول Orders بیشتر از ۱۰ باشد. را بر اساس فیلد LastName در جدول Employees ، گروه بندی کرده و نمایش می دهد:
1 2 3 4 5 | 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; |
مثال زیر نیز، نتایج مثال بالا را زمانیکه مقدار LastName در جدول Employees ، برابر با مقادیر “Davolio” یا “Fuller” بوده و مجموع OrderID آن ها در جدول Orders نیز، بیشتر از ۲۵ باشد را بر اساس فیلد LastName گروه بندی کرده و نمایش می دهد:
1 2 3 4 5 6 | 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 بسیار شبیه به دستور WHERE عمل می کند، فقط مزیت دستور HAVING در امکان استفاده از توابع ریاضی در ساختار این دستور است. امیدواریم که از مباحث آشنایی با دستور شرطی HAVING در SQL ، بهره ی لازم را برده باشید.