Ispitivanje postojanja pomoću EXISTS
U radu sa bazama podataka često se javlja potreba da se proveri da li određeni podaci postoje u bazi, bez obzira na njihov tačan broj ili konkretne vrednosti. U takvim situacijama ne interesuje nas sadržaj podataka, već samo informacija da li postoji bar jedan zapis koji zadovoljava određeni uslov. Za ovu svrhu u SQL jeziku koristi se operator EXISTS.
Operator EXISTS omogućava ispitivanje postojanja zapisa koje vraća podupit. Ako podupit vrati bar jedan red, uslov sa EXISTS se smatra ispunjenim. Ako podupit ne vrati nijedan red, uslov nije ispunjen.
Šta ako želimo da proverimo da li određeni podaci postoje, a ne da ih i prikažemo? Na primer:
- da li postoji učenik koji ima bar jednu ocenu,
- da li neki kupac ima bar jednu porudžbinu,
- da li postoji zaposleni koji radi u određenom odeljenju.
Za ovakve provere u SQL jeziku koristi se operator EXISTS. On omogućava da proverimo postojanje barem jednog zapisa koji zadovoljava određeni uslov.
Operator EXISTS je logički operator u SQL-u koji vraća:
-
TRUE (tačno) – ako podupit vrati bar jedan red,
-
FALSE (netačno) – ako podupit ne vrati nijedan red
Napomena 👉 EXISTS ne zanima koje vrednosti se vraćaju, već samo da li postoji bar jedan rezultat.
Za razliku od operatora ALL i ANY, operator EXISTS ne poredi vrednosti. Njega ne zanima kolone koje se vraćaju, već samo činjenica da li podupit vraća rezultate. Zbog toga se u podupitu najčešće koristi oblik SELECT
1 ili SELECT *, jer konkretne kolone nisu bitne.
Kreiranje baze i tabela koje se koriste u lekciji
CREATE DATABASE SkolaDB;
GO
USE SkolaDB;
GO
CREATE TABLE Ucenik (
UcenikID INT PRIMARY KEY,
Ime NVARCHAR(50),
Prezime NVARCHAR(50),
Odeljenje NVARCHAR(10)
);
CREATE TABLE Ocena (
OcenaID INT PRIMARY KEY,
UcenikID INT,
Predmet NVARCHAR(50),
Ocena INT,
FOREIGN KEY (UcenikID) REFERENCES Ucenik(UcenikID)
);
INSERT INTO Ucenik VALUES (1, 'Marko', 'Markovic', 'III-1');
INSERT INTO Ucenik VALUES (2, 'Ana', 'Petrovic', 'III-1');
INSERT INTO Ucenik VALUES (3, 'Jovan', 'Ilic', 'III-2');
INSERT INTO Ocena VALUES (1, 1, 'Matematika', 5);
INSERT INTO Ocena VALUES (2, 1, 'Informatika', 4);
INSERT INTO Ocena VALUES (3, 2, 'Matematika', 3);
Napomena: Učenik Jovan nema nijednu ocenu.
Osnovna sintaksa EXISTS
SELECT kolone
FROM tabela
WHERE EXISTS (podupit);
Zapamtite:
EXISTSse uvek koristi sa podupitom- podupit se izvršava za svaki red spoljašnjeg upita
- čim se pronađe jedan odgovarajući red, rezultat je TRUE
Primer 1 – Pronaći učenike koji imaju bar jednu ocenu
SELECT *
FROM Ucenik u
WHERE EXISTS (
SELECT *
FROM Ocena o
WHERE o.UcenikID = u.UcenikID
);
Objašnjenje:
Za svakog učenika:
-
SQL proverava da li postoji bar jedna ocena
-
Ako postoji → učenik se prikazuje
-
Ako ne postoji → učenik se preskače
Rezultat:
-
Marko
-
Ana
Jovan se ne prikazuje.
NOT EXISTS – suprotan slučaj
SELECT *
FROM Ucenik u
WHERE NOT EXISTS (
SELECT *
FROM Ocena o
WHERE o.UcenikID = u.UcenikID
);
Rezultat:
-
Jovan
Zadatak 1: Prikazati učenike koji imaju ocenu iz Matematike.
SELECT *
FROM Ucenik u
WHERE EXISTS (
SELECT *
FROM Ocena o
WHERE o.UcenikID = u.UcenikID
AND o.Predmet = 'Matematika'
);
Zadatak 2: Prikazati učenike koji nemaju ocenu iz Informatike.
SELECT *
FROM Ucenik u
WHERE NOT EXISTS (
SELECT *
FROM Ocena o
WHERE o.UcenikID = u.UcenikID
AND o.Predmet = 'Informatika'
);
...