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>
FROM <tabele>
WHERE <vrednosti>
NOT IN <skup>
Ta grupa vrednosti može da bude zadata u obliku podupita, ali može i da se zada direktno.

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, sifraNadredjenog 
FROM Radnik
WHERE sifraNadredjenog IN
(SELECT sifraRadnika FROM Radnik WHERE Ime='Sima');
Kao 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:

 SELECT sifraRadnika, Ime, sifraNadredjenog 
FROM Radnik
WHERE sifraNadredjenog NOT IN
(SELECT sifraRadnika FROM Radnik WHERE Ime='Sima');
ili gde šifra nadređenog nije u zadatom skupu:

 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 Radnik
WHERE Plata >= ALL (SELECT Plata FROM Radnik);
ili, napisati imena radnika koji zarađuju više od bilo kojeg upravnika:

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>
FROM <tabele>
WHERE NOT EXISTS <skup>
Skup koji ide nakon EXISTS ili NOT EXISTS se uvek definiše podupitom.


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

Last modified: Wednesday, 17 March 2021, 1:03 PM