Co robi klauzula HAVING w zapytaniu?
Klauzula HAVING jest podobna do klauzuli WHERE, ale operuje na pogrupowanych rekordach zwróconych przez GROUP BY.AVING odnosi się do podsumowanych rekordów grup, podczas gdy WHERE odnosi się do indywidualnych rekordów.
Zwrócone zostaną tylko grupy, które spełniają kryteria HAVING.
HAVING wymaga, aby klauzula GROUP BY była obecna.arówno WHERE jak i HAVING mogą być użyte w tym samym zapytaniu w tym samym czasie.
Składnia SQL HAVING
Ogólna składnia to
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition
Ogólna składnia z ORDER BY to:
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition ORDER BY column-names
Id
FirstName
LastName
City
Country
Phone
SQL GROUP BY
Przykłady SQL GROUP BY
Problem: Zestawić liczbę klientów w poszczególnych krajach.
Wyłącz tylko kraje, w których jest więcej niż 10 klientów.
SELECT COUNT(Id), Country FROM Customer GROUP BY CountryHAVING COUNT(Id) > 10
Wynik: 3 rekordy
Count
Kraj
.
11
Francja
11
Niemcy
13
USA
CUSTOMER
Id
FirstName
LastName
City
Country
Phone
Problem: Wymień liczbę klientów w każdym kraju,
z wyjątkiem USA, posortowanych od najwyższego do najniższego.
Uwzględnij tylko kraje, w których jest 9 lub więcej klientów.
SELECT COUNT(Id), Country FROM Customer WHERE Country 'USA' GROUP BY CountryHAVING COUNT(Id) >= 9 ORDER BY COUNT(Id) DESC
Wynik: 3 rekordy
Count
Kraj
11
Francja
.
11
Niemcy
9
Brazylia
ORDER
Id
OrderDate
OrderNumber
CustomerId
TotalAmount
CUSTOMER
Id
FirstName
LastName
City
Country
Phone
Problem z wyborem dostawcy:
Klient
Kraj
Podać nazwę dostawcy.
Problem: Wymień wszystkich klientów, których średnia wartość zamówień
wynosi od 1000 do 1200 USD.
SELECT AVG(TotalAmount), FirstName, LastName FROM O JOIN Customer C ON O.CustomerId = C.Id GROUP BY FirstName, LastNameHAVING AVG(TotalAmount) BETWEEN 1000 AND 1200
Wynik: 10 rekordów
Średnia
FirstName
LastName
1081.215000
Miguel
Angel Paolino
1063.420000
Isabel
de Castro
1008.440000
Alexander
Feuer
1062.038461
Thomas
Hardy
1107.806666
Pirkko
Koskitalo
1174.945454
Janete
Limeira
1073.621428
Antonio
Moreno
1065.385000
Rita
Müller
1183.010000
José
Pedro Freyre
1057.386666
Carine
Schmitt
Wyłącz tylko kraje, w których jest więcej niż 10 klientów.
Count | Kraj |
---|---|
11 | Francja |
11 | Niemcy |
13 | USA |
Id
FirstName
LastName
City
Country
Phone
Problem: Wymień liczbę klientów w każdym kraju,
z wyjątkiem USA, posortowanych od najwyższego do najniższego.
Uwzględnij tylko kraje, w których jest 9 lub więcej klientów.
z wyjątkiem USA, posortowanych od najwyższego do najniższego.
Uwzględnij tylko kraje, w których jest 9 lub więcej klientów.
SELECT COUNT(Id), Country FROM Customer WHERE Country 'USA' GROUP BY CountryHAVING COUNT(Id) >= 9 ORDER BY COUNT(Id) DESC
Wynik: 3 rekordy
Count | Kraj |
---|---|
11 | Francja |
11 | Niemcy |
9 | Brazylia |
Id
OrderDate
OrderNumber
CustomerId
TotalAmount
Id
FirstName
LastName
City
Country
Phone
Problem z wyborem dostawcy:
Klient
Kraj
Podać nazwę dostawcy.
Problem: Wymień wszystkich klientów, których średnia wartość zamówień
wynosi od 1000 do 1200 USD.
wynosi od 1000 do 1200 USD.
SELECT AVG(TotalAmount), FirstName, LastName FROM O JOIN Customer C ON O.CustomerId = C.Id GROUP BY FirstName, LastNameHAVING AVG(TotalAmount) BETWEEN 1000 AND 1200
Wynik: 10 rekordów
Średnia | FirstName | LastName |
---|---|---|
1081.215000 | Miguel | Angel Paolino |
1063.420000 | Isabel | de Castro |
1008.440000 | Alexander | Feuer |
1062.038461 | Thomas | Hardy |
1107.806666 | Pirkko | Koskitalo |
1174.945454 | Janete | Limeira |
1073.621428 | Antonio | Moreno |
1065.385000 | Rita | Müller |
1183.010000 | José | Pedro Freyre |
1057.386666 | Carine | Schmitt |