Operacije nad skupovima (UNION, INTERSECT, EXCEPT)
Koristimo bazu i tabele iz prethodne lekcije.
Ako nemate bazu i tabele iz prethodne lekcije, kreirajte ih pomoću upita iza sledećeg dugmenceta:
Baze i tabele iz prethodne lekcije
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);
Dodati još 3 učenika u tabelu Ucenik:
INSERT INTO Ucenik VALUES
(4, 'Marko', 'Popov', 'III-2'),
(5, 'Ana', 'Vasic', 'III-2'),
(6, 'Jovan', 'Arsic', 'III-3');
U SQL-u možemo tretirati rezultate upita kao matematičke skupove.
1. UNION – Unija
Spaja rezultate dva upita i uklanja duplikate.
Primer:
SELECT Ime FROM Ucenik
WHERE Odeljenje = 'III-1'
UNION
SELECT Ime FROM Ucenik
WHERE Odeljenje = 'III-2';
Dobijamo sve učenike iz odeljenja III-1 i III-2, ali bez duplikata - ne ponavljaju se imena.
2. UNION ALL
Ne uklanja duplikate.
SELECT Predmet FROM Ocena
UNION ALL
SELECT Predmet FROM Ocena;
3. INTERSECT – Presek
Vraća zajedničke rezultate.
Primer: Učenici koji imaju ocenu i iz Matematike i iz Informatike.
SELECT UcenikID
FROM Ocena
WHERE Predmet = 'Matematika'
INTERSECT
SELECT UcenikID
FROM Ocena
WHERE Predmet = 'Informatika';
Rezultat: samo Marko.
4. EXCEPT – Razlika
Vraća rezultate prvog upita koji ne postoje u drugom.
Primer:
SELECT UcenikID
FROM Ocena
WHERE Predmet = 'Matematika'
EXCEPT
SELECT UcenikID
FROM Ocena
WHERE Predmet = 'Informatika';
Rezultat: Ana.
Zadatak 1: Prikazati imena učenika iz oba odeljenja koristeći UNION.
SELECT Ime FROM Ucenik WHERE Odeljenje = 'III-1'
UNION
SELECT Ime FROM Ucenik WHERE Odeljenje = 'III-2';
Zadatak 2: Pronaći učenike koji imaju ocenu iz Matematike, ali nemaju iz Informatike.
SELECT UcenikID
FROM Ocena
WHERE Predmet = 'Matematika'
EXCEPT
SELECT UcenikID
FROM Ocena
WHERE Predmet = 'Informatika';