create database Radnici

use Radnici


-- 2.

-- Kreiraj tabelu Radnici
create table Radnici
(
	id int not null, --kolona ne moze imati NULL vrednosti
	ime nvarchar(20) not null,
	prezime nvarchar(20) not null,
	jmbg char(13) null -- kolona moze imati NULL vrednosti
)

-- 3.

-- Upisivanje podataka u tabelu
insert into Radnici (id, ime, prezime, jmbg) values (1, 'Radisa', 'Radnik', '0101999720000')

select * from Radnici


-- 4.

-- Kolone koje mogu imati null vrednosti se mogu izostaviti u insert komandi
insert into Radnici (id, ime, prezime) values (1, 'Radisa', 'Radnik')

select * from Radnici


-- 5.


-- Brisanje kolone id
alter table Radnici drop column id

select * from Radnici

-- Dodavanje kolone u vec postojecu tabelu sa auto incrementom

/*
	IDENTITY [ (seed , increment) ]

	Argumenti

	seed
	Is the value that is used for the very first row loaded into the table.

	increment

	Is the incremental value that is added to the identity value of the previous row that was loaded.
	You must specify both the seed and increment or neither. If neither is specified, the default is (1,1).

*/

alter table Radnici add id int identity(1,1)


-- Kolone imaju osobinu identity se ne mogu insertovati kada je fleg IDENTITY_INSERT setovan na OFF sto je njegova default vrednost
insert into Radnici (id, ime, prezime) values (1, 'Radisa', 'Radnik') -- ovaj upit ce baciti gresku

insert into Radnici (ime, prezime) values ('Radisa', 'Radnik') -- ispravan upit
insert into Radnici (ime, prezime) values ('Mika', 'Radnik1') 
insert into Radnici (ime, prezime, jmbg) values ('Zika', 'Radnik2', '0000000123456') 

select * from Radnici -- svi dodati redovi za id imaju automatski dodeljenu vrednost


-- 6.


-- Dodavanje primarnog kljuca na kolonu id tabele Radnici
alter table Radnici add constraint pk_radnici primary key (id)



-- 7.

create table Angazovanja
(
	id int not null,
	id_radnika int not null,
	id_sektora int not null
)

 alter table Angazovanja add constraint pk_angazovanja primary key (id)

insert into Angazovanja(id, id_radnika, id_sektora) values (11, 10, 2)
insert into Angazovanja(id, id_radnika, id_sektora) values (11, 10, 2) -- greska jer id vrednost 11 vec postoji

select * from Angazovanja


-- 8.


-- Sa trenutnim ogranicenjima mozemo insert-ovati proizvoljan id radnika, a to je lose jer bi trebalo da 
-- mozemo da insertujemo samo one id-eve koji postoje u tabeli radnici

select * from Angazovanja
select * from Radnici

-- Strani kljuc
alter table Angazovanja add constraint fk_id_radnika
	foreign key (id_radnika) references Radnici(id)

delete from Angazovanja where id = 11

alter table Angazovanja add constraint fk_id_radnika
	foreign key (id_radnika) references Radnici(id)

insert into Angazovanja(id, id_radnika, id_sektora) values (11, 10, 2) -- radnik sa id-em 10 ne postoji

--ispravno
select * from Radnici
insert into Angazovanja values (1, 4, 4) -- Angazovan je radnik Zika, koji postoji u tabeli Radnici


select * from Radnici
select * from Angazovanja


--9. 


delete from Angazovanja where 1 = 1 -- izbrisi sve


-- 10. 

insert into Radnici(id, ime, prezime, jmbg) values (50, 'Jovan', 'Jovanovic', null) -- greska, id ima osobinu identity a fleg IDENTITY_INSERT je setovan na OFF

SET IDENTITY_INSERT Radnici on -- Omoguci eksplicitno upisivanje podataka i za id

insert into Radnici(id, ime, prezime, jmbg) values (50, 'Jovan', 'Jovanovic', null) --Sada moramo da postojuemo jedinstvenost kolone id, tj ne mozemo da upisemo vrednost koja vec postoji

select * from Radnici

-- 11.

SET IDENTITY_INSERT Radnici off -- ONEMOGUCI eksplicitno upisivanje podataka za id

insert into Radnici
SELECT  Imen, Imen, convert(varchar(2),Snast) + '12345678901'
FROM studije.dbo.Nastavnici

select * from Radnici

-- 12.

--update
update radnici 
set prezime = 'Nepoznato'  
where id > 3

select * from Radnici

delete from Radnici where prezime != 'Nepoznato'

select * from Radnici


-- 13.

insert into Angazovanja values (22,50, 1)

select * from Radnici
select * from Angazovanja


delete from Radnici where id = 50 -- Ne moze se obrisati jer se id 50 pojavljuje u tabali Angazovanja


-- 14. Kaskadno brisanje (ako iz tabele Radnici izbrisemo radnijka sa id-em 50, izbrisace se
--     i redovi u svim tabelama sa kojima je on povezan preko svog id-a)

alter table Angazovanja drop constraint fk_id_radnika -- Izbrisi staro ogranicenje stranog kljuca

alter table Angazovanja add constraint fk_id_radnika -- dodaj novo ogranicenje stranog kljuca
	foreign key (id_radnika) references Radnici(id) ON delete cascade

delete from Radnici where id = 50 

select * from Radnici
select * from Angazovanja


-- 15.

-- pocetak while naredbe

declare @i int -- deklaracija promenljive tipa int
set @i = 1     -- setuj njenu pocetnu vrednost

while @i < 10000 -- sve dok je vrednost promenljive i manja od 10000
begin
	insert into Radnici values (CONCAT(@i, 'mile'), 'neko', null) -- upisi podatke u tabelu Radnici
	set @i = @i + 1 -- Povecaj vrednost promenljive za 1
end

-- kraj while naredbe

select count(*) from radnici

select * from Radnici where ime = '55mile'

-- 16

	/* 
	
		FUNKCIJE

	*/

use STUDIJE


-- Kreiranje funkcije
create function prosek(@brojInd int, @godUpisan int)
returns decimal(6,2)
as
begin
	declare @p decimal(6,2)

	select @p = avg(Ocena * 1.0)
	from Prijave
	where Indeks = @brojInd and Upisan = @godUpisan and Ocena > 5

	return @p
end


-- Izvrsavanje funkcije

--16.1.
select dbo.prosek(2, 2001)

--16.2
declare @prosek_studenta decimal(6,2)
set @prosek_studenta = dbo.prosek(2,2001)

select @prosek_studenta

--16.3
select Indeks, Upisan, dbo.prosek(Indeks, Upisan) as 'Prosecna ocena'
from Studenti

--16.4
select indeks, upisan, imes
from Studenti
where dbo.prosek(indeks, upisan) > 9.0

-- 17. Funkcija koja vraca tabelu predmeta na smeru

create function predmeti_na_smeru(@smer int)
returns table
as
  return (select Spred, Semestar
           from Planst
		   where Ssmer = @smer)

go

select *
from predmeti_na_smeru(1)


/*

	PROCEDURE
	
*/

-- 18 Kreirati proceduru za unos nove prijave

create procedure unos_nove_prijave(@brInd int, @godUpisa int, @spred int, @snast int)
as
begin
	insert into Prijave(Indeks, Upisan, Spred, Snast, Datump)
	   values(@brInd, @godUpisa, @spred, @snast, GETDATE())
end

-- * Ne mogu se koristiti u select, having i where delovima
-- * Pomocu njih mozemo da radimo insert, update i delete nad podacima

-- nacin pozivanja

exec unos_nove_prijave 2, 2002, 1, 2


select * from Prijave where Indeks = 2 and Upisan = 2002 --PROVERA



-- 19 - Procedure sa vise povratnih tipova

create procedure vise_povratnih(@prva int output, @druga int output, @treca int)
as
begin
	set @prva = @treca - 2
	set @druga = @treca - 1
end


-- I poziv bez 'output' - vrednosti @izlaz_prva, @izlaz_druga ce biti null

declare @izlaz_prva int
declare @izlaz_druga int

exec vise_povratnih @prva=@izlaz_prva , @druga = @izlaz_druga , @treca = 5
select @izlaz_prva, @izlaz_druga


-- II poziv - sa 'output' - vrednosti @izlaz_prva, @izlaz_druga ce biti 3 i 4

declare @izlaz_prva int
declare @izlaz_druga int

exec vise_povratnih @prva=@izlaz_prva output, @druga = @izlaz_druga output, @treca = 5
select @izlaz_prva, @izlaz_druga
