320 PHP i MySQL dla każdego
Zapytanie grupujące dane może również zawierać dodatkowe warunki grupowania. Umożliwia to dodatkowa klauzula HAVING. Zapytanie takie ma ogólną postać:
SELECT kolumnall. kolumna2.....kolumnaN']
FROM tabel alt. tabel a2.....tabelaN]
WHERE warunkijdiere
GROUP BY kolumnalt. kolumna2.....kolumnaN]
HAYING warunki_having
gdzie warunki_having określają warunki grupowania. Przykładowo, gdybyśmy chcieli uzyskać dane o klientach, którzy złożyli sumaryczne zamówienia o wartości większej od 30 zł, należałoby zastosować klauzulę HAVING w postaci:
HAVING SUM(Wartosc) > 30: a cała instrukcja SELECT miałaby postać:
SELECT Klientld. SUM(Wartosc) AS 'Wartość Zamówień'
FROM Zamówienia GROUP BY Klientld HAVING SUM(Wartosc) > 30:
Efekt jej działania został przedstawiony na rysunku 11.14.
Rysunek 11.14.
Efekt działania zapytania wykorzystującego dodatkowy warunek grupowania
mysql> SELECT Klientld, SUM(Wartosc) AS 'Wartość Zamówień' -> FROM Zamówienia -> GROUP BY Klientld -> HAYING SUM(Wartość) > 30:
I Klientld I Wartość Zamówień |
38.54 | 46.98 I 30.92 |
Możemy też skonstruować bardziej skomplikowane zapytanie. Dowiedzmy się, jaka była średnia wartość zamówień towarów o identyfikatorach 1, 3 i 5 (z podziałem na poszczególnych klientów), takich że sumaryczna wartość tych zamówień dla danego klienta była równa co najmniej 10 zł. W tym celu musimy wykonać zapytanie:
SELECT KLientld. Towarld. AVG(Wartosc) AS AVG
FROM Zamówienia
WHERE Towarld IN (1. 3. 5)
GROUP BY Klientld HAVING SUM(Wartosc) >- 10:
którego efekt działania został przedstawiony na rysunku 11.15.
Wymienione w tabeli 6.1 funkcje agregujące, jak i klauzule GROUP BY i HAVING, mogą być również używane w złączeniach tabel. W przykładach z poprzednie sekcji korzystaliśmy tylko z jednej tabeli, otrzymując w wyniku zapytań jedynie identyfikatory klientów