17.03. Podupiti ... nastavljamo ispitivanje priadnosti skupu
Da ponovimo: SELECT iskaz se može umetnuti unutar upita i tako formirati PODUPIT.
1. Podupiti koji vraćaju jednu vrednost (ponavljamo)
Na primer, ako je iz tabele Radnik potrebno dobiti imena svih radnika koji imaju istog nadređenog kao i Cica:
SELECT Ime
FROM Radnik
WHERE sifraNadredjenog =
(SELECT sifraNadredjenog
FROM Radnik
WHERE Ime='Cica' )
Rezultat podupita se prosleđuje nazad - glavnom upitu. Redosled je sledeći: Prvo se izvršava podupit koji kao razultat vraća broj koji je šifra nadređenog za radnika sa imenom Cica. Zatim se ovaj rezultat prosleđuje glavnom upitu i kao rezultat
se dobiju imena svih radnika koji imaju za šefa onoga sa zadatom vrednosti sifraNadredjenog (ono što je vratio podupit).
2. Podupiti koji vraćaju GRUPU VREDNOSTI (ponavljanje+novo)
Podupit ne mora da vrati samo jednu vrednost. Nekad je potrebno da podupit vrati više vrednosti. Ono na šta treba jako obratiti pažnju je da se ne može direktno porediti jedna vrednost sa skupom vrednosti. Na raspolaganju imamo sledeće opcije:
- IN - proverava da li postoji neka vrednost u grupi vrednosti koju vraća podupit
- ALL/ANY - proverava da li postoji nešto (neka povezanost) za svakog/ijednog člana skupa nekih vrednosti (koje vraća podupit)
- EXISTS - proverava se da li nešto upošte postoji ili ne u nekoj grupi vrednosti (i da li je ta grupa vrednosti prazna ili ne)
2.1 (NOT) IN
Upotrebom IN se proverava da li data vrednost postoji u grupi vrednosti
SELECT <kolone>
FROM <tabele>
WHERE <vrednosti>
IN <skup>
NOT IN proverava da li ne postoji data vrednost u grupi vrednosti
SELECT <kolone>Ta grupa vrednosti može da bude zadata u obliku podupita, ali može i da se zada direktno.
FROM <tabele>
WHERE <vrednosti>
NOT IN <skup>
Na primer: Ako je potrebno prikazati sve što se ima o svim radnicima kojima šef nije sa šifrom 799 niti 82:
SELECT * FROM Radnik WHERE sifraNadredjenog NOT IN (799, 82);Ili, kao drugi primer, ako je potrebno da se prikažu samo šifra i ime radnika kao i šifra njegovog šefa, kojima je šef SIMA:
SELECT sifraRadnika, Ime, sifraNadredjenogKao primer za NOT IN biće primer kada želimo da nam se ispišu ti isti podaci, ali za radnike kojima se šef ne zove Sima:
FROM Radnik
WHERE sifraNadredjenog IN
(SELECT sifraRadnika FROM Radnik WHERE Ime='Sima');
SELECT sifraRadnika, Ime, sifraNadredjenogili gde šifra nadređenog nije u zadatom skupu:
FROM Radnik
WHERE sifraNadredjenog NOT IN
(SELECT sifraRadnika FROM Radnik WHERE Ime='Sima');
SELECT * FROM Radnik WHERE sifraNadredjenog NOT IN (799, 82);
2.2. ANY i ALL
ANY i ALL služe za poređenje neke vrednosti sa skupom vrednosti koji sledi nakon operatora.
Koriste se sa operatorima poređenja kao što su =, <, >, <=, >=, <>
Izraz: vrd = ANY (skup) će biti zadovoljen (istinit) ako postoji makar jedan član skupa koji je vrednosti vrd.
Izraz: vrd = ALL (skup) će biti zadovoljen ako su SVI članovi skupa sa vrednošću vrd.
Na primer: Napisati upit kojim će da se dobiju imena radnika koji imaju najveću platu:
SELECT Ime FROM Radnikili, napisati imena radnika koji zarađuju više od bilo kojeg upravnika:
WHERE Plata >= ALL (SELECT Plata FROM Radnik);
SELECT Ime FROM Radnik
WHERE Plata > ANY (SELECT Plata FROM Radnik WHERE radnoMesto='upravnik');
2.3. (NOT) EXISTS
EXISTS se upotrebljava kada se želi proveriti da li postoji makar jedan element u skupu koji je naveden nakon toga.
SELECT <kolone>
FROM <tabele>
WHERE EXISTS <skup>
NOT EXISTS će bit zadovoljen ako je skup parazan.
SELECT <kolone>Skup koji ide nakon EXISTS ili NOT EXISTS se uvek definiše podupitom.
FROM <tabele>
WHERE NOT EXISTS <skup>
2.4. Podupit može da vraća VIŠE ATRIBUTA
Na primer, ako želimo da dobijemo spisak radnika koji imaju istu platu i isto radno mesto kao i Sima:
SELECT Ime, radnoMesto, Plata FROM Radnik
WHERE (radnoMesto, Plata) =
(SELECT radnoMesto, Plata FROM Radnik WHERE Ime='Sima')
AND Ime != 'Sima';
U ovakvim slučajevima se spisak izabranih atributa mora staviti u zagrade.
Resursi korišćeni na času:
Prezentacija sa: https://www.ucg.ac.me/skladiste/blog_5742/objava_16020/fajlovi/Lekcija8_SQL_SELECT__II_dio_.pdf
za ponavljanje: slajdovi 13-15
glavni deo: slajdovi 16, 17, .. sa primerima na 18-20
slajd 21 ... sa primerima na 22-23
slajd 25 ... sa primerom na 26