Poređenje svih vrednosti podupita pomoću ALL
U radu sa bazama podataka često se dešava da podupit ne vraća samo jednu vrednost, već skup više vrednosti. U takvim situacijama klasični operatori poređenja, kao što su =, < ili >, nisu dovoljni, jer SQL ne može direktno da uporedi jednu vrednost sa više rezultata. Da bi se ovakav problem rešio, koriste se posebni operatori, među kojima je i operator ALL.
Operator ALL omogućava poređenje jedne vrednosti sa svim vrednostima koje vraća podupit. Glavni uslov da bi poređenje bilo tačno jeste da izraz u glavnom upitu zadovoljava uslov poređenja u odnosu na svaki pojedinačni rezultat podupita.
Značenje operatora ALL
Kada se koristi operator ALL, SQL proverava da li je uslov ispunjen za sve vrednosti koje vraća podupit. Drugim rečima, rezultat će biti prikazan samo ako je poređenje tačno u odnosu na svaku vrednost iz skupa podataka koji podupit vraća.
Opšti oblik SQL naredbe sa operatorom ALL je:
SELECT kolone
FROM tabela
WHERE kolona operator ALL (SELECT kolona FROM tabela);
Ako makar jedna vrednost iz podupita ne zadovoljava uslov, poređenje neće biti ispunjeno.
Primer baze podataka
Koristi se tabela Zaposleni sa sledećim kolonama: ID, Ime, Plata, Odeljenje (kao iz prethodne lekcije)
... (iste kao u prethodnoj lekciji) ... : pogledaj ako ih nema u bazi
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'),
(6, 'Milovan', 77000, 'Nabavke'),
(7, 'Sima', NULL, NULL);
Primer 1: Plata veća od svih plata u drugom odeljenju
Zadatak je pronaći zaposlene čija je plata veća od svih plata zaposlenih u odeljenju HR.
SELECT Ime, Plata
FROM Zaposleni
WHERE Plata > ALL (
SELECT Plata
FROM Zaposleni
WHERE Odeljenje = 'HR'
);
U ovom primeru, plata zaposlenog iz glavnog upita mora biti veća od svake pojedinačne plate zaposlenih iz odeljenja HR.
Primer 2: Plata manja od svih plata u IT odeljenju
Sledeći primer prikazuje zaposlene čija je plata manja od svih plata zaposlenih u IT odeljenju.
SELECT Ime, Plata
FROM Zaposleni
WHERE Plata < ALL (
SELECT Plata
FROM Zaposleni
WHERE Odeljenje = 'IT'
);
Ovakav upit se koristi kada je potrebno pronaći zaposlene koji imaju nižu platu od svakog zaposlenog u određenoj grupi.
Primer 3: Veće ili jednako svim vrednostima
Operator ALL može se kombinovati i sa drugim operatorima poređenja, kao što su >= ili <=.
SELECT Ime, Plata
FROM Zaposleni
WHERE Plata >= ALL (
SELECT Plata
FROM Zaposleni
WHERE Odeljenje = 'IT'
);
Ovaj upit pronalazi zaposlenog ili zaposlene sa najvećom platom u IT odeljenju.
Napomene
-
Podupit korišćen uz ALL mora vratiti jednu kolonu, ali može vratiti više redova.
-
Operator ALL se uvek koristi zajedno sa operatorima poređenja.
-
Ako podupit ne vrati nijedan red, rezultat poređenja zavisi od SQL sistema, ali se u našim primerima najčešće pretpostavlja da podupit vraća barem jednu vrednost.
Razlika između ALL i klasičnog poređenja
Kod klasičnog poređenja sa podupitom koji vraća jednu vrednost, poređenje se vrši samo sa tom jednom vrednošću. Kod operatora ALL, poređenje se vrši sa svim vrednostima koje podupit vraća.
Zadaci za samostalan rad
-
Pronaći zaposlene čija je plata veća od svih plata zaposlenih u HR odeljenju.
-
Prikazati zaposlene čija je plata manja ili jednaka svim platama zaposlenih u IT odeljenju.
-
Napisati upit koji pronalazi zaposlenog sa najvećom platom u HR odeljenju korišćenjem operatora ALL.