Professional Documents
Culture Documents
SQL
SQL
UVOD U SQL - SQL Structured Query Language - strukturirani jezik za upite - povjest SQL-a poinje 1970. godine kada je razvijen u IBM-ovom istraivakom laboratoriju u San Joseu-u, California. - slaba razvijenost do 80-tih godina. - 1981. godine SQL/DS a zatim se pojavljuju sustavi baza podataka Oracle i Reational Technology. - do 1989. godine 70-ak razliitih verzija SQL sustava - 1989. godine proirenje standarda pa nastaje SQL-89 uvoenje referencijskog integriteta. - 1992. godine SQL-2 ili SQL-92 proirenje standarda u pisanoj formi ( broj stranica ) vie od 4 puta nego u ranijoj verziji. - 1999. godine objavljen SQL-3 ili SQL-99 s novim mogunostima
Sam SQL opisuje to elimo dobiti kao rezultat, a ne kako doi do toga i to ga svrstava u neproceduralne programske jezike za razliku od npr. C programskog jezika. SQL je stvoren za rad sa relacijskim bazama podataka za koje dr. Codd 1970. godine iznosi 12 Coddovih pravila ( objavljenih u lanku A Relational of Data for Large Shared Data Banks ). SQL omoguava da tvorimo i promjenimo strukturu baze podataka, dodamo prava korisniku za pristup bazama podataka ili tablicama, da traimo informacije od baze podataka i da mjenjamo sadraj baze podataka. Za to imamo dvije vrste funkcija. - DDL ( Data Definition Language ) funkcija za definiciju podataka iji je tipian primjer naredba CREATE TABLE imeTablice(); - DML ( Data Manipulation Table ) funkcija za upravljanje podacima gdje se kao primjer moe navesti osnovna SQL naredba SELECT*FROM imeTablice
- Pristup podacima odvija se prema modelu klijent/posluitelj To je po Bernardu H. Boar autoru knjige Implementing Client/server Computing, definirano kao: Model rada u kojem je jedna aplikacija podjeljena izmeu vie procesa koji komuniciraju (transparentno prema korisnikom kraju) da bi zavrili procesiranje kao jedan jedinstveni zadatak. Klijent/posluitelj model vezuje procese da bi se dobila slika jedinstvenog sustava. Djeljivi resursi su pozicionirani klijenti koji imaju zahtjeve i mogu pristupiti ovlatenim servisima. Arhitektura je beskonano rekurzivna; pa posluitelji mogu postati klijenti i zahtijevati usluge od drugih posluitelja u mrei, itd..
TABLICE
Tablice predstavljaju dvodimenzionalne matrice iji redovi predstavljaju naziv i svojstvo objekata pohranjenih u tablicu, a stupci svojstva objekata izraena odgovarajuim tipom podataka. Uz pomo jedne n-torke opisali smo jedan objekt. npr:
MATINI BROJ IME PREZIME ULICA MJESTO
0102968383911
Pero
Peri
Gajeva 3
Zagreb
0302982383818
Ivan
Ivi
Poega
0305972383915
Marko
Mari
Divaltova 67
Osijek
PRIVREMENE TABLICE Privremene tablice su posebna vrsta tablica. One postoje samo za vrijeme dok smo prijavljeni na server. Koristimo ih za pohranjivanje rezultata nekakvih kompliciranih izraza a te rezultate mislimo koristiti u kasnijim izrazima upita ili kad je potrebno neto napraviti u vie odvojenih koraka. Tipian primjer je kreiranje tablice iste kao neka postojea u naem sluaju tablica osoba. Sada bi na toj novoj tablici mogli objavljivati razliite upite, brisanja, raunanja i na samome kraju to usporediti s neime drugim.
CREATE TABLE
Definiranje nove relacije, odnosno opis njene relacijske sheme (tablice)
U proirenoj sintaksi mogue je definirati ogranienja (CONSTRAINT) PRIMARY KEY (primarni klju tablice) UNIQUE (jedinstveni klju tablice) FOREIGN KEY (strani klju tablice, referencijalni integritet) definira se atribut (ili skup atributa) promatrane tablice koji se referenciraju na primarni klju iste ili neke druge tablice
Primjer:
CREATE TABLE grad( pbr SMALLINT, naziv VARCHAR(50), CONSTRAINT grad_pk PRIMARY KEY(pbr) );
CREATE TABLE stanovnici( jmbg INT, "ime osobe" VARCHAR(30) NOT NULL, "prezime osobe" VARCHAR(30) NOT NULL, pbr SMALLINT, adresa VARCHAR(100) NOT NULL, CONSTRAINT stanovnici_pk PRIMARY KEY(jmbg), CONSTRAINT stanovnici_fk_grad FOREIGN KEY(pbr) REFERENCES grad(pbr) );
grad
pbr naziv
stanovnici
jmbg ime osobe prezime osobe pbr adresa
DROP TABLE
Uklanjanje (brisanje) relacije iz baze podataka Za razliku od DELETE koja izbacuje samo n-torke iz relacije, ova naredba izbacuje i definiciju relacije pa relacija i njena relacijska shema vie ne postoji Sintaksa: DROP TABLE table_name
ALTER TABLE
Izmjena definicije postojee relacije
Dodavanje atributa: ALTER TABLE stanovnici ADD
dat_rod DATETIME;
Uklanjanje atributa: ALTER TABLE radno_mjesto DROP COLUMN broj_zaposlenih; Izmjena postojeih atributa: ALTER TABLE racuni ALTER COLUMN nacin_placanja CHAR(1);
Vlasnik relacije je uvijek korisnik koji ju je definirao naredbom CREATE TABLE, a pravo na izvravaje SQL naredbi i kreiranje objekata vlasnik na druge osobe prenosi naredbom GRANT Za naredbe DDL-a primjeri: GRANT CREATE TABLE, CREATE VIEW TO korisnik; GRANT CREATE PROCEDURE TO korisnik; Za naredbe DML-a primjeri: GRANT SELECT ON student TO stuslu; GRANT SELECT(ime_stud, prez_stud) ON student TO korisnik; GRANT DELETE ON mjesto TO korisnik;
GRANT
REVOKE
Oduzimanje prava korisnicima na izvravanje SQL naredbi i/ili kreiranje objekata (suprotno od naredbe GRANT) Sintaksa za naredbe
REVOKE { ALL | statement [ ,...n ] } FROM security_account [ ,...n ]
Sintaksa za objekte
REVOKE [ GRANT OPTION FOR ] { ALL [ PRIVILEGES ] | permission [ ,...n ] } { [ ( column [ ,...n ] ) ] ON { table | view } | ON { table | view } [ ( column [ ,...n ] ) ] | ON { stored_procedure | extended_procedure } | ON { user_defined_function } } { TO | FROM } security_account [ ,...n ] [ CASCADE ] [ AS { group | role } ]
SELECT
vraca skup rezultata iz zapisa jedne ili vise tablica koristi se za dobijanje nijednog ili vise redaka iz jedne ili vise glavnih tablica, privremenih tablica ili pogleda iz baze podataka pri SELECT upitu korisnik definira opis zeljenog skupa rezultata, ali ne definira koje ce fizicke operacije biti obavljene za dobivanje tog rezultata
naredbe koje se koriste uz SELECT: WHERE definira redove koji se traze GROUP BY koristi se za kombiniranje redova sa srodnim vrijednostima u elemente sa manjim skupom redaka HAVING definira koji se redovi (traze) uz GROUP BY ORDER BY definira koji se stupci koriste za sortiranje rezultata
UPDATE
koristi se za promjenu vrijednosti u postojecem redu ili redovima neki nacini koristenja: UPDATE tablica SET stupac=vrijednost UPDATE tablica SET stupac=vrijednost WHERE neki_uvjet Zadnji primjer pokazuje mijenjanje vrijednosti uz neki uvjet, dakle mozemo staviti npr. WHERE stupac= OR stupac IS NULL tada UPDATE promijeni vrijednosti samo onih redova koji imaju taj stupac prazan
DELETE
koristi se za brisanje podataka neki nacini koristenja: DELETE FROM tablica DELETE FROM tablica WHERE stupac=vrijednost prvi primjer je za brisanje redova u tablici (ne smije biti vezana za neki osnovni/strani kljuc) drugi primjer je za brisanje redova uz uvjet da im je stupac jednak vrijednost
INSERT
koristi se za unosenje podataka u tablicu, red po red; vrijednosti koje se unose moraju biti istog tipa podataka kao polja u koja ih unosimo i moraju odgovarati velicini kolone neki nacini koristenja: INSERT INTO tablica VALUES (vrijednost 1, ... , vrijednost n) INSERT INTO tablica (stupac_1, ... , stupac_n) VALUES (vrijednost 1, ... , vrijednost n)
oba primjera predstavljaju isti kod samo napisan na drugi nacin: za unosenje vrijednosti (od 1 do n) u stupce (od 1 do n) moguce je unositi podatke i koristeci kombinaciju naredbi INSERT i SELECT INSERT INTO tablica SELECT stupac_1, ... ,stupac_n primjer pokazuje kako u tablici dodati podatke iz neke druge tablice
MERGE
koristi se za kombinaciju podataka iz vise tablica vrsta kombinacije INSERT i UPDATE elemenata definirana po SQL:2003 standardima, iako neke baze podataka pruzaju slicnu funkcionalnost preko drugacije sintakse, koja se nekad zove upsert sintaksa koristenja naredbe MERGE: MERGE INTO tablica USING tablica ON (uvjet)
INDEKSI
Ako ne postoji nikakav indeks SQL server pristupa i skladiti podatke za due vremensko razdoblje nego kada postoje indeksi (skup podataka bez indekasa naziva se hrpa). Kod pristupa tako spremljenim podacima, SQL server mora sekvencijalno pretraivati tablicu. Tablici se mogu pridruiti dva tipa indeksa i to grupirajui i negrupirajui. Grupirajui indeksi mjenjaju fiziki raspored podataka u bazi pomou kojega se ubrzava pristup podacima. Negrupirajui indeksi. Ovi indeksi ne mjenjaju fiziki raspored podataka u bazi, ve odravaju pokazae ka samim podacima. Postoje i dvije metode pravljenja indeksa. Prvi je grafiki pomou Eneterprise Managera a drugi je koritenje arobnjaka index Tuning.
- Formiranje indeksa po atributu IME_PREZIME relacije trgovac CREATE INDEX IME_INDEX ON TRGOVAC(IME_PREZIME); - Formiranje jedinstvenog indeksa po atributu MB relacije CREATE UNIQUE INDEX MB_INDEX ON TRGOVAC (MB); - Naredba DROP INDEX slui za izbacivanje postojeeg indexa i baze podataka i njegove definicije iz kataloga podataka. DROP INDEX IME_INDEX; ( izbacuje se postojei indeks IME_INDEKS relacije TRGOVAC)
UPITI (Queries)
jedna od najmonijih osobina SQL baza podataka povezivanje tabela dohvaanje podataka po zadanim kriterijima komande koje rade sljedee:
kreiranje i uklanjanje tabela dodavanje, mijenjanje ili uklanjanje redaka i polja pretraivanje vie tabela radi pronalaenja odreenih informacija mijenjanje informacija o zatiti
Primjer 1.
SELECT U.Ime, U.Prezime, U.JMBG, U.[Datum sklapanja radnog ugovora], U.[Mjesena plaa] FROM Uposlenik AS U WHERE [Mjesena plaa]>=1000;
cilj SQL upita: manipuliranje podacima iz vie tabela BEZUVJETNO SPAJANJE TABELA = Kartezijev produkt redaka iz svih tabela koje elimo spojiti
SELECT * FROM Tabela1, Tabela2;
Redak redak1
Oznaka tabela1
Redak redak1
Oznaka tabela2
redak2
redak3
tabela1
tabela1
redak2
redak3
tabela2
tabela2
redak3
redak3
tabela1
tabela1
redak2
redak3
tabela2
tabela2
R r1 , r2 , r3 , T t1 , t2 , t3
R T r1 , t1 , r1 , t2 , r1 , t3 , r2 , t1 , r2 , t2 , r2 , t3 , r3 , t1 , r3 , t2 , r3 , t3
R T
bezuvjetno spajanje rijetko se koristi uglavnom je zadan uvjet po kojemu se tabele spajaju jedan od uvjeta je i JEDNAKOST
Primjer 2. SELECT Lijek.[Bar-kod], Lijek.Naziv, Proizvoa.Naziv FROM Lijek, Proizvoa WHERE Lijek.Proizvoa=Proizvoa.ifra;
UVJET JEDNAKOSTI
Lijek.Proizvoa = Proizvoa.ifra
LIJEK - PROIZVOA
slue za uitavanje zapisa iz vie tabela da bi dao jedan skup zapisa naredba JOIN spaja tabele na osnovu zajednikog stupca i daje zapise ije se vrijednosti poklapaju u spojenim tabelama
Primjer 3. SELECT Lijek.[Bar-kod], Lijek.Naziv, Proizvoa.Naziv FROM Proizvoa INNER JOIN Lijek ON Proizvoa.ifra=Lijek.Proizvoa;
proizvoaima u tabeli Proizvoa pridruuju se lijekovi koje oni proizvode a nalaze se u tabeli Lijek proizvoai koji nisu proizveli niti jedan lijek u tabeli Lijek ne nalaze se u rezultatu
uvijek vee zapise iz tabele s desne strane odredbe JOIN sa zapisima iz tabele s lijeve strane
Primjer 4.
SELECT [Bar-kod], Lijek.Naziv, Proizvoa.Naziv FROM Proizvoa RIGHT JOIN Lijek ON Proizvoa.ifra=Lijek.Proizvoa;
uvijek vee zapise iz tabele s lijeve strane odredbe JOIN sa zapisima iz tabele s desne strane
Primjer 5. SELECT [Bar-kod], Lijek.Naziv, Proizvoa.Naziv FROM Proizvoa LEFT JOIN Lijek ON Proizvoa.ifra=Lijek.Proizvoa;
Primjer 6.
SELECT Lijek.[Bar-kod], Lijek.Naziv, [Kratica - Farmaceutski oblik].[ifrirani pojam] FROM ([Kratica - Farmaceutski oblik] INNER JOIN [Farmaceutski oblik] ON [Kratica - Farmaceutski oblik].ifra=[Farmaceutski oblik].Naziv) INNER JOIN Lijek ON [Farmaceutski oblik].ifra=Lijek.[Farmaceutski oblik];
Postoje samo kao definicije upita nad jednom ili vie tablica
ne uvaju podatke u sebi (prividne relacije bez vlastitih podataka)
Pogledi
Omoguuju
prilagodbu logikog modela podataka specifinim potrebama korisnika provoenje zatite protiv neovlatenog pristupa podacima
Izvravaju se u trenutku upita pomou naredbe CREATE VIEW Pogled se brie naredbom DROP VIEW
CREATE VIEW
Kreiranje pogleda Sintaksa:
CREATE VIEW [< owner > . ] view_name [ ( column [ ,...n ] ) ] AS select_statement CREATE SELECT FROM WHERE VIEW muski_studenti AS mbr_stud, ime_stud, prez_stud student spol = 'M';
Primjer:
Procedure
procedura je upit koji se cuva u bazi podataka pisanje procedure se zapocinje sa CREATE PROCEDURE ime_procedure AS programski_kod pozivanje procedure se obavlja sa EXEC ime_procedure moze biti bez ili sa ulaznim parametrima
prednosti: smanjuje promet kroz mrezu (sacuvane su na posluzitelju) promjene se stoga obavljaju samo na jednom mjestu
Upit koji se uva u SQL Server-ovoj bazi podataka, nije ugraena u osnovne komponente aplikacija na klijentskim raunalima Osnovni cilj:
Poveanje brzine prijenosa podataka unutar mree Prevoenje upita povezivanje tabela
SELECT Lijek.[Bar-kod], Lijek.Naziv, Lijek.Cijena FROM Lijek INNER JOIN ([Farmakoterapijska skupina] INNER JOIN [Specifikacija FSL] ON [Farmakoterapijska skupina].ifra=[Specifikacija FSL].ifra) ON Lijek.Kod=[Specifikacija FSL].Kod WHERE ((([Farmakoterapijska skupina].Naziv)="Analgetik")) ORDER BY Lijek.Naziv;
Problem: uestalo slanje upita serveru od strane klijenta = zaguenje mree, gubljenje dijelova upita, ponovno slanje
Problem: to ako korisnik eli spisak lijekova iz neke druge farmakoterapijske skupine (a ne analgetike kao u prethodnom primjeru)? Rjeenje: Uskladitena procedura sa ulaznim parametrima potrebno je definirati ulaznu varijablu
CREATE PROCEDURE DBO.SkupinaL @skupina varchar(30) AS SELECT Lijek.[Bar-kod], Lijek.Naziv, Lijek.Cijena FROM Lijek INNER JOIN ([Farmakoterapijska skupina] INNER JOIN [Specifikacija FSL] ON [Farmakoterapijska skupina].ifra=[Specifikacija FSL].ifra) @skupina @varchar(30) = Analgetik ON Lijek.Kod=[Specifikacija FSL].Kod WHERE ((([Farmakoterapijska skupina].Naziv)=@skupina)) ORDER BY Lijek.Naziv;
uskladitena procedura koja se ne poziva naredbom EXEC nego se automatski aktivira prilikom izvravanja odreenih akcija od strane korisnika Primjer: Unos roka valjanosti lijeka u bazu podataka rok valjanosti ne smije biti dui od 60 mjeseci okidai su uvari referencijalnog integriteta baze podataka 3 tipa okidaa koji se esto koriste:
promjena sadraja unutar baze podataka spreavanje umetanja novog zapisa lanano auriranje tabela u bazi podataka konzistencija baze
kada korisnik pokuava unijeti zapis, SQL Server kopira taj zapis u dvije tabele:
12
383898.
54.88
12
383898.
54.88
aktivira se promjenom cijene lijeka nakon uitavanja cijene, SQL Server pohranjuje podatke u gore navedene tabele aktivira se okida INSERT i koristei podatke iz tabele inserted mijenja sadraj stupca Cijena u tabeli Lijek