SQL: Klauzule | ORDER BY, GROUP BY, HAVING, AS
Baza danych do pobrania: dziennik
ORDER BY
Klauzula ORDER BY służy do porządkowania wyników zapytania po zadanej kolumnie i w zadanej kolejności.
Wypiszmy 5 pierwszych wyników z zapytania wyszukującego nazwiska i imiona osób z tabeli uczeń w kolejności alfabetycznej.
SELECT nazwisko, imie FROM uczen ORDER BY nazwisko LIMIT 5;
+--------------+---------+ | nazwisko | imie | +--------------+---------+ | Aksamit | Ludmiła | | Andrzejczak | Irena | | Andrzejczak | Natalia | | Andrzejewski | Cyryl | | Aniszewski | Hubert | +--------------+---------+
Kolejność alfabetyczna bądź rosnąca w przypadku liczb jest kolejnością domyślną.
Zmodyfikujmy nieco powyższe zapytanie i wypiszmy osoby, w kolejności odwrotnej.
Wykorzystamy do tego polecenie DESC – descending (malejąco).
SELECT nazwisko, imie FROM uczen ORDER BY nazwisko DESC LIMIT 5;
+-------------+----------+ | nazwisko | imie | +-------------+----------+ | Żukowski | Irena | | Żelazna | Piotr | | Żabicki | Lucjan | | Żaba | Adelajda | | Zwierzyński | Jadwiga | +-------------+----------+
Możemy również jawnie zapisać, że chodzi nam o kolejność rosnącą – użyjemy wówczas polecenia ASC – ascending (rosnąco).
Porządkowania wyników wyszukiwania możemy dokonać po więcej niż jednej kolumnie. Spróbujmy zatem posortować uczniów nazwiskami w kolejności alfabetycznej oraz imionami w kolejności odwrotnej do kolejności alfabetycznej.
SELECT nazwisko, imie FROM uczen ORDER BY nazwisko ASC, imie DESC LIMIT 5;
+--------------+---------+ | nazwisko | imie | +--------------+---------+ | Aksamit | Ludmiła | | Andrzejczak | Natalia | | Andrzejczak | Irena | | Andrzejewski | Cyryl | | Aniszewski | Hubert | +--------------+---------+
Sortowanie nazwiskami odbyło się w pierwszej kolejności, zatem mamy osoby z początku alfabetu, natomiast w przypadku osób o tym samym nazwisku widzimy zmianę kolejności spowodowaną uporządkowaniem w odwrotnej kolejności po imieniu.
GROUP BY
Klauzula GROUP BY jest wyrażeniem grupującym wyniki zapytania po zadanych kryteriach.
Zabierzmy się zatem za tabelę klasa i spróbujmy policzyć w niej uczniów pogrupowanych na klasy. Grupowania dokonamy po polu id_klasa.
SELECT id_klasa, count(*) FROM uczen GROUP BY id_klasa;
+----------+----------+ | id_klasa | count(*) | +----------+----------+ | 1 | 30 | | 2 | 40 | | 3 | 33 | | 4 | 37 | | 5 | 40 | | 6 | 28 | | 7 | 35 | | 8 | 28 | | 9 | 30 | | 10 | 40 | | 11 | 30 | | 12 | 28 | | 13 | 37 | | 14 | 32 | | 15 | 33 | | 16 | 26 | +----------+----------+
Otrzymaliśmy zestawienie, w którym w lewej kolumnie znajdują się numery id klas, natomiast w prawej ilości uczniów do nich przypisanych.
HAVING
Klauzula HAVING ogranicza wynik zapytania o zadane wyrażenie logiczne.
Spróbujmy zatem ograniczyć wynik poprzedniego zapytania do klas, do których uczęszcza przynajmniej 35 uczniów.
SELECT id_klasa, count(*) FROM uczen GROUP BY id_klasa HAVING count(*) > 35;
+----------+----------+ | id_klasa | count(*) | +----------+----------+ | 2 | 40 | | 4 | 37 | | 5 | 40 | | 10 | 40 | | 13 | 37 | +----------+----------+
AS
Klauzula AS umożliwia stworzenie aliasu dla nagłówka tabeli wynikowej – elementu wyszukiwanego. Nadanie mu własnej nazwy.
Dla czytelności naszej tabeli i lepszego zrozumienia co zawiera nadajmy zatem aliasy:
- dla id_klasa – Klasa
- dla count(*) – Ilość
SELECT id_klasa AS Klasa, count(*) AS Ilość FROM uczen GROUP BY id_klasa HAVING count(*) > 35;
+-------+-------+ | Klasa | Ilość | +-------+-------+ | 2 | 40 | | 4 | 37 | | 5 | 40 | | 10 | 40 | | 13 | 37 | +-------+-------+