Pomoc SQL jezik

boss45

Početnik
Poruka
14
Dobio sam za pripremu ispita neki zadat da ga uradim u Query Analyzer-u ali mi nešto ne ide.Zapoceo sam nešto ali mi neke stvari nisu jasne kao na primer kako da definisem 1-za muski pol a 0-za zenski i kako da definisem strani kljuc.Zadatak glasi ovako:

Kreirati bazu Priprema primenom odgovarajuce SQL naredbe.U
bazi kreirati dve tabele:Radnik i Zarade.
Tabela Radnik ima sledeće atribute Prezime,Ime,Maticni broj,Pol(tip bit),
Grad,UlicaiBroj,Telefon,mobilni

Tabela Zarade ima atribute:DatumIsplate,IznosZarade.

U obe tabele potrebno je dodati atribut koji ih jedinstveno identifikuje.
Pored toga u tabeli Zarade potrebno je definisati odgovarajuci strani kljuc
koji ukazuje na kog se radnika odnosi zarada.

Bitsko polje Pol definise se na sledeći način: 1-musko,0-zensko
Primenom INSERT naredbe ubaciti 5 zapisa u obe tabele.

Prikazati sve zapise iz tabele Radnik koje se odnose na osobe muskog pola

Primenom INNER JOIN naredbe prikazati Ime i Prezime radnika,Datum Isplate i
Iznos Zarade.Iznos zarade sortirati u opadajucem poretki.

U tabeli radnik potrebno je ubaciti još 2 osobe muskog pola(Marko,Laza) i 1
osobu zenskog pola(Milena).Ostale podatke proizvoljno definisati

U tabeli zarade ubaciti njihove zarade prema tabeli

--Marko 56,767.34
--Laza 45,456.32
--Milenba 35,456.23

Datum uplata ovih zarada je 15.decembar 2004.
Povecaj zaradu radniku Laza za 25%

Da li neko mogao da mi da kod za ovaj zadatak ili bar da mi barem malo ispravi ovo sto sam ja napisao...Hvala...


Create Database Priprema

Create Table Radnik
(
ID int identity(1,1)Not Null primary Key,
Ime varchar(40)Not Null,
Prezime varchar(40)Not Null,
JMBG char(13)Not Null Unique,
Pol bit Null,
Grad varchar(40)Null Default'Beograd',
UlicaIBroj varchar(50) Not Null,
Telefon varchar(15)Null,
Mobilni varchar(15)Null
)
Create Table Zarade
(
ID_1 int identity(1,1) Not null primary Key,
Datumisplate smalldatetime Not Null,
IznosZarade varchar(50) Not null,
)
Alter Table Zarade
ADD Constraint Fk_ID_1 Foreign Key(ID_1)
REFERENCES Radnik(ID)

Insert Into Radnik (Ime,Prezime,JMBG,Pol,Grad,UlicaIBroj,Telefon,Mobilni)
Values ('Bojan','Milenkovic','1909984710153','1','Beograd','Dr.Ivana Ribara 126','011-1762996','064-2047845')

Insert Into Zarade (datumisplate,Iznoszarade)
Values('12.15.2004','500')


Insert Into Radnik (Ime,Prezime,JMBG,Pol,Grad,UlicaIBroj,Telefon,Mobilni)
Values ('Petar','Peric','1206984710153','1','Beograd','Nemanjina','011-2222222','064-2222222')

Insert Into Zarade (datumisplate,Iznoszarade)
Values('12.15.2004','200')

Insert Into Radnik (Ime,Prezime,JMBG,Pol,Grad,UlicaIBroj,Telefon,Mobilni)
Values ('Milan','Milanovic','1806984710153','1','Beograd','Sarajevska 15','011-1111111','064-333333333')

Insert Into Zarade (datumisplate,Iznoszarade)
Values('11.15.2004','1200')

Insert Into Radnik (Ime,Prezime,JMBG,Pol,Grad,UlicaIBroj,Telefon,Mobilni)
Values ('Ivana','Ivanovic','1306984710153','0','Beograd','Balkanska 15','011-44444444','064-44444444')

Insert Into Zarade (datumisplate,Iznoszarade)
Values('09.12.2004','2200')

Select *
From Radnik
Where pol=1

Select radnik.ime,radnik.prezime,zarade.datumisplate,zarade.iznoszarade
From Radnik
Inner Join zarade
On radnik.ID=zarade.ID_1
Order By iznoszarade DESC
go

Insert Into Radnik (Ime,Prezime,JMBG,Pol,Grad,UlicaIBroj,Telefon,Mobilni)
Values ('Marko','Markovic','0511984710153','1','Beograd','Kneza milosa 58','011-5555555','064-5555555')

Insert Into Zarade (datumisplate,Iznoszarade)
Values('12.15.2004','350')


Insert Into Radnik (Ime,Prezime,JMBG,Pol,Grad,UlicaIBroj,Telefon,Mobilni)
Values ('Laza','Lazic','1104984710153','1','Beograd','Nemanjina','011-2337892','064-5856781')

Insert Into Zarade (datumisplate,Iznoszarade)
Values('12.15.2004','45,456.32')

Insert Into Radnik (Ime,Prezime,JMBG,Pol,Grad,UlicaIBroj,Telefon,Mobilni)
Values ('Milena','Milic','1102981710153','0','Beograd','Sarajevska 59','011-8888888','064-8888888')

Insert Into Zarade (datumisplate,Iznoszarade)
Values('12.15.2004','35,456.23')

update zarade
Set iznoszarade='56,820.4'--Zarada uvecana za 25% prethodna zarada je bila 45,456.32
where ID_1=6

select *
from radnik
select *
from zarade
 
Ovako bih ja radio u Interbase-u. To je naj jednostavniji nacin koji mi je pao napamet u 03:40 ujutru. Analogija je ista, pa nadam se da pomaze.

// kreiram domen da bi imao dve vrednosti(musko/zensko)

CREATE DOMAIN INT_BOOLEAN
AS SMALLINT
DEFAULT 0
NOT NULL
CHECK (VALUE IN (0,1));

CREATE TABLE RADNICI
(
MATICNI_BROJ INTEGER NOT NULL,
IME CHAR(20) NOT NULL,
PREZIME CHAR(20) NOT NULL,
POL INT_BOOLEAN,
GRAD CHAR(20),
ADRESA CHAR(50),
BR_TEL CHAR(15),
BR_MOB CHAR(15),
PRIMARY KEY(MATICNI_BROJ)
);


CREATE TABLE ZARADE
(
ZARADA_ID INTEGER NOT NULL,
MATICNI_BROJ INTEGER NOT NULL,
DATUM_ISPLATE DATE NOT NULL,
IZNOS_ZARADE NUMERIC(15,2),
PRIMARY KEY(ZARADA_ID)
);

insert into RADNICI
(MATICNI_BROJ, IME, PREZIME, POL, GRAD, ADRESA, BR_TEL, BR_MOB)
values
(1, 'PERA', 'PERIC', 1, 'BEOGRAD', 'NEKA ADRESA BR 25', '011/123-456', '063/123-456');

insert into RADNICI
(MATICNI_BROJ, IME, PREZIME, POL, GRAD, ADRESA, BR_TEL, BR_MOB)
values
(2, 'MARKO', 'MRKIC', 1, 'NIS', 'NEKA ADRESA BR 36', '011/111-222', '063/222-456');

insert into RADNICI
(MATICNI_BROJ, IME, PREZIME, POL, GRAD, ADRESA, BR_TEL, BR_MOB)
values
(3, 'LAZA', 'SIMIC', 1, 'NIS', 'NEKA ADRESA BR 11', '011/111-222', '063/222-456');

insert into RADNICI
(MATICNI_BROJ, IME, PREZIME, POL, GRAD, ADRESA, BR_TEL, BR_MOB)
values
(4, 'MILENA', 'DUDIC', 0, 'NIS', 'NEKA ADRESA BR 6', '011/144-222', '063/2233-56');

// Markova zarada:
insert into ZARADE
(ZARADA_ID, MATICNI_BROJ, DATUM_ISPLATE, IZNOS_ZARADE)
values
(1, 2, '15.12.2004', 56767.34);

// Lazina zarada:
insert into ZARADE
(ZARADA_ID, MATICNI_BROJ, DATUM_ISPLATE, IZNOS_ZARADE)
values
(7, 3, '15.12.2004', 45456.32);

//Milenina zarada:
insert into ZARADE
(ZARADA_ID, MATICNI_BROJ, DATUM_ISPLATE, IZNOS_ZARADE)
values
(8, 4, '15.12.2004', 35456.23);


// prikazujem sve radnike muskog pola:
SELECT * FROM RADNICI WHERE POL = 1;

//radnici i zarade u opadajucem redosledu po iznosu
SELECT RADNICI.IME, RADNICI.PREZIME,ZARADE.DATUM_ISPLATE, ZARADE.IZNOS_ZARADE FROM RADNICI
INNER JOIN ZARADE
ON RADNICI.MATICNI_BROJ = ZARADE.MATICNI_BROJ
ORDER BY IZNOS_ZARADE DESC;

// uvecavam zaradu za 25% radniku sa maticnim brojem 3 tj Lazi
UPDATE ZARADE
SET
IZNOS_ZARADE = IZNOS_ZARADE * 1.25
WHERE
MATICNI_BROJ = 3;

Pozdrav...
 
Nije bas najpreciznije:
u prvom primeru kad ubacujes zaradu ne kazes za kog radnika, moras da dodas u insertu njegov skriveni kljuc u polje koje si prethodno dodao u tabelu zarade. Ali nemoj eksplicitno da kazes recimo broj 3, nego select ID from radnik where ime = 'Laza', naravno onda to ime mora biti unique da ti ne bi podupit vratio vise od jednog upita.Kad god se trazi nesto za recimo Peru, umesto broja njegovog ID-a stavi podupit kao gore. To je bitno jer ako se obrise neki radnik pa se ponovo ubaci nece imati isti ID.
Strani kljuc treba da bude definisan kao 'on delete parent cascade' ( ili neka slicna sintaksa, proveri kod sebe), da bi se obrisale zarade kad se brise radnik.
U drugom primeru ne vidim gde je definisan strani kljuc sto je trazeno u zadatku, a za referisanje na radnika vazi isto kao i gore.
 
Garwor:
Nije bas najpreciznije:
u prvom primeru kad ubacujes zaradu ne kazes za kog radnika, moras da dodas u insertu njegov skriveni kljuc u polje koje si prethodno dodao u tabelu zarade. Ali nemoj eksplicitno da kazes recimo broj 3, nego select ID from radnik where ime = 'Laza', naravno onda to ime mora biti unique da ti ne bi podupit vratio vise od jednog upita.Kad god se trazi nesto za recimo Peru, umesto broja njegovog ID-a stavi podupit kao gore. To je bitno jer ako se obrise neki radnik pa se ponovo ubaci nece imati isti ID.
Strani kljuc treba da bude definisan kao 'on delete parent cascade' ( ili neka slicna sintaksa, proveri kod sebe), da bi se obrisale zarade kad se brise radnik.
U drugom primeru ne vidim gde je definisan strani kljuc sto je trazeno u zadatku, a za referisanje na radnika vazi isto kao i gore.

Pogledaj ponovo, sto se tice Insert-a u tabeli zarade:
insert into ZARADE
(ZARADA_ID, MATICNI_BROJ, DATUM_ISPLATE, IZNOS_ZARADE)
values
(1, 2, '15.12.2004', 56767.34);

Vrednost u ovoj tabeli broj 2 (maticni broj) ukazuje upravo da se radi o radniku broj 2 odnosno Marku, jer on ima polje pod PRIMARNIM KLJUCEM u tabeli RADNICI (koje ne moze da se ponovi). Ovaj upit sam mogao da ponovim jos x puta (naravno uz uvecanje vrednosti polja "ZARADA_ID" koje je takodje pod PRIMARNIM KLJUCEM i ne sme da se ponovi) i onda bi se sve zarade odnosile na Markove. Isto vazi i za ostale zaposlene.
Drugo, ime mora da se ostavi da moze da se ponavlja - ne sme da bude UNIQUE na primer Pera Peric,Pera Simic, Pera Lazic itd... kao i prezime. To su sve razliciti ljudi koji u tabeli Radnici imaju jedinstvene maticne brojeve.
Naravno, podrazumeva se, da ce se ako se obrise odredjeni radnik ponovnim unosom izgubiti taj ID.
Pozdrav...
 
E, u pravu si sto se tice maticnog broja, jeste unique i primary key, nisam pazljivo pogledao :oops: mada bih ja dodao polje radnik_id da bude integer default autoincrement kao primary key. U svakom slucaju zamerka ostaje za primer 1, a ako cemo precizno, trebao sam da napisem
select ID from radnik where jmbg = '1104984710153', ali je sustina ista: ne stavljati ID nego ga dohvatiti podupitom.
U tabeli zarade , primer 2, bolje bi bilo da je zarade_id autoincrement, da se ne bi kod svakog inserta u istu tabelu morao upisivati taj id (sta ako ima puno zarada, treba negde pamtiti taj broj ).
Ostaje primedba za strani kljuc.
 

Back
Top