Ugnježdeni upiti

use STUDIJE
go

UGNJEZDENI UPITI (BEZ KORELISANIH)

  • Spisak nastavnika koji nisu angažovani.
select *
from nastavnici
where Snast not in (select snast from Angazovanje)
  • Svi studenti koji dolaze iz gradova iz kojih je došlo više od 2 studenta
select *
from nastavnici
where Snast not in (select snast from Angazovanje)
  • Broj indeksa, godina upisa, ocena studenata čije su ocene manje od svih ocena koje je dao nastavnik sa “s” u imenu. (ALL, ANY)

I način

select indeks, upisan, ocena
from prijave
where ocena < all (
    select ocena
    from prijave where
    Snast = ANY (
        select snast
        from Nastavnici
        where Imen like '%s%'
        )
    )

II način (ALL, IN)

select indeks, upisan, ocena
from prijave
where ocena < all (
    select ocena
    from prijave where
    Snast in (
        select snast
        from Nastavnici
        where Imen like '%s%'
        )
    )

KORELISANI UGNJEZDENI UPITI

  • Spisak nastavnika i predmeta (samo šifre) koji dele predmet sa još nekim

I način (IN)

select Snast, Spred
from Angazovanje a1
where Spred in (
    select Spred
    from Angazovanje a2
    where a1.Snast <> a2.Snast
    )

II način (EXISTS)

EXISTS

Sintaksa:

	WHERE [NOT] EXISTS ( pod-upit );

pod-upit - predstavlja SELECT upit koji ako vrati najmanje jednu n-torku u svom rezultujućem setu klauzula EXISTS će se oceniti kao TRUE, u suprotnom, ako ne vrati ni jednu n-torku EXISTS klauzula će se oceniti kao FALSE.

Napomena: SQL upiti koji koriste EXISTS uslov su veoma neefikasni jer pod-upit se izvrsava za svaki red u spoljašnjem upitu.

select a1.Snast, a1.Spred from Angazovanje a1
where exists (
    select *
    from Angazovanje a2
    where a1.Snast <> a2.Snast and a1.Spred = a2.Spred
    )
  • Spisak nastavnika koji nisu angažovani, drugi nacin - exists
select * from Nastavnici n
where not exists (
    select * f
    from Angazovanje a
    where a.Snast = n.Snast
    )
  • Spisak studenata koji imaju bar jedan polozen ispit
select * from Studenti s
where exists (
    select *
    from Prijave p
    where ocena > 5 and s.Indeks = p.Indeks and p.Upisan = s.Upisan
    )
  • Spisak studenata koji imaju prosek veci od 7.5
select * from Studenti s
where exists (
    select Indeks, Upisan
    from prijave
    where ocena > 5 and s.Indeks = Indeks and s.Upisan = Upisan
    group by Indeks, Upisan -- da li grupisanje moze da se izbaci ?!
    having avg(ocena * 1.0) > 7.5
    )