21-30. 01. Poređenje vrednosti podupita pomoću operatora poređenja
Podupit (subquery) predstavlja SQL upit koji je smešten unutar drugog, glavnog upita. U zavisnosti od rezultata koji vraćaju, podupiti mogu biti različitih tipova. U okviru ove lekcije poseban akcenat stavlja se na podupite koji vraćaju jednu jedinu vrednost.
Podupiti koji vraćaju jednu vrednost
Podupit koji vraća jednu vrednost naziva se skalarni podupit. Najčešće koristi agregatne funkcije kao što su AVG (izračunavanje prosečne vrednosti), MIN (pronalaženje najmanje vrednosti), MAX (pronalaženje najveće vrednosti), COUNT (brojanje redova), SUM (sabiranje vrednosti).
Pošto rezultat ovakvog podupita predstavlja jednu jedinu vrednost, on se može koristiti u poređenju sa vrednostima iz kolona glavnog upita.
Operator poređenja u kombinaciji sa podupitima
Operatori poređenja omogućavaju upoređivanje vrednosti iz tabele sa vrednošću koju vraća podupit.
Podupit se u ovakvim slučajevima najčešće nalazi u WHERE delu SQL naredbe i uvek je zapisan u zagradama.
Opšti oblik SQL naredbe je:
SELECT kolone
FROM tabela
WHERE kolona operator (SELECT ...);
Najčešće korišćeni operatori su: = (jednako), > (veće od), < (manje od), >= (veće ili jednako), <= (manje ili jednako), <> (različito)
Napomena: Operatori poređenja se mogu koristiti samo u kombinaciji sa podupitima koji vraćaju jednu vrednost. Ukoliko podupit vrati više redova, dolazi do greške u izvršavanju upita, jer SQL ne može da izvrši poređenje jedne vrednosti sa skupom više vrednosti pomoću osnovnih operatora poređenja. Zbog toga se u praksi najčešće koriste agregatne funkcije koje garantuju da će rezultat podupita biti jedna vrednost.
Tabela koju koristimo
SQL upiti za kreiranje i popunjavanje tabele Zaposleni koja će biti korišćena u primerima:
Kreiranje tabele Zaposleni
CREATE TABLE Zaposleni (
ID INT PRIMARY KEY,
Ime VARCHAR(50),
Plata INT,
Odeljenje VARCHAR(30)
);
Popunjavanje tabele podacima
INSERT INTO Zaposleni (ID, Ime, Plata, Odeljenje) VALUES
(1, 'Ana', 60000, 'IT'),
(2, 'Marko', 55000, 'IT'),
(3, 'Ivana', 48000, 'HR'),
(4, 'Petar', 70000, 'IT'),
(5, 'Jelena', 48000, 'HR');
Primer 1: Plata veća od prosečne
Čest zahtev u praksi jeste pronalaženje zaposlenih čija je plata veća od prosečne plate svih zaposlenih. Da bi se ovaj zadatak rešio, prvo je potrebno izračunati prosečnu platu, a zatim izvršiti poređenje.
SELECT Ime, Plata
FROM Zaposleni
WHERE Plata > (SELECT AVG(Plata) FROM Zaposleni);
U ovom primeru podupit računa prosečnu platu, dok glavni upit prikazuje samo one zaposlene čija je plata veća od dobijene vrednosti.
Primer 2: Plata manja od maksimalne vrednosti
Podupiti se često koriste i za poređenje sa ekstremnim vrednostima u tabeli. Sledeći primer prikazuje zaposlene koji nemaju najveću platu.
SELECT Ime, Plata
FROM Zaposleni
WHERE Plata < (SELECT MAX(Plata) FROM Zaposleni);
Podupit pronalazi najveću platu, a glavni upit izdvaja sve zapise čija je plata manja od te vrednosti.
Primer 3: Zaposleni sa minimalnom platom
Korišćenjem operatora jednako i agregatne funkcije MIN moguće je pronaći zaposlenog ili više zaposlenih sa najmanjom platom.
SELECT Ime, Plata
FROM Zaposleni
WHERE Plata = (SELECT MIN(Plata) FROM Zaposleni);
Primer 4: Poređenje sa prosečnom vrednošću
Operator različito omogućava izdvajanje zapisa čije se vrednosti razlikuju od izračunate prosečne vrednosti.
SELECT Ime, Plata
FROM Zaposleni
WHERE Plata <> (SELECT AVG(Plata) FROM Zaposleni);
Ovakvi upiti se koriste kada je potrebno isključiti zapise koji imaju tačno određenu referentnu vrednost.
Napomena
Kod korišćenja operatora poređenja sa podupitima neophodno je voditi računa da podupit vraća tačno jednu vrednost. Ukoliko podupit vrati više redova, SQL server neće moći da izvrši poređenje i doći će do greške. Zbog toga se u praksi najčešće koriste agregatne funkcije koje garantuju jedan rezultat.
Takođe, tip podatka koji vraća podupit mora biti kompatibilan sa tipom podatka kolone sa kojom se poredi.
Greške u radu sa podupitima najčešće nastaju usled neusklađenosti tipova podataka, zaboravljenih zagrada oko podupita ili pogrešnog pretpostavljanja da će podupit vratiti samo jedan rezultat.
Zadaci za samostalan rad
-
Napisati SQL upit koji prikazuje zaposlene čija je plata veća od minimalne plate.
-
Prikazati zaposlene čija je plata manja ili jednaka prosečnoj plati.
-
Pronaći zaposlene koji imaju istu platu kao zaposleni sa najvećom platom.