22-24. 10. Funkcije za agregaciju
...
Kada u bazi imamo mnogo podataka, često želimo da izračunamo neke zbirne vrednosti — na primer:
- Koliko ima zapisa u tabeli?
- Koja je najveća plata?
- Koja je prosečna ocena učenika?
- Koliko ima proizvoda sa cenom većom od 100?
Za ovakve zadatke ne koristimo obične SELECT naredbe koje prikazuju sve redove, već agregatne funkcije (eng. aggregate functions).
One ne rade sa pojedinačnim redovima, već sa grupom redova, i vraćaju jednu zbirnu vrednost.
... pogledajte prezentaciju / pdf - Agregatne funkcije
... LINK - gde možete videti koje sve funkcije postoje kod SQL Servera (SQL Server Functions),
ČAS 1 – Osnovne agregatne funkcije
Značenje agregatnih funkcija
Agregatne funkcije se koriste da bi se izračunale vrednosti kao što su:
-
MIN() – najmanja vrednost u koloni
-
MAX() – najveća vrednost u koloni
-
SUM() – zbir vrednosti u koloni
-
AVG() – prosečna vrednost
-
COUNT() – broj redova ili broj nenull vrednosti
Svi ovi izrazi se najčešće koriste sa naredbom SELECT.
Primer - tabela koju koristimo za primere na času
- tabela za rad - upiti za kreiranje i popunjavanje
-- 1. Ako već postoji tabela, brišemo je da ne bi došlo do greške
IF OBJECT_ID('Ucenik', 'U') IS NOT NULL
DROP TABLE Ucenik;
GO
-- 2. Kreiranje tabele UCENIK
CREATE TABLE Ucenik (
UcenikID INT IDENTITY(1,1) PRIMARY KEY,
Ime NVARCHAR(30) NOT NULL,
Prezime NVARCHAR(30) NOT NULL,
Razred INT NOT NULL,
ProsecnaOcena DECIMAL(3,2) NULL
);
GO
-- 3. Ubacivanje podataka u tabelu učenik
INSERT INTO Ucenik (Ime, Prezime, Razred, ProsecnaOcena) VALUES
('Ana', 'Petrović', 3, 4.50),
('Miloš', 'Nikolić', 3, 3.80),
('Jelena', 'Pavlović', 3, 4.20),
('Nikola', 'Simić', 3, 5.00),
('Ivana', 'Marković', 3, NULL);
INSERT INTO Ucenik (Ime, Prezime, Razred, ProsecnaOcena) VALUES
('Mira', 'Petrov', 3, 4.50),
('Milica', 'Nikolić', 3, 3.80),
('Jovana', 'Pavlov', 4, 4.20),
('Nikolina', 'Simić', 4, 5.00),
('Mirko', 'Spahić', 4, NULL);
GO
| UcenikID | Ime | Prezime | Razred | ProsecnaOcena |
|---|---|---|---|---|
| 1 | Ana | Petrovic | 3 | 4.50 |
| 2 | Miloš | Nikolić | 3 | 3.80 |
| 3 | Jelena | Pavlović | 3 | 4.20 |
| 4 | Nikola | Simić | 3 | 5.00 |
| 5 | Ivana | Marković | 3 | NULL |
Napomena: vrednost NULL znači da podatak nije poznat, npr. učenik još nije dobio sve ocene.
🔹 Funkcija MIN()
Pronalazi najmanju vrednost u koloni.
SELECT MIN(ProsecnaOcena) AS NajmanjaOcena
FROM Ucenik;
Rezultat:
| NajmanjaOcena |
|---|
| 3.80 |
NULL vrednosti se ignorišu — dakle, one ne utiču na rezultat.
🔹 Funkcija MAX()
Pronalazi najveću vrednost u koloni.
SELECT MAX(ProsecnaOcena) AS NajvecaOcena
FROM Ucenik;
Rezultat:
| NajvecaOcena |
|---|
| 5.00 |
🔹 Funkcija SUM()
Računa zbir svih vrednosti u koloni.
SELECT SUM(ProsecnaOcena) AS ZbirOcena
FROM Ucenik;
Rezultat:
| ZbirOcena |
|---|
| 17.50 |
Objašnjenje: 4.5 + 3.8 + 4.2 + 5.0 = 17.5 (NULL se ne računa).
🔹 Funkcija AVG()
Računa prosečnu vrednost.
SELECT AVG(ProsecnaOcena) AS Prosek
FROM Ucenik;
Rezultat:
| Prosek |
|---|
| 4.375 |
Objašnjenje: Prosek se računa kao 17.5 / 4 jer postoji 4 poznate vrednosti (NULL se ne računa).
🔹 Funkcija COUNT()
Računa broj redova ili broj nenull vrednosti.
Postoje dve varijante:
-
COUNT(*)– broji sve redove -
COUNT(kolona)– broji samo nenull vrednosti
SELECT COUNT(*) AS BrojUcenika,
COUNT(ProsecnaOcena) AS BrojSaOcenom
FROM Ucenik;
Rezultat:
| BrojUcenika | BrojSaOcenom |
|---|---|
| 5 | 4 |
Kombinovanje funkcija
Možemo izračunati više vrednosti u istom upitu:
SELECT
MIN(ProsecnaOcena) AS Najmanja,
MAX(ProsecnaOcena) AS Najveca,
AVG(ProsecnaOcena) AS Prosek,
COUNT(*) AS UkupnoUcenika
FROM Ucenik;
Rezultat:
| Najmanja | Najveca | Prosek | UkupnoUcenika |
|---|---|---|---|
| 3.80 | 5.00 | 4.375 | 5 |
VEŽBE ZA PRVI ČAS
-
Prikazati najveću prosečnu ocenu iz tabele Ucenik.
-
Izračunati zbir prosečnih ocena svih učenika.
-
Koliko učenika ima poznatu prosečnu ocenu?
-
Prikazati najmanju i najveću prosečnu ocenu u istom upitu.
- Rešenja -
SELECT MAX(ProsecnaOcena) FROM Ucenik;SELECT SUM(ProsecnaOcena) FROM Ucenik;SELECT COUNT(ProsecnaOcena) FROM Ucenik;SELECT MIN(ProsecnaOcena) AS Najmanja, MAX(ProsecnaOcena) AS Najveca FROM Ucenik;
ČAS 2 – Naprednija primena i kombinovanje sa uslovima
1. Agregatne funkcije i uslov WHERE
Agregatne funkcije se često koriste uz uslov da bi se ograničili redovi koji ulaze u računanje.
Primer:
Izračunati prosečnu ocenu samo učenika koji imaju prosečnu ocenu veću od 4.
SELECT AVG(ProsecnaOcena) AS ProsekOdlicnih
FROM Ucenik
WHERE ProsecnaOcena >= 4.5;
Rezultat:
| ProsekOdlicnih |
|---|
| 4.57 |
2. COUNT sa uslovom
Koliko učenika ima prosečnu ocenu veću od 4?
SELECT COUNT(*) AS BrojOdlicnih
FROM Ucenik
WHERE ProsecnaOcena >= 4;
Rezultat:
| BrojOdlicnih |
|---|
| 3 |
3. GROUP BY – grupisanje rezultata
Agregatne funkcije se često koriste sa GROUP BY, da bi se zbirne vrednosti računale po grupama.
Naša tabela Ucenik ima učenike iz više razreda pa možemo izračunati prosečnu ocenu po razredu:
SELECT Razred, AVG(ProsecnaOcena) AS ProsekPoRazredu
FROM Ucenik
GROUP BY Razred;
Rezultat:
| Razred | ProsekPoRazredu |
|---|---|
| 3 | 4.15 |
| 4 | 4.60 |
4. HAVING – filtriranje nakon grupisanja
Ako želimo da prikažemo samo razrede čiji prosek prelazi 4.3:
SELECT Razred, AVG(ProsecnaOcena) AS ProsekPoRazredu
FROM Ucenik
GROUP BY Razred
HAVING AVG(ProsecnaOcena) > 4.3;
Rezultat:
| Razred | ProsekPoRazredu |
|---|---|
| 4 | 4.60 |
VEŽBE ZA DRUGI ČAS
-
Izračunati prosečnu ocenu svih učenika osim onih bez ocene.
-
Prikazati razrede i njihove prosečne ocene.
-
Prikazati samo one razrede čiji je prosek veći od 4.2.
-
Izračunati najveću prosečnu ocenu po razredima.
-
Izračunati broj učenika po razredu.
- Rešenja -
Rešenja:
-
SELECT AVG(ProsecnaOcena)
FROM Ucenik
WHERE ProsecnaOcena IS NOT NULL;
SELECT Razred, AVG(ProsecnaOcena) AS Prosek
FROM Ucenik
GROUP BY Razred;
-
SELECT Razred, AVG(ProsecnaOcena) AS Prosek
FROM Ucenik
GROUP BY Razred
HAVING AVG(ProsecnaOcena) > 4.2;
-
SELECT Razred, MAX(ProsecnaOcena) AS Najveca
FROM Ucenik
GROUP BY Razred;
-
SELECT Razred, COUNT(*) AS BrojUcenika
FROM Ucenik
GROUP BY Razred;
Važno je zapamtiti:
-
Funkcije ignorišu NULL vrednosti osim
COUNT(*). -
WHEREfiltrira pre agregacije,HAVING– posle. -
GROUP BYgrupiše podatke po nekom kriterijumu.
🎯 Kratak test za samoproveru (usmeni ili pismeni)
-
Koja funkcija se koristi za računanje proseka?
-
Koja funkcija broji sve redove, uključujući one sa NULL vrednostima?
-
Koja je razlika između
COUNT(*)iCOUNT(kolona)? -
Šta radi klauzula HAVING?
-
Da li funkcija AVG uzima u obzir NULL vrednosti?