10.06. GROUP BY, HAVING, JOIN i ORDER BY klauzule u SQL-u
Uvod
Prilikom rada sa bazama podataka često je potrebno:
-
grupisati podatke,
-
filtrirati grupe podataka,
-
povezivati više tabela,
-
sortirati rezultate.
Za ove potrebe koriste se različite SQL klauzule:
-
GROUP BY -
HAVING -
JOIN -
ORDER BY
1. GROUP BY klauzula
GROUP BY služi za grupisanje podataka prema jednoj ili više kolona.
Najčešće se koristi zajedno sa agregatnim funkcijama.
Najpoznatije agregatne funkcije su:
-
COUNT()– broji zapise -
SUM()– računa zbir -
AVG()– računa prosek -
MIN()– pronalazi najmanju vrednost -
MAX()– pronalazi najveću vrednost
Sintaksa
SELECT kolona, agregatna_funkcija(kolona)
FROM tabela
GROUP BY kolona;
Primer 1 – broj učenika po razredima
Tabela:
Ucenik(ID, Ime, Razred)
SELECT Razred, COUNT(*)
FROM Ucenik
GROUP BY Razred;
Rezultat:
| Razred | Broj učenika |
|---|---|
| III-1 | 25 |
| III-2 | 28 |
| III-3 | 24 |
SQL grupiše učenike po razredima i računa koliko ih ima u svakoj grupi.
Pravilo:
Ako SELECT sadrži:
-
agregatnu funkciju i
-
običnu kolonu
onda ta kolona mora biti navedena u GROUP BY klauzuli.
Neispravan primer
SELECT Razred, AVG(Prosek)
FROM Ucenik;
Ovo je pogrešno jer SQL ne zna kako da grupiše podatke po razredima.
Ispravan primer
SELECT Razred, AVG(Prosek)
FROM Ucenik
GROUP BY Razred;
2. HAVING klauzula
HAVING služi za filtriranje grupa podataka nakon grupisanja.
Važno je razlikovati:
-
WHERE→ filtrira redove pre grupisanja -
HAVING→ filtrira grupe posle grupisanja
Sintaksa
SELECT kolona, agregatna_funkcija(kolona)
FROM tabela
GROUP BY kolona
HAVING uslov;
Primer
Prikazati samo razrede koji imaju više od 25 učenika.
SELECT Razred, COUNT(*)
FROM Ucenik
GROUP BY Razred
HAVING COUNT(*) > 25;
Rezultat:
| Razred | Broj učenika |
|---|---|
| III-2 | 28 |
Kada se koristi?
Koristi se kada želimo da postavimo uslov nad grupama ili agregatnim funkcijama.
3. JOIN klauzula
JOIN služi za povezivanje više tabela.
U relaconim bazama podataka podaci su često raspoređeni u više tabela.
Na primer:
Tabela Ucenik
| ID | Ime | OdeljenjeID |
|---|
Tabela Odeljenje
| ID | Naziv |
|---|
Ako želimo ime učenika i naziv odeljenja, moramo povezati tabele.
Primer
SELECT Ucenik.Ime, Odeljenje.Naziv
FROM Ucenik
JOIN Odeljenje
ON Ucenik.OdeljenjeID = Odeljenje.ID;
Vrste JOIN operacija
-
INNER JOIN– prikazuje podudarne podatke -
LEFT JOIN– prikazuje sve iz leve tabele + podudarne podatke -
RIGHT JOIN– prikazuje sve iz desne tabele + podudarne podatke -
FULL JOIN– prikazuje sve podatke iz obe tabele
U srednjoškolskom radu najčešće se koristi INNER JOIN.
4. ORDER BY klauzula
ORDER BY služi za sortiranje rezultata.
Može sortirati:
-
rastuće (
ASC) -
opadajuće (
DESC)
Sintaksa
SELECT *
FROM tabela
ORDER BY kolona;
Primer 1 – rastući redosled
SELECT *
FROM Ucenik
ORDER BY Prezime ASC;
Primer 2 – opadajući redosled
SELECT *
FROM Ucenik
ORDER BY Prosek DESC;
Prvo će biti prikazani učenici sa najvećim prosekom.
| Klauzula | Namena |
|---|---|
GROUP BY |
Grupisanje podataka |
HAVING |
Filtriranje grupa |
JOIN |
Povezivanje tabela |
ORDER BY |
Sortiranje rezultata |
Zadaci za vežbu
Za tabelu: Proizvod(ID, Naziv, Kategorija, Cena)
- Prikazati prosečnu cenu proizvoda po kategorijama.
Rešenje:
SELECT Kategorija, AVG(Cena)
FROM Proizvod
GROUP BY Kategorija;
2. Prikazati kategorije koje imaju više od 5 proizvoda.
Rešenje:
SELECT Kategorija, COUNT(*)
FROM Proizvod
GROUP BY Kategorija
HAVING COUNT(*) > 5;
3. Prikazati sve proizvode sortirane po ceni opadajuće.
Rešenje:
SELECT *
FROM Proizvod
ORDER BY Cena DESC;
4. Povezati tabele Kupac i Porudzbina i prikazati ime kupca i datum porudžbine.
Rešenje:
SELECT Kupac.Ime, Porudzbina.Datum
FROM Kupac
JOIN Porudzbina
ON Kupac.ID = Porudzbina.KupacID;