﻿use STUDIJE
go

--UGNJEZDENI UPITI (BEZ KORELISANIH)

-- 1. spisak nastavnika koji nisu anga�ovani.
   
	select *
	from nastavnici
	where Snast not in (select snast from Angazovanje)

-- 2. svi studenti koji dolaze iz gradova iz kojih je doslo vise od 2 studenta

	select *
	from nastavnici
	where Snast not in (select snast from Angazovanje)

-- 3. Broj indeksa, godina upisa, ocena studenata cije su ocene manje od svih ocena koje je dao nastavnik sa "s" u imenu. (ALL, ANY)

-- I nacin

	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 nacin (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

-- 4. spisak nastavnika i predmeta (samo sifre) koji dele predmet sa jos nekim

-- I nacin (IN)

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

-- II nacin (EXISTS)

/******************************** EXISTS ****************************

Sintaksa:

	WHERE [NOT] EXISTS ( pod-upit );

pod-upit
	Predstavlja SELECT upit koji ako vrati najmanje jednu n-torku u svom rezultujucem setu
	klauzula EXISTS ce se oceniti kao TRUE, u suprotnom, ako ne vrati ni jednu n-torku
	EXISTS klauzula ce se oceniti kao FALSE.

Napomena: SQL upiti koji koriste EXISTS uslov su veoma neefikasni jer pod-upit se izvrsava za svaki red u spoljasnjem 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
				 )

-- 5. spisak nastavnika koji nisu anga�ovani, drugi nacin - exists

	select * from Nastavnici n
	where not exists (
						select * f
						rom Angazovanje a 
						where a.Snast = n.Snast
					 )

-- 6. 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
				 )

-- 7. 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
				 )
