Witajcie 🙂
W tej lekcji kursu Oracle SQL zajmiemy się grupowaniami – czyli jak zrobić, żeby nasze funkcje agregujące działały w ramach pewnej grupy rekordów.
Jak działały funkcje agregujące w poprzednich lekcjach?
Jeśli w zapytaniu nie było grupowania oraz:
- nie było warunku WHERE – grupą była cała tabela. Funkcja działała w ramach wszystkich rekordów w tabeli
- był warunek w WHERE – funkcja działała w ramach rekordów ograniczonych tym warunkiem
Teraz do tworzonych przez nas zapytań dodamy GROUP BY – rekordy (które zostały po ewentualnym filtrowaniu w WHERE) zostaną podzielone na grupy i w ramach nich zadziała funkcja agregująca. Innymi słowy – grupowanie to łączenie rekordów w oparciu o wspólną cechę.
Przykład1. Wyświetl ilu jest pracowników w ramach poszczególnych job_id
SELECT job_id, Count(*) ilu_klientów FROM employees GROUP BY job_id;
Przykład 2. Spróbuj dodać kolumnę last_name.
SELECT job_id, Count(*) ilu_klientów, last_name FROM employees GROUP BY job_id;
ORA-00979: not a GROUP BY expression
W przypadku grupowania – po SELECT mogą stać tylko kolumny, które znajdują się po GROUP lub jest są użyte w funkcji agregującej.
Przykład 3. Wyświetl ilu jest pracowników w ramach poszczególnych job_id dla pracowników zatrudnionych po 2005 roku.
SELECT job_id, Count(*) ilu_klientów FROM employees WHERE EXTRACT(YEAR FROM hire_date)>2005 GROUP BY job_id;
Pytanie za 100 punktów 🙂 Czy w WHERE można używać funkcji agregujących? (Wybiegając w przyszłość dodam, że bez podzapytań 🙂 )
Przykład 4. Wyświetl ilu jest pracowników w ramach poszczególnych job_id. Wyświetl tylko te job_id, gdzie jest więcej niż 5 pracowników.
SELECT job_id, Count(*) ilu_klientów FROM employees WHERE Count(*) >5 GROUP BY job_id;
ORA-00934: group function is not allowed here
Nie można 🙂 Nie można w WHERE używać funkcji agregujących.
WHERE służy do limitowania rekordów, które zostaną poddane grupowaniu. Do limitowania grup służy HAVING. W HAVING można używać funkcji agregujących.
Przykład 5. Wyświetl ilu jest pracowników w ramach poszczególnych job_id. Wyświetl tylko te job_id, gdzie jest więcej niż 5 pracowników.
SELECT job_id, Count(*) ilu_klientów FROM employees GROUP BY job_id HAVING Count(*)>5;
Co w następnej lekcji?
Złączenia – czyli jak wybrać dane znajdujące się w różnych tabelach.