Professional Documents
Culture Documents
BazePodataka SQLPredavanja PDF
BazePodataka SQLPredavanja PDF
Slaven Zakoek
Baze podataka
Preddiplomski studij
Materijali za predavanja
Sadraj
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
10.1
10.2
10.3
10.4
10.5
10.6
10.7
11.
11.1
11.2
1. Osnovni pojmovi
1.1 Sustav za upravljanje bazama podataka
Baza podataka je skup meusobno povezanih podataka, pohranjenih zajedno bez tetne ili nepotrebne
(nekontrolirane) zalihosti (redundancije), s ciljem da ih koriste razliite aplikacije. Podaci su pohranjeni
u obliku neovisnom od programa koji ih koriste. Unos, izmjena i dohvat podataka obavlja se
ISKLJUIVO kroz zajedniko i kontrolirano suelje.
Programski sustav koji omoguava upravljanje bazom podataka je sustav za upravljanje bazama podataka,
SUBP (DBMS - Database Management System).
Korisnik ili korisniki program postavlja zahtjev za obavljanjem neke operacije s podacima, a SUBP ga
analizira, provjerava, optimizira, transformira u niz operacija koje je potrebno obaviti na fizikoj razini, obavlja
operacije i vraa rezultat.
2. Ugraivanjem DML i DDL naredbi unutar "jezika domaina" (host language). Naredbe se ugrauju u kod
jezika tree ili etvrte generacije, npr. FORTRAN, COBOL, C, C++, Java, IBM Informix 4GL, itd. Prije
prevoenja takvog programskog koda standardnim prevoditeljem dotinog jezika, izvorni programski kod se
predprocesorom transformira tako da se ugraene DDL i DML naredbe transformiraju u pozive bibliotenih
funkcija koje su posebno pripremljene za pojedini jezik domain.
3. Pomou korisnikih suelja koja omoguavaju upotrebu DML i DDL jezika u grafikom obliku. Ovaj je
nain pogodan za korisnike koji nisu specijalisti u koritenju DML i DDL jezika, ali najee se na taj nain
znatno ograniava ekspresivnost i mogunosti jezika, te je za razvoj svih, osim trivijalnih aplikacija, ipak
nuno dobro poznavanje DML i DDL jezika.
Uobiajeno je da front-end i back-end procesi komuniciraju pomou neimenovanih cjevovoda (unnamed pipes) ili
zajednike memorije (shared memory) ako se nalaze na istom raunalu, odnosno uz pomo nekog od mrenih
protokola (npr. TCP/IP) ukoliko se nalaze na razliitim raunalima. Koriste se standardna programska suelja kao
to su ODBC (Open Database Connectivity) i JDBC (Java Database Connectivity). Time se, u velikoj mjeri,
postie nezavisnost alata koji se koriste za korisniko suelje od konkretno primijenjenog sustava za upravljanje
bazama podataka. Npr. korisniko suelje izraeno u Microsoft Access-u (tipini predstavnik alata za izgradnju
korisnikog suelja), moe (uz relativno male tekoe) pristupati Oracle, IBM Informix ili nekom drugom
sustavu za upravljanje bazama podataka.
2. SQL standard
SQL predstavlja akronim za Structured Query Language. Originalno je razvijen 70-tih godina u IBM Research
Laboratory at San Jose - California u okviru relacijskog sustava za upravljanje bazama podataka System R. SQL je
nakon toga standardiziran i postao je referentni jezik za relacijske baze podataka.
SQL je upitni jezik temeljen na relacijskoj algebri i predikatnom raunu. Vana znaajka jezika je neproceduralnost
- opisuje se to se eli dobiti kao rezultat, ali ne i kako se do tog rezultatata dolazi. Ugraeni optimalizator upita
pronalazi najefikasniji nain obavljanja upita. SQL se koristi kao programski jezik i interaktivni upitni jezik. Kao
programski jezik moe se ugraivati u jezike tree i etvrte generacije.
SQL objedinjuje funkcije jezika za definiciju podataka (Data Definition Language - DDL) i jezika za upravljanje
podacima (Data Manipulation Language - DML). Zadaa SQL-a je omoguiti definiciju podataka, upravljanje
podacima i provoenje kontrole nad podacima u relacijskoj bazi podataka.
Primjer SQL naredbe iz DDL dijela jezika (kreiranje relacije mjesto):
CREATE TABLE mjesto
( pbr
INTEGER
, nazMjesto
CHAR(40)
, sifZupanija
SMALLINT
);
NOT NULL
NOT NULL
Primjer SQL naredbe iz DML dijela jezika (iz relacije mjesto dohvaa sve n-torke kojima je vrijednost atributa
potanski broj jednaka 31000):
SELECT * FROM mjesto
WHERE pbr = 31000
SQL je standard prema ANSI (American National Standards Institute), ISO (Organization for International
Standardization), UNIX (X/Open), IBM Standard i FIPS (Federal Information Processing Standard).
Prva verzija SQL standarda je ANSI X3.135-1986, poznata pod nazivom SQL-86. Standard obuhvaa osnovne
operacije s relacijama, definiciju pogleda (view) i nekih pravila integriteta i ugraivanje SQL naredbi u jezike
tree generacije (FORTRAN, COBOL, C, itd.). Standard je proiren 1989. godine, ANSI X3.135-1989.
(djelomina definicija referencijskog integriteta). Standard iz 1989. godine poznat je pod nazivom SQL-89.
Sljedea verzija standarda objavljena je 1992. godine, ANSI X3.135-1992, poznata pod nazivom SQL-92, ali
takoer i pod nazivom SQL-2. Standard je donio veliki broj novih elemenata jezika (npr. pravila integriteta
definirana na nivou relacije ili n-torke, DATETIME tip podatka, upravljanje transakcijama, privremene relacije,
itd.). Najnoviji standard, poznat pod nazivom SQL-99 ili SQL-3 sadrava nove mogunosti poput ugradnje aktivnih
pravila integriteta i okidaa, rekurzivnih operacija, ugradnje novih, korisniki definiranih tipova podataka, itd.
U komercijalno raspoloivim sustavima za upravljanje bazama podataka SQL-2 standard je ovog trenutka najire
prihvaen. Ipak, zbog njegove sloenosti do sada jo niti jedan sustav ne podrava taj standard u potpunosti. SQL92 standard definira tri kategorije: Entry SQL, Intermediate SQL i Full SQL. Entry SQL kategorija je slina SQL-89
3
standardu. Intermediate SQL pokriva mogunosti standarda koje su najznaajnije u primjeni u danas raspoloivim
komercijalnim produktima.
Proizvoai komercijalnih sustava takoer ugrauju i svoje, uglavnom nestandardne, DDL i DML naredbe. Ti su
nestandardni dijelovi problematini jer programski kod postaje neprenosiv izmeu razliitih SQL sustava, a takoer
se bitno oteava usaglaavanje oko buduih standarda.
Ovi se nastavni materijali temelje na SQL-92 standardu (Entry Level), ali budui da se u primjerima koristi
konkretan sustav za upravljanje bazama podataka (IBM Informix Dynamic Server), bilo je potrebno u rijetkim
sluajevima dodati opise nestandardnih proirenja jezika. Mjesta u tekstu gdje se koriste takva, nestandardna
rjeenja, jasno su oznaena.
Gdje je bilo mogue, SQL naredba je opisana na najjednostavniji mogui nain, tako da su kljune rijei
napisane jaim otiskom, a "varijabilni" je dio naredbe otisnut kosim slovima, kao npr. u naredbi:
DROP DATABASE databaseName
Ovo znai da se konkretna naredba (za unitavanje baze podataka) formira tako da se zamijeni databaseName sa
stvarnim imenom neke baze podataka, npr.:
DROP DATABASE mojaBazaPodataka
U veini sluajeva SQL naredbe imaju sloeniju sintaksu koju nije mogue opisati na gore navedeni nain.
Koriste se sintaksni dijagrami u obliku prikazanom u sljedeem primjeru:
Sintaksni dijagram je usmjereni graf kojim su opisani doputeni oblici naredbe ili nekog segmenta naredbe
(Clause). Doputen je svaki oblik koji se moe formirati obilaskom grafa polaskom s lijeve strane grafa uz
obavezno pridravanje pravila da se smjer obilaska grafa ne smije mijenjati.
Oznaka
u nekoj grani grafa znait e da
grana grafa opisuje proirenje ANSI SQL-92
entry-level sintakse. Ova oznaka e se koristiti i u
tekstu, kako bi se naglasilo da se radi o
nestandardnom proirenju sintakse.
(Database)
(Table) - relacija
(Column) - atribut, kolona, stupac
(View)
(Synonym)
(Constraint)
(Index)
(Stored Procedure)
(Trigger)
Imena objekata (identifikatori) u SQL-u formiraju se iz slova, znaka '_' i znamenki. Prvi znak od ukupno 128
znaajnih (signifikantnih) znakova mora biti slovo.
Sintaksni dijagram koji pokazuje na koji se nain moe formirati identifikator prikazan je na sljedeoj slici:
Primjer:
ispravno formirani identifikatori: stud ispiti2000godine
neispravno formirani identifikatori: _11.mjesec 11mjesec
stud_ispit
stud-ispit
_1mjesec
*mjesec
SELECT *
FROM mjesto
WHERE nazMjesto = 'Dubrovnik'
Radi preglednosti, uobiajeno je kljune rijei pisati velikim slovima, a ostale elemente naredbe malim slovima
(prva naredba u prethodnom primjeru je u tom smislu izrazito nepregledno napisana).
Ipak, vano je uoiti da postoji razlika meu nizovima znakova napisanim malim i velikim slovima. Sljedee dvije
SQL naredbe NISU jednake:
SELECT *
FROM mjesto
WHERE nazMjesto = 'Dubrovnik'
SELECT *
FROM mjesto
WHERE nazMjesto = 'DUBROVNIK'
naredba a;
naredba b; ...
5
-- ovo je komentar
tekst nakon znakova -- predstavlja komentar koji se protee samo do kraja retka
SELECT *
FROM
WHERE
pbr
mjesto
= 31000
- (2
n - 1
n - 1
- 1
Cijeli broj pohranjen u 2 byte-a. Raspon brojeva koji se mogu prikazati je [-32767, 32767].
BOOLEAN
Vrijednost suda (true, false). Doputene vrijednosti su 't' ili 'T', odnosno 'f' ili 'F'. Vrijednosti
se mogu usporeivati meusobno ili s logikim izrazom. Za pohranu podatka koristi se 1 byte.
CHAR
Znakovni niz (string). Npr.: CHAR(24). Maksimalna duljina niza znakova je 32767.
Alternativni naziv tipa je CHARACTER.
NCHAR
Jednako kao i CHAR tip podatka, ali uz dodatak kojim se omoguava ispravno
leksikografsko ureenje nizova znakova koji sadre nacionalne kodne stranice (character set).
Kad je npr. potrebno leksikografski poredati nizove znakova uz koritenu ISO8859-2 kodnu
stranicu (kodna stranica koja se standardno koristi u hrvatskom jeziku) nuno je umjesto
CHAR tipa podatka koristiti NCHAR tip.
DATE
Vrijednosti ovog tipa se uvijek prikazuju u obliku datuma. Format ispisa (npr.
DD.MM.YYYY) odreen je environment varijablom DBDATE. Interno se podatak
predstavlja brojem dana proteklih od 31.12.1899. Zauzee memorije je 4 byte-a. Oblik
datumske konstante odreen je varijablom DBDATE, i uvijek se pie pod navodnicima, npr.
'14.5.1996'.
Ovaj tip podatka omoguava koritenje operacija zbrajanja i oduzimanja:
datum1 - datum2 rezultat je cijeli broj: broj dana proteklih izmeu datum1 i datum2
datum + broj
rezultat je datum: koji e datum biti broj dana nakon dana datum
datum - broj
rezultat je datum: koji je datum bio broj dana prije dana datum
FLOAT
SMALLFLOAT
Ovaj tip podatka odgovara float tipu podatka u jeziku C. Raspon brojeva i preciznost
ovisi o operacijskom sustavu - najee se radi o upotrebi 4 byte-a i tehnici prikaza floating
point. Alternativni naziv je REAL. Konstante koje se mogu koristiti su oblika npr. 23 -1
-343.23 232.233E3 23.0e-3 itd.
DECIMAL
Tip podatka DECIMAL je u posebnom formatu pohranjen (baza 100) decimalni broj. Pri
definiciji ovog tipa podatka specificira se ukupan broj znamenki (precision, m <= 32) i broj
znamenki koje se nalaze iza decimalne toke (scale, n <= m). Npr., DECIMAL (15, 3)
predstavlja decimalni broj sa ukupno 15 znamenki, od toga se 3 nalaze iza decimalne toke.
Ukoliko se scale ne navede, varijabla se smatra realnim brojem (floating real) koji ima
preciznost m, a doputeni interval vrijednosti definiran je s [10-130, 10124]. Zauzee memorije
ovisi o deklariranom ukupnom broju znamenki. Ako je deklarirani broj znamenki m, potreban
prostor iznosi m/2 + 1 byte-ova. Alternativni nazivi su NUMERIC i DEC.
MONEY
Tip podatka koji je gotovo identian tipu DECIMAL. Razlika postoji u obliku ispisa MONEY tip podatka implicira da se uz vrijednost varijable ispisuje i oznaka valute. Oznaka
valute odreena je environment varijablom DBMONEY.
SERIAL
DATETIME
CHARACTER VARYING
Niz znakova varijabilne duljine. Mora se specificirati maksimalna duljina, a moe se
specificirati i minimalna duljina niza. Utroak memorije ovisi o duljini stvarno upisanog niza
znakova, ali u svakom sluaju se troi barem onoliko memorije koliko je bilo specificirano
minimalnom duljinom niza. Maksimalna duljina niza je 255 znakova.
VARCHAR
NVARCHAR
BYTE
Pripada u grupu BLOB tipova podataka. Koritenjem ovog tipa podatka moe se
pohraniti bilo koji neprekinuti niz binarnih podataka. Praktino ne postoji ogranienje u
veliini podatka koji se moe pohraniti. Utroak memorije ovisi o veliini stvarno
pohranjenog objekta.
TEXT
Vrlo slian BYTE tipu podataka. Razlika je u tome to ovaj tip podatka doputa
koritenje samo "tekstualnih" podataka (printable characters, tabs, newlines, newpages), pa
se koristi za pohranu tekstova. Utroak memorije ovisi o veliini stvarno pohranjenog teksta.
namijenjena je za stvaranje nove baze podataka. Obavljanjem ove naredbe kreiraju se strukture podataka potrebne
za opsluivanje baze podataka (rjenik podataka). Vlasnik kreirane baze podataka je korisnik koji je obavio
naredbu.
Sljedeom naredbom kreira se baza podataka pod imenom stuslu.
CREATE DATABASE stuslu
Unutar jedne instance posluitelja baze podataka ne mogu postojati dvije baze podataka istog imena. Ukoliko isti ili
neki drugi korisnik pokua jo jednom kreirati bazu podataka pod istim imenom (a da pri tom prethodno kreirana
baza podataka nije u meuvremenu unitena), dobit e poruku o pogreci.
Ukoliko ima dozvolu, korisnik moe pristupiti svakoj bazi podataka unutar instance sustava za upravljanje bazama
podataka ("otvoriti bazu podataka") pomou naredbe:
DATABASE databaseName
ili
DATABASE databaseName EXCLUSIVE
Ukoliko se navede rezervirana rije EXCLUSIVE, baza podataka je zakljuana ekskluzivno. Niti jedan drugi
proces ne moe pristupiti bazi podataka sve dok proces koji je pristupio bazi podataka ekskluzivno, ne terminira ili
obavi naredbu CLOSE DATABASE.
CLOSE DATABASE
Proces koji obavi ovu naredbu prekida vezu s trenutno "otvorenom" bazom podataka.
Komplement naredbe CREATE DATABASE je naredba
Naredbom se bespovratno unitavaju podaci i cjelokupna struktura baze podataka databaseName. Npr.
DROP DATABASE stuslu
Ova se naredba ne moe obaviti ukoliko je bilo koji od procesa trenutno spojen na dotinu bazu podataka. Svi takvi
procesi moraju prethodno ili terminirati ili obaviti naredbu CLOSE DATABASE.
prezStud
Horvat
Kolar
Novak
Horvat
imeStud
Ivan
Marko
Berislav
Ivica
prosjOcjena
3.76
4.34
3.39
4.56
pbrRodStud
10000
51000
20000
31000
Svaka relacija ima svoj klju. To je atribut ili skup atributa ije vrijednosti u relaciji moraju biti jedinstvene,
odnosno u relaciji se ne smiju pojaviti dvije n-torke koje imaju jednaku vrijednost kljua. U relaciji moe
postojati vie kljueva, ali se jedan od kljueva uvijek proglaava primarnim kljuem.
Relacija (njezina shema i sadraj) u SQL-u se predstavlja objektom koji se naziva tablica (table). Struktura svake
relacije (tablice) mora biti jednom definirana uz pomo naredbe CREATE TABLE. Osnovna, donekle
pojednostavljena sintaksa naredbe je:
Pri definiranju relacije, potrebno je za svaki atribut (Column Definition) specificirati naziv (column name), tip
podatka (Data Type), te opcionalno navesti NOT NULL kvalifikator.
NOT NULL kvalifikatorom specificiraju se atributi ije vrijednosti u n-torki ne smiju poprimiti NULL vrijednost.
Koncept NULL vrijednosti opisan je u posebnom poglavlju o NULL vrijednostima.
Sintaksni dijagram za Data Type nije naveden jer su doputeni tipovi podataka ve opisani.
Opcionalno je uz definiciju svakog atributa relacije mogue zadati tzv. default vrijednost. To je vrijednost koja
se u trenutku upisa n-torke u relaciju pridruuje atributu ukoliko vrijednost za atribut nije eksplicitno navedena.
Oznaka literal u sintaksnom dijagramu Default Clause predstavlja konstantu (znakovnog, numerikog ili
datumskog tipa) koja po tipu mora odgovarati tipu atributa kojem se pridruuje. USER i TODAY su "varijable"
koje sadre tekui datum (vrijednost trenutno postavljenu na nivou operacijskog sustava) i ime (login) korisnika.
Primjer:
CREATE TABLE stud
( mbrStud
INTEGER
, prezStud
CHAR(25)
, imeStud
CHAR(25)
, prosjOcjena DECIMAL(3,2)
, pbrRodStud INTEGER
)
NOT NULL
NOT NULL
DEFAULT 0.0
DEFAULT 10000
NOT NULL
-- 10000 Zagreb
privMjesto
INTEGER
CHAR(20)
CHAR(2)
NOT NULL
NOT NULL
DEFAULT 'ZG'
Privremena relacija se moe kreirati i uz pomo SELECT naredbe, ali o tome e biti rijei u posebnom poglavlju
o pohrani rezultata SELECT naredbe u privremenu relaciju.
10
Specifina oznaka za takve vrijednosti je NULL (to nije i nain fizike prezentacije NULL vrijednosti). Sustav mora
biti u stanju razlikovati NULL vrijednosti od ostalih vrijednosti istog tipa podatka (od onih za koje je vrijednost
atributa poznata).
NOT NULL uz definiciju atributa A u relaciji R predstavlja pravilo prema kojem nije doputeno obaviti operaciju
koja bi u bilo kojoj n-torki relacije R postavila za vrijednost atributa A NULL vrijednost (odnosno, zahtijeva se da
je vrijednost atributa A bezuvjetno definirana za svaku n-torku).
Koritenje NULL vrijednosti zahtijeva panju jer se u prisustvu NULL vrijednosti uvode nova pravila pri
evaluiranju relacijskih, logikih, aritmetikih i ostalih izraza.
SELECT naredba
Postavljanje SQL upita (query) nad bazom podataka (pregled podataka).
Primjer:
SELECT nazMjesto
FROM mjesto
WHERE pbr = 10000 OR pbr = 51000
nazMjesto je naziv atributa ija se vrijednost eli vidjeti u izlaznoj listi. mjesto je naziv relacije ije se n-torke
pregledavaju. pbr = 10000 OR pbr = 51000 je predikat kojim se odreuje koje su n-torke kvalificirane za izlaznu
listu - rezultat. Slobodno se upotrebljavaju konstante, okrugle zagrade, funkcije i operatori. Konverzije tipova se
obavljaju automatski u svim situacijama u kojima je to mogue.
INSERT naredba
Unos n-torke (zapis, redak, row) u relaciju.
INSERT INTO mjesto
VALUES (31000, 'Osijek')
UPDATE naredba
Auriranje n-torke (n-torki) u relaciji.
UPDATE mjesto
SET nazMjesto = 'OSIJEK'
WHERE pbr = 31000
DELETE naredba
Brisanje n-torke (n-torki) iz relacije.
DELETE FROM mjesto
WHERE pbr = 31000
11
Prijenos podataka iz relacije u datoteku u ASCII formatu obavlja se naredbom UNLOAD. Opi oblik naredbe
UNLOAD je sljedei:
filename je ime datoteke ili kompletni path u koji se pohranjuje ASCII ekvivalent podataka iz baze. Vrijednosti
atributa (i izraza) koji su navedeni u listi za selekciju ispisat e se u navedenom redoslijedu u zadanu datoteku.
Vrijednosti pojedinih atributa (izraza) odijeljeni su znakom za razgranienje (delimiter) koji je definiran eksplicitno
u naredbi ili pomou environment varijable DBDELIMITER.
Primjer:
UNLOAD TO 'mjesto.unl' DELIMITER '#' SELECT * FROM mjesto
UNLOAD TO 'c:\temp\mjesto.unl' SELECT mbrStud, imeStud FROM stud
Podaci se u ASCII datoteku mogu ispisati u bilo kojem obliku koji se moe specificirati u SELECT naredbi, pa se
mogu upotrijebiti i vrlo sloeni oblici SELECT naredbe.
Za prebacivanje podataka iz datoteke u ASCII formatu u relaciju u bazi podataka, koristi se naredba LOAD.
LOAD naredba je komplementarna naredbi UNLOAD. Opi oblik naredbe LOAD je:
Primjer:
LOAD FROM 'mjesto.unl' DELIMITER '#' INSERT INTO mjesto
LOAD FROM '/usr1/stud.unl' INSERT INTO stud (mbrStud, prezStud)
U drugoj naredbi pretpostavljeno je da se kao delimiter koristi znak definiran pomou environment varijable
DBDELIMITER (odreene na nivou operacijskog sustava), te da se u toj datoteci nalaze redom vrijednosti za
matini broj studenta i prezime studenta. Ostalim atributima u relaciji stud se prilikom punjenja podataka pridruuju
NULL vrijednosti ili vrijednosti definirane s DEFAULT opcijom.
Napomena: esto se u sintaksnim dijagramima pojavljuje opcija Table Name ili View Name. View ili pogled je
objekt slian relaciji koji se gradi na temelju relacije ili nekog drugog pogleda.
12
Grana dijagrama u kojoj se nalazi subquery poddijagram e biti objanjena u posebnom poglavlju o podupitima.
U sljedeem primjeru prikazana je SELECT naredba kojom se dohvaaju vrijednosti atributa mbrStud, imeStud i
prezStud za sve n-torke relacije stud
SELECT mbrStud, imeStud, prezStud
FROM stud
13
U prethodnom primjeru je u listi za selekciju, na mjestu izraza (expression), upotrebljeno ime atributa iz relacije
koja je navedena u FROM listi. Expression moe biti vrlo jednostavan (npr. samo ime atributa), ali moe biti i vrlo
sloeni izraz koji se sastoji od konstanti, naziva atributa, aritmetikih operatora i razliitih funkcija. Detaljniji opis
izraza (Expression) nalazi se u sljedeem poglavlju.
Ispred imena atributa uvijek se moe navesti ime relacije, ali se ime relacije mora navoditi ispred imena atributa
jedino u sluajevima kad ime atributa nije jednoznano odreeno unutar liste za selekciju. Nejednoznanost se
moe pojaviti tek ukoliko se podaci dohvaaju iz vie relacija (join), te je u sljedeem primjeru navoenje imena
relacije suvino (ali ne i pogreno, tj. nee uzrokovati pogreku).
SELECT stud.pbrStan
FROM stud
Select List moe sadravati oznaku "*" ili imeRelacije.* to znai da e se u izlaznoj listi pojaviti vrijednosti svih
atributa iz relacije. Na taj nain se izbjegava potreba taksativnog navoenja svih atributa relacije svaki put kad je
potrebno ispisati vrijednosti svih atributa. Tako je na primjer
SELECT * FROM stud
ili
ekvivalentno sa
SELECT
,
,
,
,
,
,
mbrStud
imeStud
prezStud
pbrRod
pbrStan
datRodStud
jmbgStud FROM stud
Uz svaki atribut mogue je navesti tzv. alias ime, koje e se u izlaznoj relaciji pojaviti kao naziv stupca (atributa).
Ukoliko se alias ime ne navede, naziv stupca odreuje se prema nazivu atributa u rjeniku podataka. Alias ime slui
iskljuivo kao "naziv atributa" u rezultantnoj relaciji, te se ne moe koristiti unutar upita osim u ORDER BY Clause.
Valja napomenuti i na ovom mjestu da je drugaija situacija s alias imenima relacija, koja se mogu slobodno
koristiti unutar upita, to e biti prikazano u poglavlju o spajanju relacija.
SELECT mbrStud MATICNI_BROJ,
prezStud PREZIME,
imeStud IME
FROM stud
ili
SELECT mbrStud AS MATICNI_BROJ,
prezStud AS PREZIME,
imeStud AS IME
FROM stud
Pomou kvalifikatora FIRST max moe se rezultat SELECT naredbe reducirati na prvih max n-torki koje bi
sadravao rezultat SELECT naredbe bez tog kvalifikatora. Ukoliko je broj n-torki koje bi se bez tog
kvalifikatora pojavile u rezultatu jednak k, te je k < max, rezultat e sadravati k n-torki.
Npr, sljedeim upitima prikazuje se prvih dvadeset n-torki iz relacije (u prvom primjeru samo atributi navedeni u
listi za selekciju, a u drugom primjeru svi atributi relacije).
SELECT FIRST 20 mbrStud, prezStud, imeStud FROM stud
SELECT FIRST 20 * FROM stud
Ukoliko se navede kvalifikator DISTINCT, u izlaznoj listi rezultata nee biti viestrukih pojava istih vrijednosti
n-torki. Npr, ukoliko izlazna lista treba sadravati sve meusobno razliite potanske brojeve roenja iz relacije
stud, koristit e se sljedei upit:
14
Najjednostavniji oblik FROM Clause sadri kljunu rije FROM i ime jedne relacije. U poglavlju u spajanju
relacija bit e opisano zato se i na koji nain u FROM listi navodi vie od jedne relacije.
Binarni operatori za zbrajanje, oduzimanje, mnoenje i dijeljenje, te unarni operatori + i - odgovaraju istim takvim
operatorima u drugim programskim jezicima. Dvije okomite crte (pipe sign), bez razmaka - | | -, predstavljaju
operator za konkatenaciju nizova znakova.
Column Expression
15
Znakovna konstanta (quoted string) se omeuje jednostrukim navodnicima. Ukoliko je jednostruki navodnik dio
niza, na mjestu svakog takvog navodnika se upiu dva jednostruka navodnika.
Primjer: Znakovna konstanta koja sadri prezime O'Shaughnessy u SQL-u se opisuje na sljedei nain:
'O''Shaughnessy'
Numerike konstante (literal number) su sline kao i u ostalom programskim jezicima. Npr.
11
-123
+121
6.022E23
Logike konstante (literal Boolean) su 't' odnosno 'T' i 'f' odnosno 'F'.
Function Expression
16
Horvat
Kolar
Pomou TRIM funkcije izbacuju se iz rezultata praznine (blank) koje nastaju jer se vrijednost atributa tipa
CHAR nadopunjava prazninama do duljine atributa koja je deklarirana prilikom kreiranja relacije.
SELECT TRIM(imeStud) || ' ' || prezStud
FROM stud
Ivan Horvat
Jasminko Novak
Conditional Expression omoguava transformaciju vrijednosti na temelju zadanih uvjeta. Postoje tri oblika: CASE
Expression, NVL Function , Decode Function.
17
CASE Expression je izraz slian naredbi CASE u drugim programskim jezicima. Izrazom se odabire jedna od
navedenih vrijednosti na temelju evaluiranja uvjeta. CASE Expression ima dva oblika: Generic CASE Expression i
Linear CASE Expression.
Generic CASE Expression rezultira vrijednou koja je navedena uz jedan od navedenih uvjeta (Condition).
Odabire se vrijednost koja se nalazi uz prvi uvjet (Condition) koji je zadovoljen. Vrijednost navedena uz svaki od
uvjeta moe biti Expression ili NULL vrijednost. Ukoliko niti jedan od navedenih uvjeta nije zadovoljen, rezultat je
vrijednost navedena u ELSE dijelu izraza. Ukoliko niti jedan od navedenih uvjeta nije zadovoljen, a ELSE dio nije
naveden, rezultat je NULL.
Primjer: Zadana je relacija student.
mbrStud
100
101
102
103
prosjek
4.23
2.34
3.10
4.75
SELECT mbrStud,
CASE WHEN prosjek >= 4.50 AND prosjek <= 5.00 THEN 'izvrstan'
WHEN prosjek >= 3.50 AND prosjek < 4.50 THEN 'vrlodobar'
ELSE 'ostalo'
END
FROM student
rezultat:
mbrStud
100
101
102
103
(expression)
vrlodobar
ostalo
ostalo
izvrstan
SELECT mbrStud,
CASE WHEN prosjek >= 4.50 AND prosjek <= 5.00 THEN 'izvrstan'
WHEN prosjek >= 3.50 AND prosjek < 4.50 THEN 'vrlodobar'
-- ELSE nije naveden
END
FROM student
rezultat:
mbrStud
100
101
102
103
(expression)
vrlodobar
NULL
NULL
izvrstan
18
Linear CASE Expression rezultira vrijednou koja je navedena uz izraz koji je jednak testiranom izrazu. Testirani
izraz je naveden iza kljune rijei CASE. Ukoliko niti jedna od navedenih vrijednosti nije jednaka testiranoj
vrijednosti, rezultat je vrijednost navedena u ELSE dijelu izraza. Ukoliko niti jedna od navedenih vrijednosti nije
jednaka testiranoj vrijednosti, a ELSE nije naveden, rezultat je NULL.
ocjena
4
2
3
5
SELECT mbrStud,
CASE ocjena
WHEN 5 THEN 'izvrstan'
WHEN 4 THEN 'vrlodobar'
ELSE 'ostalo'
END
FROM ispit
rezultat:
mbrStud
100
101
102
103
(expression)
vrlodobar
ostalo
ostalo
izvrstan
SELECT mbrStud,
CASE ocjena
WHEN 5 THEN 'izvrstan'
WHEN 4 THEN 'vrlodobar'
-- ELSE nije naveden
END
FROM ispit
rezultat:
mbrStud
100
101
102
103
(expression)
vrlodobar
NULL
NULL
izvrstan
NVL Function vraa vrijednost prvog ili drugog argumenta, zavisno od toga je li prvi argument NULL vrijednost.
Ukoliko prvi argument nije NULL, vraa vrijednost prvog argumenta. Ukoliko je prvi argument NULL, vraa
vrijednost drugog argumenta.
19
ocjena
4
2
NULL
5
SELECT mbrStud,
NVL (ocjena * 100, -1)
FROM ispit
rezultat:
mbrStud
100
101
102
103
(expression)
400
200
-1
500
DECODE Function je vrlo slian izrazu Linear CASE Expression. Prvi argument odgovara testiranom izrazu u
Linear CASE Expression. Slijede "parovi argumenata". Ukoliko je testirani izraz jednak prvom lanu jednog od
parova, tada se kao rezultat izraza dobiva drugi lan tog para. Ukoliko prvi lan niti jednog para nije jednak
testiranom izrazu, kao rezultat se dobiva posljednji argument (else_expr). Ukoliko prvi element niti jednog para nije
jednak testiranom izrazu, a taj posljednji argument (else_expr) nije naveden, rezultat je NULL.
ocjena
4
2
3
5
SELECT mbrStud,
DECODE (ocjena
, 5, 'izvrstan'
, 4, 'vrlodobar'
, 'ostalo')
FROM ispit
rezultat:
mbrStud
100
101
102
103
(expression)
vrlodobar
ostalo
ostalo
izvrstan
20
SELECT mbrStud,
DECODE (ocjena
, 5, 'izvrstan'
, 4, 'vrlodobar')
FROM ispit
rezultat:
mbrStud
100
101
102
103
(expression)
vrlodobar
NULL
NULL
izvrstan
DATE
DAY
MDY
MONTH
WEEKDAY
YEAR
21
Dijelove dijagrama u kojima se spominje Condition with Subquery ili Join za sada treba zanemariti. Radi se o
uvjetima spajanja i podupitima koji e biti opisani u posebnim poglavljima.
22
Uvjet za dohvat (Condition) je izreka izgraena od jednog ili vie uvjeta usporedbe (Comparison Condition) koji se
meusobno povezuju logikim operatorima AND, OR i NOT. Prioritet logikih operatora je jednak kao u drugim
programskim jezicima: NOT, AND, OR, ali se uvjeti usporedbe mogu grupirati uz pomo okruglih zagrada ime se
utjee na redoslijed evaluacije.
U dijagramu za uvjet usporedbe (Comparison Condition) moe se prepoznati est razliitih oblika uvjeta:
1.
2.
3.
4.
5.
6.
Primjeri:
1. Nastavnici (svi podaci o nastavnicima) iji je koeficijent za plau vei ili jednak od 5.50. Ovdje prvi izraz
predstavlja vrijednost atributa koef u n-torki relacije nastavnik, a drugi izraz je numerika konstanta.
Ove se dvije vrijednosti usporeuju pomou relacijskog operatora >=, te se ispisuju one n-torke za koje
se rezultat usporedbe evaluira kao istinit.
SELECT *
FROM nastavnik
WHERE koef >= 5.50
2a. Studenti (podaci o matinom broju, prezimenu i datumu roenja studenta) iji je datum roenja izmeu
'1.1.1981' i '5.4.1981' (uporaba operatora BETWEEN). Ovdje prvi izraz predstavlja vrijednost atributa
datRodStud u n-torki relacije stud, a druga dva izraza su datumske konstante koje definiraju zatvoreni
interval.
SELECT mbrStud, prezStud, datRodStud
FROM stud
WHERE datRodStud BETWEEN '1.1.1981' AND '5.4.1981'
3a. Popis matinih brojeva studenata koji su polagali ispit iz predmeta koji ima ifru unutar zadanog skupa
ifara predmeta. Ujedno je prikazana uporaba kvalifikatora DISTINCT. DISTINCT kvalifikator
osigurava da se matini brojevi studenata koji su polagali vie nego jedan ispit s popisa ili su vie puta
polagali neki predmet s popisa, ne pojavljuju vie od jednom u rezultatu upita.
SELECT DISTINCT mbrStud
FROM ispit
WHERE sifPred IN (346, 347, 348)
3b. Studenti iji datum roenja ne poprima niti jednu od vrijednosti '23.7.1981', '5.11.1980' i '31.1.1982'
(uporaba operatora NOT IN)
SELECT *
FROM stud
WHERE datRodStud NOT IN ('23.7.1981', '5.11.1980', '31.1.1982')
23
4a. Studenti iji je datum roenja nepoznat ili nije upisan (uporaba operatora IS NULL)
SELECT *
FROM stud
WHERE datRodStud IS NULL
4b. Studenti iji je datum roenja upisan (uporaba operatora IS NOT NULL)
SELECT *
FROM stud
WHERE datRodStud IS NOT NULL
5a. Ispis svih podataka o studentima ije ime sadri kombinaciju znakova 'ar' (uporaba operatora LIKE).
SELECT stud.*
FROM stud
WHERE imeStud LIKE '%ar%'
6a. Ispis svih podataka o studentima ije ime sadri kombinaciju znakova 'ar' (uporaba operatora
MATCHES)
SELECT *
FROM stud
WHERE imeStud MATCHES '*ar*'
6c. Ispis svih studenata ije prezime poinje nekim od znakova koji se nalaze izmeu slova A i D, te
zavrava jednim od znakova a, b, c, d, e.
SELECT *
FROM stud
WHERE prezStud MATCHES '[A-D]*[abcde]'
6d. Ispis svih studenata ije prezime poinje nekim od znakova koji se nalaze izmeu slova E i G, i nakon tog
prvog znaka sadri barem dva znaka koji nisu samoglasnici.
SELECT *
FROM stud
WHERE prezStud MATCHES '[E-G]*[^aeiouAEIOU]*[^aeiouAEIOU]*'
24
6e. Ispis svih predmeta iji naziv zavrava sa znakom a ili e, a sadri znak *.
SELECT *
FROM pred
WHERE nazPred MATCHES '*\**[ae]'
7. Uvjeti za usporedbu se mogu meusobno kombinirati pomou logikih operatora AND, OR i NOT. Ispis
svih studenata koji su roeni u mjestu s potanskim brojem 20000 ili im prezime poinje znakom D, te uz
taj uvjet, takoer zadovoljavaju uvjet da stanuju u mjestu s potanskim brojem 22000.
SELECT *
FROM stud
WHERE ( pbrRod = 20000 OR prezStud MATCHES 'D*' ) AND pbrStan = 22000
Zagrade se ne smiju ispustiti jer bi redoslijed evaluacije uvjeta bez njih bio drugaiji nego sa zagradama!
Uvjet dohvata se moe promatrati kao predikat kojeg n-torka iz relacije mora zadovoljiti da bi se pojavila u izlaznoj
listi rezultata upita. Naime, uvrtavanjem konkretnih vrijednosti iz n-torke u predikat dobiva se sud, koji se evaluira
kao istinit (true) ili laan (false). Samo one n-torke za koje se taj sud evaluira kao istinit, pojavit e se u rezultatu
SELECT naredbe.
Primjer: Neka relacija mjesto sadri n-torke 10000, Zagreb; 20000, Dubrovnik; 31000, Osijek
SELECT *
FROM mjesto
WHERE pbr > 10000 AND nazMjesto MATCHES 'D*'
Uvrtavanje
vrijednosti
u predikat
1. n-torka
2. n-torka
3. n-torka
false
true
false
4.3.2 Primjeri koritenja sloenijih izraza (Expression) u uvjetima za usporedbu i listi za selekciju
Primjeri:
1. Ispis predmeta za koje vrijedi da im je umnoak broja upisanih studenata i tjednog optereenja u satnici
podijeljen sa 100 vei od 1.1
SELECT *
FROM pred
WHERE upisanoStud * brojSatiTjedno / 100 > 1.1
2. Ispis studenata za koje vrijedi da su im prva dva slova prezimena i prva dva slova imena jednaka.
SELECT *
FROM stud
WHERE prezStud[1,2] = imeStud[1,2]
25
SELECT *
FROM stud
WHERE LENGTH( TRIM(prezStud) || imeStud ) > 18
4. Ispis studenata ija je starost izraena u danima vea od 20*365 (upit je neovisan o datumu izvoenja).
SELECT *
FROM stud
WHERE TODAY - datRodStud > 20*365
6. Dohvat zapisa svih studenata koji su roeni bilo kojeg ponedjeljka u 1981. godini.
SELECT *
FROM stud
WHERE YEAR(datRodStud) = 1981 AND WEEKDAY(datRodStud) = 1
7. Dohvat zapisa svih studenata koji su stari tono 19 godina, tj. danas im je roendan (upit je neovisan o
datumu izvoenja).
SELECT *
FROM stud
WHERE datRodStud = MDY (MONTH(TODAY), DAY(TODAY), YEAR(TODAY)-19)
*** ako se upit izvede 29. veljae, nee se dobiti niti jedan zapis
9. Dohvat zapisa svih studenata za koje ne postoji podatak o mjestu roenja.
SELECT *
FROM stud
WHERE pbrRod IS NULL
10. Ispis matinih brojeva i starosti svakog studenta izraene u danima (upit je neovisan o datumu izvoenja).
SELECT mbrStud, TODAY - datRodStud
FROM stud
11. Za svakog studenta ispisati sljedee podatke: inicijal imena i prezime (razdvojeno tokom), potanski
broj mjesta roenja, za one studente koji su roeni u mjestu iji je potanski broj izraen u cijelim
tisuicama (npr. 10000, 21000, 23000, ali ne i npr. 23100)
SELECT imeStud[1,1] || '.' || prezStud, pbrRod
FROM stud
WHERE MOD(pbrRod, 1000) = 0
26
Expression (Subset) u prethodnom dijagramu oznaava da se na tom mjestu moe koristiti izraz, ali uz manja
ogranienja - npr. ne moe se koristiti izraz tipa agregatne funkcije. Npr. nije doputeno napisati
AVG(COUNT((*)).
Primjer:
Agregatna funkcija koja izraunava prosjenu ocjenu dobivenu na svim ispitima za predmet sa ifrom
1034. U prosjek ulaze i pozitivne i negativne ocjene.
SELECT AVG(ocjena)
FROM ispit
WHERE sifPred = 429
Primjer:
Prosjena ocjena i broj izlazaka na ispit, u istom upitu, za predmet sa ifrom 1034.
SELECT AVG(ocjena), COUNT(*)
FROM ispit
WHERE sifPred = 429
jednostavniji nain primjene agregatnih funkcija je kad se agregatne funkcije primjenjuje na sve
selektirane n-torke. Na taj se nain kao rezultat upita dobiva jedna n-torka (u toj n-torki ima onoliko
vrijednosti koliko je agregatnih funkcija navedeno u listi za selekciju).
sloeniji sluaj, koji e biti razmatran u poglavlju o grupiranju, doputa da se selektirane n-torke podijele u
grupe prema nekom kriteriju, te da se agregatna vrijednost izrauna za svaku pojedinu grupu. Rezultat je
vie n-torki, po jedna za svaku dobivenu grupu.
broj n-torki
broj n-torki s razliitim vrijednostima od x
broj n-torki u kojima atribut x ima vrijednost razliitu od NULL
27
SUM (x)
SUM (DISTINCT x)
AVG (x)
AVG (DISTINCT x)
MAX (x)
MIN (x)
RANGE (x)
STDEV (x)
VARIANCE (x)
Primjeri:
1. Ispisati podatak o ukupnom broju mjesta u B-zgradi (pretpostavlja se da dvorana iz B-zgrade ima oznaku koja
zapoinje slovom B)
SELECT SUM(kapacitet)
FROM dvorana
WHERE oznDvorana MATCHES 'B*'
4. Broj studenata koji imaju upisan datum roenja (vrijednost datuma roenja im nije NULL vrijednost)
SELECT COUNT(datRodStud)
FROM stud
2. Agregatne je funkcije doputeno koristiti u listi za selekciju, ali ne i u uvjetima dohvata. Usporedbe s
agregatnim vrijednostima doputene su jedino u posebnom dijelu SELECT naredbe ( vidjeti HAVING Clause
u posebnom poglavlju).
Primjer: Ovakav upit, kojim se pokuava odrediti dvorana koja ima broj mjesta vei od prosjenog broja
mjesta, NE VRIJEDI, jer se agregatne funkcije ne smiju koristiti u WHERE dijelu naredbe.
SELECT * FROM dvorana
WHERE kapacitet > AVG(kapacitet)
U poglavlju o uvjetima sa podupitima prikazano je ispravno rjeenje ovog zadatka, ali uz uporabu podupita.
28
pbr
10000
10000
51000
MJESTO
pbr
nazMjesto
10000 Zagreb
51000 Rijeka
SELECT *
FROM student, mjesto
imeStud
Ivo
Ivo
Zrinka
Zrinka
Marko
Marko
ISPIT
imeStud
Ivo
Ivo
Marko
nazPredmet
Matematika
Fizika
Fizika
ocjena
4
2
5
Zrinka
Fizika
pbr
10000
10000
10000
10000
51000
51000
pbr
10000
51000
10000
51000
10000
51000
nazMjesto
Zagreb
Rijeka
Zagreb
Rijeka
Zagreb
Rijeka
Obavljanje Kartezijevog produkta relacija esto je posljedica pogreke programera - kad se zaboravi navesti uvjet
spajanja. U prethodnom primjeru kao rezultat upita dobije se 3*2 n-torki. U sluaju da su relacije imale npr. svaka
po 10 000 zapisa, rezultat bi sadravao 108 n-torki !!! Mogue je zamisliti koliko e raunalskih resursa SUBP
utroiti za obavljanje upita koji, pri tome, rezultira posve beskorisnim rezultatom.
4.5.2 Prirodno spajanje relacija
Za ispravno obavljanje prirodnog spajanja nuno je navesti uvjet spajanja (Join) koji se navodi u WHERE Clause.
Bez tog uvjeta rezultat spajanja relacija e uvijek biti Kartezijev produkt relacija.
SELECT student.*, mjesto.nazMjesto
FROM student, mjesto
WHERE student.pbr = mjesto.pbr
29
imeStud
Ivo
Zrinka
Marko
pbr
10000
10000
51000
nazMjesto
Zagreb
Zagreb
Rijeka
Primijetite da je lista za selekciju promijenjena u odnosu na prethodni primjer! Oni atributi koji se pojavljuju u
obje relacije se u listi za selekciju navode samo jednom, s ciljem da se dobije rezultat koji odgovara definiciji
prirodnog spajanja.
Prethodna je naredba primjer za operaciju prirodno spajanje (student >< mjesto)
Konceptualno (ne i fiziki, jer bi takav postupak bio neoptimalan), moe se smatrati da se upiti sa spajanjem relacija
obavljaju u tri faze:
1. Odreuje se Kartezijev produkt relacija
2. Obavlja se selekcija onih n-torki koje zadovoljavaju uvjete spajanja
3. Ispisuju se vrijednosti atributa navedenih u listi za selekciju za sve n-torke iz 2. koraka, ili se obavlja
projekcija po atributima navedenim u listi za selekciju (ukoliko je naveden DISTINCT kvalifikator).
Sljedei primjer ilustrira mogunost spajanja vie relacija, te dodavanje uvjeta selekcije uz uvjete spajanja.
Dohvat imena studenta, naziva predmeta i ocjena svih studenata ije mjesto stanovanja ima naziv koji
poinje slovom Z, a koji su na ispitu dobili ocjenu veu od 3.
SELECT student.imeStud, ispit.nazPredmet, ispit.ocjena
FROM student, mjesto, ocjena
WHERE student.pbr = mjesto.pbr
AND student.imeStud = ispit.imeStud
AND mjesto.nazMjesto MATCHES 'Z*'
AND ispit.ocjena > 3
imeStud
Ivo
Zrinka
nazPredmet
Matematika
Fizika
ocjena
4
5
Sintaksni dijagram za Join opisuje nain na koji se definira prirodno spajanje i spajanje uz uvjet.
30
pbrRod
10000
10000
51000
MJESTO
pbr
nazMjesto
10000 Zagreb
51000 Rijeka
pbrStan
10000
51000
10000
Ispis studenata u kojem se pojavljuje naziv mjesta roenja lako se rjeava na nain kakav je opisan u prethodnom
primjeru:
SELECT imeStud, pbrRod, nazMjesto
FROM student, mjesto
WHERE pbrRod = pbr
* primjetite da u prethodnom upitu atribute nije trebalo kvalificirati imenima relacija, jer njihovi nazivi
jednoznano odreuju o kojim se atributima iz kojih relacija radi.
Upit postaje neto sloeniji kad se postavi zahtjev za ispisom liste studenata, ali tako da se uz svakog studenta
istovremeno ispiu naziv njegovog (njezinog) mjesta roenja i mjesta stanovanja.
NEISPRAVNO POSTAVLJEN UPIT:
SELECT student.*,
mjesto.nazMjesto nazMjestoRod, mjesto.nazMjesto nazMjestoStan
FROM student, mjesto
WHERE pbrRod = mjesto.pbr
AND pbrStan = mjesto.pbr
Prethodni upit ne vrijedi jer bi se kao rezultat pojavile samo one n-torke iz relacije student u kojima su mjesto
roenja i mjesto stanovanja jednaki. Trebalo bi koristiti dvije relacije: mjestoRodjenja i mjestoStanovanja.
Budui da posebne relacije mjestoRodjenja i mjestoStanovanja ne postoje, oito se relacija mjesto mora u upitu
pojaviti dva puta, ali jednom u ulozi mjesta roenja, a jednom u ulozi mjesta stanovanja.
Ukoliko ista relacija ima razliite uloge (relacija mjesto ima ulogu mjesta roenja i mjesta stanovanja), formira se
upit u kojem se ta relacija u FROM Clause pojavljuje dva puta. Da bi se njezine uloge razlikovale, obavezno je
koritenje alternativnih ili zamjenskih naziva relacija (alias). Alternativni nazivi relacija se specificiraju jednostavno
navoenjem iza originalnog naziva relacije. Uvedeno alternativno ime tada se moe koristiti u upitu kao da se radi o
"pravoj" relaciji.
Napomena: postoji vana razlika izmeu alias imena atributa/izraza iz liste za selekciju i alias imena
relacije/pogleda. Dok se alias ime atributa/izraza smije u upitu pojaviti jo jedino u ORDER BY dijelu naredbe,
alias ime relacije/pogleda se mora koristiti umjesto "originalnog" imena relacije u cijelom upitu.
pbrRod
10000
10000
51000
pbrStan
10000
51000
10000
pbr
10000
10000
51000
nazMjesto
Zagreb
Zagreb
Rijeka
pbr
10000
51000
10000
nazMjesto
Zagreb
Rijeka
Zagreb
31
ORGJED
sifOrgjed
1
2
3
4
5
6
nazOrgjed
Uprava
Odjel A
Odjel B
Pododjel X
Pododjel Y
Pododjel Z
sifNadorgjed
NULL
1
1
2
2
3
U sluajevima kada je potrebno usporeivati pojedine organizacijske jedinice s njihovim nadreenim ili podreenim
organizacijskim jedinicama, potrebno je obaviti spajanje relacije "same sa sobom". Problem je slian i slino se
rjeava kao u paralelnoj vezi. Relacija orgjed pojavljuje se u upitu dva puta, jednom u ulozi organizacijske jedinice,
a jednom u ulozi njezine nadreene (ili podreene) organizacijske jedinice. Zbog toga je nuno koritenje
zamjenskih (alias) naziva relacije.
Upit kojim se dohvaaju organizacijske jedinice i nazivi njihovih nadreenih organizacijskih jedinica izgleda ovako:
SELECT orgjed.sifOrgjed
, orgjed.nazOrgjed
, orgjed.sifNadorgjed
, nadorgjed.nazOrgjed nadredjenaNaziv
FROM orgjed, orgjed nadOrgjed
WHERE orgjed.sifNadorgjed = nadOrgjed.sifOrgjed
Nakon to se obavi Kartezijev produkt (u konkretnom sluaju rezultat je 36 n-torki), te se eliminiraju n-torke koje ne
zadovoljavaju uvjet spajanja, dobije se sljedei rezultat:
sifOrgjed
2
3
4
5
6
nazOrgjed
Odjel A
Odjel B
Pododjel X
Pododjel Y
Pododjel Z
sifNadorgjed
1
1
2
2
3
nadredjenaNaziv
Uprava
Uprava
Odjel A
Odjel A
Odjel B
* Primjetite da se organizacijska jedinica "Uprava" nije pojavila u rezultatu, jer je za nju vrijednost
sifNadorgjed NULL, te ne postoji n-torka iz nadOrgjed ija je ifra "jednaka" NULL vrijednosti.
Upit kojim se dohvaaju organizacijske jedinice i nazivi njihovih podreenih organizacijskih jedinica izgleda
ovako:
SELECT orgjed.sifOrgjed
, orgjed.nazOrgjed
, podorgjed.sifOrgjed sifPodorgjed
, podorgjed.nazOrgjed podredjenaNaziv
FROM orgjed, orgjed podOrgjed
WHERE podorgjed.sifNadorgjed = orgjed.sifOrgjed
* Primjetite da se organizacijske jedinice koja nemaju podreene organizacijske jedinice nee pojaviti u
rezultatu.
sifOrgjed
1
1
2
2
3
nazOrgjed
Uprava
Uprava
Odjel A
Odjel A
Odjel B
sifPodorgjed
2
3
4
5
6
podredjenaNaziv
Odjel A
Odjel B
Pododjel X
Pododjel Y
Pododjel Z
32
ZRAKOPLOV
tip
B747
DC9
AIRBUS
dolet
6000
3000
1800
LET
brLeta
CA-825
A-224
CA-878
udaljenost
7200
3000
4200
tip
B747
B747
DC9
dolet
6000
6000
3000
brLeta
A-224
CA-878
A-224
udaljenost
3000
4200
3000
doletudaljenost
Podupit se moe ugraditi u vanjski upit na tri osnovna naina (naini ugradnje podupita):
1.
2.
3.
33
Relational Operator moe biti bilo koji od relacijskih operatora (>, <, =, itd.). Rezultat SELECT naredbe koja
predstavlja podupit (subquery), moe biti jedna n-torka, vie n-torki ili niti jedna n-torka. Da bi n-torka vanjskog
upita zadovoljila uvjet selekcije napisan na ovaj nain, mora biti zadovoljen uvjet usporedbe izraza Expression s
jednom ili vie n-torki koje se dobiju kao rezultat podupita.
Ukoliko se koristi kljuna rije ALL, sve n-torke dobivene podupitom moraju zadovoljiti uvjet usporedbe s
Expression, da bi se izraz evaluirao kao istinit. Pri tome, ako podupit ne vrati niti jednu vrijednost, izraz se
uvijek evaluira kao istinit (TRUE).
Ukoliko se upotrijebi kljuna rije ANY (kljuna rije SOME je sinonim), bit e dovoljno da uvjet usporedbe
bude zadovoljen za barem jednu n-torku iz podupita. Pri tome, ako podupit ne vrati niti jednu vrijednost, izraz
se uvijek evaluira kao laan (FALSE).
Podupit upotrijebljen na ovaj nain mora vraati tono jedan stupac (dakle u listi za selekciju SELECT
naredbe koja se koristi na mjestu subquery, smije se nalaziti samo jedan atribut ili izraz). U suprotnom,
upit zavrava u pogreci. Takoer, SELECT naredba koja se koristi za subquery ne smije sadravati
ORDER BY Clause.
Sljedeom naredbom odreuju se predmeti na kojima je upisan tako malen broj studenata da se nastava moe
odjednom (bez podjele po dvoranama) odrati u bilo kojoj dvorani:
SELECT *
FROM pred
WHERE upisanoStud <= ALL (SELECT kapacitet FROM dvorana)
Ovaj se upit (konceptualno promatrano) obavlja na sljedei nain: prvo se evaluira podupit kojim se formira skup
iji su elementi kapaciteti dvorana. Uzima se prva n-torka iz relacije pred pa se vrijednost atributa upisaniStud
usporedi sa svakom vrijednou iz skupa kapaciteta. Ukoliko je vrijednost upisaniStud manja ili jednaka od svake
vrijednosti s kojom se usporedila, prva n-torka iz relacije pred e se pojaviti u rezultatu. Postupak se ponavlja za
svaku n-torku relacije pred.
Sljedeom naredbom odreuju se predmeti za koje postoji barem jedna dvorana s dovoljnim kapacitetom da se u
njoj nastava odri odjednom za sve studente (bez dijeljenja studenata u vie dvorana):
SELECT *
FROM pred
WHERE upisanoStud <= ANY (SELECT kapacitet FROM dvorana)
Sljedeom naredbom odreuju se predmeti za koje se nastava ne moe odjednom za sve upisane studente odrati
niti u jednoj dvorani:
SELECT *
FROM pred
WHERE upisanoStud > ALL (SELECT kapacitet FROM dvorana)
Ako podupit pouzdano vraa samo jednu n-torku (single-valued subquery) mogu se kljune rijei ALL, ANY i
SOME ispustiti. U tom sluaju se vrijednost podupita moe promatrati kao rezultat funkcije, a uvjet s podupitom
kao usporedba s vrijednou koja se dobije evaluiranjem funkcije.
Ukoliko bi se pri tako postavljenom podupitu dogodilo da podupit vrati vie od jedne n-torke, upit bi zavrio u
pogreci. Ukoliko podupit ne vrati niti jednu n-torku, uvjet usporedbe se evaluira kao la (FALSE).
Sljedeom naredbom ispisuju se sve dvorane u kojima je broj mjesta vei od prosjenog broja mjesta. Primjetite
da se u dvjema razliitim ulogama koristi ista relacija:
SELECT *
FROM dvorana
WHERE kapacitet > (SELECT AVG(kapacitet) FROM dvorana)
Ispis dvorane (ili dvorana, jer ih moe biti nekoliko s jednakim brojem mjesta) koje imaju najvei broj mjesta:
34
SELECT *
FROM dvorana
WHERE dvorana.kapacitet = (SELECT MAX(kapacitet) FROM dvorana)
Uporaba kljune rijei DISTINCT nee utjecati na rezultat, ali se eliminacijom usporeivanja s duplikatima
esto moe ubrzati obavljanje upita.
Rezultat podupita je jedna, vie ili niti jedna n-torka. Broj atributa u listi za selekciju ovog podupita nije
ogranien niti je bitan za rezultat.
Da bi n-torka vanjskog upita zadovoljila uvjet (i pojavila se u rezultatu):
ukoliko se NE koristi modifikator NOT
ukoliko se koristi modifikator NOT
Primjer: Ispis svih dvorana ukoliko DANAS nije obavljen niti jedan ispit
SELECT * FROM dvorana
WHERE NOT EXISTS
(SELECT * FROM ispit
WHERE datIspit = TODAY)
35
Upitna je svrha postavljanja ovakvog upita. U principu, upiti ovakve vrste koriste se jedino u kombinaciji s
koreliranim podupitima. Korelirani podupiti objanjeni su u sljedeem poglavlju.
Ovaj podupit je koreliran jer se za njegovu evaluaciju koristi vrijednost atributa pred.sifPred koja je rezultat
vanjskog upita.
Upit se (konceptualno promatrano) obavlja na sljedei nain: uzima se prva n-torka iz relacije pred pa se koristei
vrijednost pred.sifPred izraunava broj razliitih dana u tjednu za koje je obavljena rezervacija za taj predmet.
Ukoliko je broj razliitih dana u tjednu iz vanjskog upita vei od dobivenog broja, n-torka iz vanjskog upita se
pojavljuje u rezultatu. Postupak se ponavlja za svaku n-torku relacije pred.
Svaki nekorelirani podupit se obavlja samo jednom, a zatim se njegov rezultat koristi za usporedbu s n-torkama
dobivenim vanjskim upitom. Korelirani podupiti se moraju obaviti jednom za svaku n-torku iz vanjskog upita.
Obje vrste, i korelirani i nekorelirani podupiti se mogu ugraivati u upite na sva tri opisana naina (usporedba
izraza s rezultatom podupita, ispitivanje da li je neki izraz sadran u rezultatu podupita, ispitivanje da li u
rezultatu podupita postoji barem jedna n-torka).
Primjer: ispisati sve predmete za koje ne postoji niti jedna rezervacija dvorane
SELECT pred.sifPred, pred.nazPred
FROM pred
WHERE NOT EXISTS
( SELECT *
FROM rezervacija
WHERE rezervacija.sifPred = pred.sifPred )
Primjer: ispisati podatke o dvoranama za koje ne postoji neka druga dvorana s jednakim kapacitetom
SELECT oznDvorana, kapacitet
FROM dvorana
WHERE kapacitet NOT IN
( SELECT kapacitet FROM dvorana drugaDvorana
WHERE drugaDvorana.oznDvorana <> dvorana.oznDvorana )
36
Primjer: ispisati podatke svih studenata koji nisu poloili niti jedan ispit sa barem prosjenom ocjenom (prosjek
se rauna kao prosjek pozitivnih ocjena svih ispita)
SELECT *
FROM stud
WHERE mbrStud NOT IN (
SELECT DISTINCT mbrStud
FROM ispit
WHERE ocjena >= (SELECT AVG(ocjena) FROM ispit
WHERE ocjena > 1)
)
Budui da je uvjet s podupitom vrsta uvjeta (Condition) koji se moe povezivati s drugim uvjetima pomou logikih
operatora, podupiti se mogu kombinirati i na sljedei nain:
SELECT ... FROM ...
WHERE EXISTS
(SELECT ... FROM ...
WHERE ...
)
OR izraz1 IN
(SELECT ... FROM ...
WHERE ...
)
37
mjesto.pbr
mjesto.nazMjesto
(SELECT COUNT(*) FROM stud WHERE stud.pbrRod = mjesto.pbr)
(SELECT COUNT(*) FROM stud WHERE stud.pbrStan = mjesto.pbr)
mjesto
Primjer: ispisati broj upanija, broj mjesta i broj nastavnika. Ovo je primjer nekoreliranog podupita:
SELECT (SELECT COUNT(*) FROM zupanija) brojZupanija
, (SELECT COUNT(*) FROM mjesto) brojMjesta
, (SELECT COUNT(*) FROM nastavnik) brojNastavnika
FROM mjesto
WHERE pbr = 10000
Odabrana je jedna n-torka iz relacije mjesto pomou koje su se ispisale traene vrijednosti. Mogla se odabrati
bilo koja (postojea) n-torka iz bilo koje relacije.
38
MjestoRod
oznDrz
HR
HR
HR
GB
GB
pbr
10000
51000
31000
10000
47000
nazMjesto
Zagreb
Rijeka
Osijek
London
Glasgow
MjestoStan
oznDrz
HR
HR
HR
GB
pbr
10000
47000
31000
10000
nazMjesto
Zagreb
Karlovac
Osijek
London
U obje relacije je klju oznDrz, pbr. Iz toga slijedi da, ukoliko je ispunjen uvjet
mjestoStan.oznDrz = mjestoRod.oznDrz
AND mjestoStan.pbr = mjestoRod.pbr
posljednji redak moe se ispustiti, jer atributi oznDrz i pbr ine klju u relacijama
SELECT mjestoRod.* FROM mjestoRod, mjestoStan
WHERE mjestoRod.oznDrz = mjestoStan.oznDrz
AND mjestoRod.pbr = mjestoStan.pbr
39
Jedino u sluaju da je klju u relacijama samo jedan atribut, moe se koristiti podupit IN
MjestoRod
pbr
10000
51000
31000
nazMmjesto
Zagreb
Rijeka
Osijek
MjestoStan
pbr
nazMjesto
10000 Zagreb
47000 Karlovac
31000 Osijek
mjestoRod \ mjestoStan
MjestoRod
oznDrz
HR
HR
HR
GB
GB
pbr
10000
51000
31000
10000
47000
nazMjesto
Zagreb
Rijeka
Osijek
London
Glasgow
MjestoStan
oznDrz pbr
HR
HR
HR
GB
nazMjesto
10000 Zagreb
47000 Karlovac
31000 Osijek
10000 London
U relacijama je klju oznDrz, pbr. Iz toga slijedi da se posljednji redak moe ispustiti
SELECT * FROM mjestoRod
WHERE NOT EXISTS
(SELECT mjestoStan.pbr FROM mjestoStan
WHERE mjestoStan.oznDrz = mjestoRod.oznDrz
AND mjestoStan.pbr = mjestoRod.pbr)
40
Jedino u sluaju da je klju relacija samo jedan atribut, moe se koristiti podupit IN
MjestoRod
pbr
10000
51000
31000
nazMjesto
Zagreb
Rijeka
Osijek
MjestoStan
pbr
10000
47000
31000
nazMjesto
Zagreb
Karlovac
Osijek
Grupiranje se obavlja tako da se n-torke koje imaju jednake vrijednosti atributa navedenih u listi za grupiranje,
kombiniraju u zajedniku grupu. Za svaku dobivenu grupu, u rezultatu se pojavljuje samo jedna n-torka.
SELECT sifPred
FROM rezervacija, dvorana
WHERE rezervacija.oznDvorana = dvorana.oznDvorana
GROUP BY sifPred
Konceptualno se upit obavlja tako da se prvo grupiraju sve n-torke prema vrijednostima atributa navedenih listi
za grupiranje:
sat
8
9
9
sifPred
MAT
MAT
MAT
oznVrstaDan
PO
PO
UT
oznDvorana
B-1
B-1
A-101
FIZ
FIZ
SR
CE
A-202
B-1
11
11
40
70
RAC
RAC
UT
SR
A-102
A-201
14
18
30
40
TEH
PE
B-5
12
50
70
30
sifPred
MAT
FIZ
RAC
TEH
Napomena: prethodni upit je bio samo primjer grupiranja. Naravno, gornji se rezultat mogao dobiti i na
jednostavniji nain, naredbom
SELECT DISTINCT sifPred
FROM rezervacija
41
Grupiranje je, meutim, vrlo korisno u kombinaciji s agregatnim funkcijama. U sljedeem upitu odreuje se, za
svaki predmet posebno, ukupan broj mjesta u rezerviranim dvoranama.
SELECT sifPred, SUM(kapacitet)
FROM rezervacija, dvorana
WHERE rezervacija.oznDvorana = dvorana.oznDvorana
GROUP BY sifPred
Rezultat je
sifPred
MAT
FIZ
RAC
TEH
(SUM)
170
110
70
50
Doputeno je koristiti sve agregatne funkcije koje su navedene u poglavlju o agregatnim funkcijama.
Vano je sljedee pravilo: svi atributi ili izrazi koji se nalaze u listi za selekciju, a koji nisu unutar agregatnih
funkcija, moraju biti navedeni u GROUP BY listi. Meutim, doputeno je u GROUP BY listi koristiti i one atribute
koji se ne nalaze u listi za selekciju, npr.
SELECT SUM(kapacitet)
FROM rezervacija, dvorana
WHERE rezervacija.oznDvorana = dvorana.oznDvorana
GROUP BY sifPred
Rezultat je
(SUM)
170
110
70
50
Sljedei upit
SELECT sifPred, oznDvorana, SUM(kapacitet)
FROM rezervacija, dvorana
WHERE rezervacija.oznDvorana = dvorana.oznDvorana
GROUP BY sifPred
NE VRIJEDI jer se za svaki predmet dobije samo jedna grupa (dakle jedan redak izlaznog rezultata). Budui da se
uz jednu ifru predmeta pojavljuje vie razliitih dvorana, nemogue je odrediti koju od dvorana koje pripadaju
grupi treba ispisati.
sifPred
MAT
MAT
MAT
oznVrstaDan
PO
PO
UT
oznDvorana
B-1
B-1
A-101
sat
8
9
9
kapacitet
70
70
30
FIZ
FIZ
SR
CE
A-202
B-1
11
11
40
70
RAC
RAC
UT
SR
A-102
A-201
14
18
30
40
TEH
PE
B-5
12
50
sifPred oznDvorana
MAT
?
FIZ
?
RAC
?
TEH
?
SUM
170
110
70
50
U listi atributa prema kojima se obavlja grupiranje mogu se umjesto imena atributa navoditi redni brojevi
atributa iz liste za selekciju
42
Osim prema atributima, grupiranje se moe obaviti i prema izrazima (Expression), ali se u tom sluaju u
listi atributa za grupiranje moraju koristiti redni brojevi atributa/izraza iz liste za selekciju.
SELECT ocjena*10, COUNT(*)
FROM ispit
GROUP BY 1
-- ne smije se napisati GROUP BY ocjena*10
Primjer: ispis ifri predmeta i broja poloenih ispita, ali samo onih predmeta za koje je poloeno vie od dva
ispita.
SELECT sifPred, COUNT(*)
FROM ispit
WHERE ispit.ocjena > 1
GROUP BY sifPred
HAVING COUNT(*) > 2
WHERE dio naredbe odreuje koje n-torke e formirati grupe (samo poloeni ispiti). GROUP BY lista odreuje
strukturu grupa tj. po kojim atributima se obavlja grupiranje n-torki (sve n-torke koje imaju jednaku ifru
predmeta ulaze u jednu grupu). HAVING dio naredbe odreuje koje od nastalih grupa e biti prihvaene kao
rezultat (samo one grupe u kojima je broj n-torki, tj. COUNT(*) vei od dva). Ispisuje se po jedan zapis za
svaku grupu koja zadovoljava taj uvjet.
Sljedea slika prikazuje povezanost WHERE, GROUP BY i HAVING dijela SELECT naredbe:
sifPred
1071
1071
1095
1095
1095
2091
2091
2091
2091
2091
5048
5048
5048
5048
ocjena
3
2
4
1
1
1
3
5
2
3
4
1
5
4
WHERE
sifPred
1071
1071
1095
2091
2091
2091
2091
5048
5048
5048
43
GROUP BY
sifPred (count)
1071
2
1095
1
2091
4
5048
3
HAVING
sifPred (count)
2091
4
5048
3
U HAVING dijelu naredbe doputeno je koristiti uvjete s podupitima na jednak nain kao to se koriste i u
WHERE Clause.
Primjer: ispisati ifre predmeta za koje je prosjek ocjena vei od ukupnog prosjeka ocjena.
SELECT sifPred
FROM ispit
GROUP BY sifPred
HAVING AVG(ocjena) > (SELECT AVG(ocjena) FROM ispit)
datIspit
13.01.1996
21.11.1995
Funkcijske zavisnosti oblika X Y u kojima skup Y sadri vie od jednog atributa, npr. Y = { A, B }, nije mogue
ispitati na ovaj nain, budui da nije doputena uporaba HAVING COUNT(DISTINCT A, B). Meutim, u takvim
se sluajevima mogu pojedinano ispitati funkcijske zavisnosti X A i X B, te ukoliko one vrijede, koritenjem
pravila o aditivnosti, zakljuiti da vrijedi i funkcijska zavisnost X Y.
44
Rezultat SELECT naredbe se moe poredati (sortirati) prema izrazima iz liste za selekciju. Iza kljune rijei
ORDER BY navode se atributi ili redni brojevi izraza ili alias imena izraza prema kojima se obavlja sortiranje.
Opcionalno se uz svaki izraz moe navesti smjer sortiranja - kljuna rije ASC ili DESC. ASC (kratica za
ascending) znai da e se poredak obaviti u uzlaznom smjeru, a DESC (kratica za descending) u silaznom. Ukoliko
se smjer sortiranja ne navede, smatra se da se sortiranje obavlja uzlazno.
SELECT nazMjesto, prezStud
FROM stud, mjesto
WHERE stud.pbrStan = mjesto.pbr
ORDER BY nazMjesto DESC, prezStud ASC
nazMjesto
Zagreb
Zagreb
Rijeka
Rijeka
Rijeka
prezStud
Abram
Kolar
Jambrek
Kolar
Novak
ORDER BY lista se moe napisati skraeno, tako da se umjesto imena atributa ili izraza koriste redni brojevi izraza
iz liste za selekciju. ORDER BY lista u prethodnom upitu mogla bi se napisati ovako:
ORDER BY 1 DESC, 2 ASC
Sortiranje se moe obaviti jedino po atributima ili izrazima navedenim u listi za selekciju.
SELECT nazMjesto, prezStud
FROM stud, mjesto
WHERE stud.pbrStan = mjesto.pbr
ORDER BY nazMjesto DESC, prezStud ASC, imeStud ASC
Sortiranje se moe obaviti prema podnizu nekog atributa tipa koji je tipa niza znakova.
SELECT nazMjesto, prezStud
FROM stud, mjesto
WHERE stud.pbrStan = mjesto.pbr
ORDER BY nazMjesto[2,5]
Sortiranje se moe obaviti i prema izrazima (Expression) iz liste za selekciju, ali se u tom sluaju u listi atributa
za poredak moraju koristiti ili redni brojevi ili alias imena atributa/izraza iz liste za selekciju.
SELECT sifPred, ocjena*10
FROM ispit
ORDER BY 2
SELECT sifPred, ocjena*10 umnozak
FROM ispit
ORDER BY umnozak
45
Kvalifikator FIRST max moe se korisno upotrijebiti u kombinaciji s ORDER BY. Mogue je npr. dohvatiti deset
studenata s najboljim (ili najloijim) prosjekom
SELECT FIRST 10 mbrStud, AVG(ocjena) prosjek
FROM ispit
GROUP BY mbrStud
ORDER BY prosjek DESC -- ili ASC, za 10 studenata s najloijim prosjekom
Korisnik koji je izveo prethodnu naredbu moe privremenu relaciju prosjeci s atributima mbrStud i
prosjecnaOcjena koristiti kao bilo koju drugu relaciju, sve do trenutka kada program terminira ili dok relaciju
prosjeci ne uniti pomou naredbe DROP TABLE. Npr.
SELECT MAX(prosjecnaOcjena)
FROM prosjeci
46
ako je nad relacijom R kreiran indeks za atribut A, moe se nesekvencijalno pristupiti do n-torki uz koritenje
atributa A kao kljua za dohvat.
ako je nad relacijom R kreiran kompozitni indeks za npr. atribute A, B, C, do n-torke se moe pristupiti
koritenjem bilo koje od navedenih kombinacija atributa kao kljua za dohvat - A, AB, ABC.
Prilikom postavljanja upita u jeziku SQL, sustav sam odreuje koji e se od indeksa iskoristiti za pristup. Ukoliko
odgovarajueg indeksa nema, pristup n-torkama moe biti jedino sekvencijalan.
Osim radi poboljanja performanci sustava, indeksi se kreiraju i radi osiguranja jedinstvenosti vrijednosti atributa u
relaciji (npr. u relaciji mjesto ne smiju postojati dva grada s potanskim brojem jednakim 10000).
Jedinstvenost vrijednosti u indeksu
Ukoliko je indeks kreiran kao indeks s jedinstvenim vrijednostima (distinct index), sustav ne doputa da se u relaciji
pojave dvije n-torke koje bi imale jednake vrijednosti atributa nad kojim je izgraen takav indeks. Ovakva
karakteristika indeksa koristi se za osiguravanje jedinstvenosti kljua u relaciji.
Utjecaj poretka vrijednosti u indeksu na mogunost koritenja indeksa za sortiranje
Indeks moe biti izgraen tako da su vrijednosti u indeksnim blokovima poredane od manjih prema veim, ili
obratno. SUBP moe indeks pretraivati od naprijed ili straga, tako da se indeks moe koristiti za sortiranje zapisa u
smjeru u kojem su poredane vrijednosti u indeksnim blokovima, ali i u obrnutom smjeru. To znai da poredak
vrijednosti u indeksnim blokovima indeksa sastavljenih od samo jednog atributa nije bitan. Ako je indeks sastavljen
od vie atributa, te se prema tim atributima obavlja sortiranje, o poretku vrijednosti u indeksu ovisi mogunost
koritenja tog indeksa prilikom sortiranja. Npr. ukoliko je indeks kreiran za atribute x DESC, y DESC, tada se taj
indeks moe koristiti za sortiranje u smjeru x DESC, y DESC, te za sortiranje u smjeru x ASC, y ASC, ali ne i za
sortiranje oblika x ASC, y DESC ili x DESC, y ASC. Indeks koji omoguava posljednja dva navedena oblika
sortiranja je indeks oblika: x DESC, y ASC (takoer je to mogue ostvariti i indeksom oblika: x ASC, y DESC).
Uporaba indeksa
Opi oblik naredbe za kreiranje indeksa je sljedei:
Primjer:
CREATE DISTINCT INDEX uniqueZupanija ON zupanija (nazZupanija)
47
Listovi B-stabla esto su povezani dodatnim pokazivaima (na slici crtkano) da bi se omoguio dohvat zapisa
iji klju pripada nekom intervalu vrijednosti (npr. za upit koji sadri uvjet dohvata oblika: ime_stud
BETWEEN 'Davor' AND 'Nada').
48
Prilikom kreiranja indeksa treba voditi rauna i o nekim njihovim negativnim aspektima, te ih treba koristiti samo
tamo gdje je njihova uporaba opravdana, jer:
- indeksi zauzimaju znaajan prostor
- auriranje vrijednosti atributa nad kojima je izgraen indeks traje znatno dulje nego auriranje vrijednosti nad
kojima nema indeksa (ovdje treba razlikovati atribute prema kojima se pronalaze n-torke koje treba aurirati,
od atributa ije se vrijednosti auriraju)
Indekse ne bi trebalo primjenjivati ukoliko:
- vrijednosti atributa za kojeg se gradi indeks imaju relativno mali broj razliitih vrijednosti (npr. spol_osobe s
doputenim vrijednostima M, , u relaciji s 30 000 n-torki)
- u relaciji predstoji velik broj upisa, izmjena ili brisanja n-torki. Preporuljivo je u takvim sluajevima
postojee indekse izbrisati, te ih ponovo izgraditi tek nakon obavljenih promjena na podacima
- relacija sadri vrlo mali broje n-torki (npr. do stotinu). U takvim sluajevima sustav lake pristupa
sekvencijalnom pretragom, nego prolaskom kroz strukturu B-stabla
6. INSERT naredba
6.1 Naini koritenja INSERT naredbe
Naredba je namijenjena za upis jedne ili vie n-torki u relaciju. Opi oblik INSERT naredbe je definiran sljedeim
sintaksnim dijagramima:
Lista s nazivima atributa (column name) navodi se u sluaju kada je redoslijed vrijednosti koje se upisuju u
relaciju razliit od redoslijeda atributa u relaciji ili se ne namjeravaju navesti sve vrijednosti za n-torku. Oblikom
INSERT naredbe s VALUES Clause upisuje se jedna n-torka, dok se drugim oblikom (koritenjem SELECT
Statement) upisuju sve n-torke koje su dobivene kao rezultat navedene SELECT naredbe. SELECT naredba kojom
se odreuju n-torke za upis u relaciju ne smije u svom FROM dijelu sadravati ime relacije u koju se podaci
upisuju. Takoer, SELECT naredba ne smije sadravati INTO TEMP Clause niti ORDER BY Clause.
CREATE TABLE mjestoStanovanja (
pbr
INTEGER
, nazMjesto
CHAR(40)
);
49
Primjeri:
INSERT INTO mjestoStanovanja VALUES (10000, 'Zagreb')
INSERT INTO mjestoStanovanja (nazMjesto, pbr) VALUES ('Zagreb', 10000)
INSERT INTO mjestoStanovanja (pbr) VALUES (10000)
U prethodnoj naredbi e za naziv mjesta bit e postavljen NULL. Ukoliko bi uz atribut nazMjesto,
prilikom definicije relacije, bila definirana default vrijednost, za naziv mjesta bi bila postavljena ta
default vrijednost, a ne NULL.
INSERT INTO mjestoStanovanja
SELECT DISTINCT mjesto.pbr, mjesto.nazMjesto
FROM mjesto, stud
WHERE mjesto.pbr = stud.pbrStan
INTO
INTO
INTO
INTO
INTO
INTO
stavka
stavka
stavka
stavka
stavka
stavka
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
(0,
(0,
(200,
(0,
(200,
(0,
'1.
'2.
'3.
'4.
'5.
'6.
stavka')
stavka')
stavka')
stavka')
stavka')
stavka')
1
2
200
201
200
202
1.
2.
3.
4.
5.
6.
stavka
stavka
stavka
stavka
stavka
stavka
7. DELETE naredba
Naredbom se brie jedna ili vie n-torki iz relacije. Opi oblik naredbe je:
Condition odreuje koje n-torke e biti obrisane. Ukoliko se uvjet ne navede, sve n-torke iz relacije e biti obrisane.
Uvjet moe biti sastavljen kao i u WHERE dijelu SELECT naredbe, ali ne smije sadravati podupite koji bi u svom
FROM dijelu sadravali relaciju iz koje se zapisi briu.
Primjer: brisanje svih n-torki iz relacije zupanija, ije se ifre ne koriste u relaciji mjesto
DELETE FROM zupanija
WHERE sifZupanija NOT IN
( SELECT sifZupanija FROM mjesto )
50
8. UPDATE naredba
SQL naredba za izmjenu jedne ili vie vrijednosti atributa u jednoj ili vie n-torki relacije. Opi oblik naredbe je:
Pomou sljedeih primjera ilustrirani su karakteristini naini pridruivanja vrijednosti atributima relacije.
Primjer: aurira se relacija s imenom table. Atributu atr1 pridruuje se vrijednost izraza expr1, a atributu atr2
vrijednost izraza expr2. Atributu atr3 pridruuje se vrijednost dobivena pomou SELECT naredbe.Auriraju se one
n-torke relacije table koje zadovoljavaju navedeni condition.
UPDATE table SET atr1 = expr1,
atr2 = expr2,
atr3 = (SELECT expr3 FROM ... WHERE ...)
WHERE condition
Primjer: aurira se relacija s imenom table. Atributu atr4 pridruuje se vrijednost izraza expr4, a atributu atr5
vrijednost dobivena SELECT naredbom. Atributima atr6 i atr7 pridruuju se vrijednosti koje su dobivene jednom
SELECT naredbom. Auriraju se one n-torke relacije table koje zadovoljavaju navedeni condition.
UPDATE table SET (atr4, atr5) = (expr4, (SELECT expr5 FROM ... WHERE ...)),
(atr6, atr7) = ((SELECT expr6, expr7 FROM ... WHERE ...))
WHERE condition
Primjer: aurira se relacija s imenom table. U ovom primjeru se umjesto taksativnog navoenja imena svih atributa
relacije koristi zvjezdica. Znaenje naredbe je: vrijednosti atributa relacije table postaviti na vrijednosti koje su
navedene na desnoj strani znaka =. Redoslijed pridruivanja vrijednosti je jednak redoslijedu atributa prilikom
definiranja relacije table.
UPDATE table SET * = ( expr1,
expr2,
(SELECT expr3 FROM ... WHERE ...),
expr4, (SELECT expr5 FROM ... WHERE ...),
(SELECT expr6, expr7 FROM ... WHERE ...)
)
WHERE condition
51
SELECT naredba kojom se odreuje nova vrijednost smije vratiti samo jednu n-torku. U listi za selekciju treba biti
onoliko atributa ili izraza koliko je potrebno da bi se odgovarajui broj novih vrijednosti pridruio odgovarajuem
broju atributa relacije koja se aurira.
Pomou Condition odreuje se koje e n-torke biti aurirane. Ukoliko se uvjet ne navede, bit e aurirane sve
n-torke iz relacije. WHERE uvjet moe sadravati podupite, ali oni ne smiju u svom FROM dijelu sadravati
relaciju ije se n-torke auriraju, to znai da se ne smije obavljati upit nad relacijom iji se zapisi mijenjaju.
Primjer: svim n-torkama u relaciji mjesto, iji je potanski broj vei od 30000, nazive mjesta promijeniti tako da
se ispred postojeeg naziva doda znakovna konstanta 'GRAD-', a potanski broj uveati za 10. Prikazana su tri
oblika rjeenja:
UPDATE mjesto
SET nazMjesto = 'GRAD-' || nazMjesto
, pbr = pbr + 10
WHERE pbr > 30000
UPDATE mjesto
SET * = (pbr + 10, 'GRAD-' || nazMjesto, sifZupanija)
WHERE pbr > 30000
UPDATE mjesto
SET (nazMjesto, pbr) =
('GRAD-' || nazMjesto, pbr + 10)
WHERE pbr > 30000
Poveanje koeficijenta za iznos od 0.5 za sve nastavnike kojima je koeficijent izmeu 2.5 i 3.5, a u posljednje 3
godine obavili su vie od 5 ispita.
UPDATE nastavnik SET koef = koef + 0.5
WHERE koef BETWEEN 2.5 AND 3.5 AND
sifNastavnik IN (
SELECT sifNastavnik
FROM ispit
WHERE datIspit >=
MDY(MONTH(TODAY),DAY(TODAY),YEAR(TODAY)-3)
GROUP BY sifNastavnik
HAVING COUNT(*) > 5
)
U sljedeem primjeru prikazano je kako se u relaciji mjesto, stari potanski brojevi mogu zamijeniti novim, uz
pomo vrijednosti iz tablice za konverziju.
Mjesto
Konverzija
pbr
41000
51400
52000
54000
stariPbr
41000
51400
52000
54000
nazMjesto
ZAGREB
PAZIN
PULA
OSIJEK
noviPbr
10000
52000
52100
31000
noviNazMjesto
Zagreb
Pazin
Pula
Osijek
52
Napomena: ukoliko je nad potanskim brojem u relaciji mjesto izgraen DISTINCT indeks, potrebno ga je, uz
ovakav sadraj relacija, prije obavljanja gornje naredbe unititi (vidjeti zapise PULA i PAZIN). Nakon
obavljanja naredbe moe se indeks ponovno izgraditi.
Sljedeim se upitom istovremeno zamjenjuju i nazivi mjesta novim sadrajem.
UPDATE mjesto SET (pbr, nazMjesto) = ((SELECT noviPbr, noviNazMjesto
FROM konverzija
WHERE stariPbr = mjesto.pbr))
U sintaksnim dijagramima se esto kao alternativa za koritenje relacije (tablice) nudi mogunost koritenja pogleda
(virtualne tablice, view). Pogled je objekt u bazi podataka ije je ponaanje i upotreba vrlo slina ponaanju i
upotrebi relacija.
Sadraj i shema pogleda odreeni su pomou SELECT naredbe. Uz pomo liste naziva kolona (column name)
mogu se eksplicitno definirati nazivi atributa pogleda (inae se kao nazivi atributa pogleda uzimaju nazivi atributa iz
SELECT naredbe).
Primjer: kreiranje pogleda koji sadri zapise iz relacije stud ije je mjesto stanovanja grad 'Bjelovar'
CREATE VIEW studStanBjelovar AS
SELECT stud.* FROM stud, mjesto
WHERE stud.pbrStan = mjesto.pbr
AND mjesto.nazMjesto = 'Bjelovar'
"Sadraj" pogleda evaluira se u trenutku izvoenja upita na temelju sadraja objekta (obino se radi o relaciji) nad
kojim je pogled definiran. Svaka promjena obavljena u "temeljnoj" relaciji, automatski se reflektira i na rezultatima
onih SQL naredbi u kojima se koristi pogled koji je nad "temeljnom" relacijom definiran.
Po tome se pogled bitno razlikuje od privremene relacije iji bi se sadraj dobio kopiranjem "temeljne" relacije jer
se promjene koje se obave nad temeljnom relacijom nakon kopiranja nee reflektirati na sadraj privremene relacije.
Opcijom WITH CHECK OPTION onemoguava se takva izmjena podataka koritenjem pogleda, kojom bi se
vrijednosti podataka postavile na vrijednosti koje ne bi zadovoljavale uvjet iz definicije pogleda.
53
ili
column IS NOT NULL
ISPLATA
sifra
NULL
1
NULL
1
NULL
2
2
2
datum
NULL
01.01.95
01.01.97
01.01.96
NULL
01.01.96
NULL
NULL
koef
0.5
1.0
1.5
NULL
2.0
2.5
NULL
3.0
iznos
50
100
200
250
NULL
300
NULL
300
datum
01.01.96
NULL
koef
NULL
NULL
iznos
250
NULL
datum
NULL
01.01.97
01.01.96
NULL
koef
0.5
1.5
2.5
3.0
iznos
50
200
300
300
SUM (x)
SUM (DISTINCT x)
AVG (x)
54
AVG (DISTINCT x)
MAX (x)
MIN (x)
RANGE (x)
STDEV (x)
VARIANCE (x)
bez obzira koristi li se kljuna rije DISTINCT, funkcije ignoriraju n-torke u kojima
x poprima vrijednost NULL i izraunavaju rezultat na temelju ostalih vrijednosti,
osim ako je vrijednost od x postavljena na NULL za sve n-torke: tada je rezultat
NULL.
Primjer:
ISPLATA
sifra
NULL
1
NULL
1
NULL
2
2
2
datum
NULL
01.01.95
01.01.97
01.01.96
NULL
01.01.96
NULL
NULL
koef
0.5
1.0
1.5
NULL
2.0
2.5
NULL
3.0
iznos
50
100
200
250
NULL
300
NULL
300
UPLATA
sifra
1
NULL
4
datum
01.01.90
01.01.93
01.01.95
koef
0.8
0.9
1.5
1200.00
NULL
iznos
400
150
NULL
datum
NULL
01.01.95
01.01.97
01.01.96
NULL
01.01.96
NULL
NULL
koef
0.5
1.0
1.5
NULL
2.0
2.5
NULL
3.0
iznos
50
100
200
250
NULL
300
NULL
300
datum
NULL
01.01.97
01.01.95
01.01.96
NULL
01.01.96
(count(*))
2
1
1
1
2
1
55
i
WHERE expression NOT IN (subquery).
Ukoliko je rezultat podupita skup vrijednosti u kojima se nalazi i NULL vrijednost, rezultat evaluacije uvjeta za
dohvat u oba gore navedena sluaja e uvijek biti NULL vrijednost, te se n-torka vanjskog upita nee pojaviti u
rezultatu.
Primjeri:
ISPLATA
sifra
NULL
1
NULL
1
NULL
2
2
2
datum
NULL
01.01.95
01.01.97
01.01.96
NULL
01.01.96
NULL
NULL
koef
0.5
1.0
1.5
NULL
2.0
2.5
NULL
3.0
UPLATA
sifra
1
NULL
4
iznos
50
100
200
250
NULL
300
NULL
300
datum
01.01.90
01.01.93
01.01.95
koef
0.8
0.9
1.5
iznos
400
150
NULL
datum
01.01.90
01.01.93
koef
0.8
0.9
iznos
400
150
nema zapisa
datum
01.01.90
koef
0.8
iznos
400
nema zapisa
56
Primjer:
ISPLATA
sifra
NULL
1
NULL
1
NULL
2
2
2
datum
NULL
01.01.95
01.01.97
01.01.96
NULL
01.01.96
NULL
NULL
koef
0.5
1.0
1.5
NULL
2.0
2.5
NULL
3.0
iznos
50
100
200
250
NULL
300
NULL
300
datum
NULL
NULL
01.01.97
01.01.95
01.01.96
NULL
NULL
01.01.96
koef
0.5
2.0
1.5
1.0
NULL
3.0
NULL
2.5
iznos
50
NULL
200
100
250
300
NULL
300
prezime
Horvat
Kolar
Novak
MJESTO
pbr
10000
51000
31000
pbr
10000
21000
51000
nazMjesto
Zagreb
Rijeka
Osijek
Ukoliko za n-torku iz relacije stud ne postoji odgovarajua n-torka iz relacije mjesto, dotina se n-torka nee
pojaviti u rezultatu. Jednako tako, ako za n-torku iz relacije mjesto ne postoji odgovarajua n-torka u relaciji
stud, ta n-torka iz relacije mjesto se nee pojaviti u rezultatu.
STUD
mbr
1
3
prezime
Horvat
Novak
pbr
10000
51000
pbr
nazMjesto
10000 Zagreb
51000 Rijeka
57
Dio sintaksnog dijagrama za FROM Clause (vidjeti dijagram u poglavlju o spajanju relacija) koji sadri
poddijagram ANSI Table Reference moe se koristiti za definiranje prirodnog spajanja, spajanja uz uvjet, a
takoer i za definiranje vanjskog spajanja.
Sljedei primjer pokazuje kako se poddijagram ANSI Table Reference koristi za definiranje "obinog" prirodnog
spajanja. Upit iz prethodnog primjera ovaj je put napisan uz koritenje samo onog dijela dijagrama za FROM
Clause koji sadri poddijagram ANSI Table Reference:
SELECT stud.*, mjesto.*
FROM stud INNER JOIN mjesto
ON stud.pbr = mjesto.pbr
U WHERE dijelu SELECT naredbe se ne piu uvjeti spajanja, nego samo eventualni uvjeti za selekciju (tzv,
post-join filter). U sljedeem primjeru e se relacije stud i mjesto spojiti prema uvjetu napisanom u ON Clause
dijelu naredbe, a konani rezultat upita e se dobiti nakon primjene uvjeta selekcije iz WHERE Clause dijela
naredbe:
SELECT stud.*, mjesto.*
FROM stud INNER JOIN mjesto
ON stud.pbr = mjesto.pbr
WHERE stud.prezStud LIKE 'Z%'
Prema sintaksnom dijagramu, doputeno je umjesto INNER JOIN napisati samo JOIN. Sljedei upit daje jednak
rezultat kao i upit u prethodnom primjeru:
SELECT stud.*, mjesto.*
FROM stud JOIN mjesto
ON stud.pbr = mjesto.pbr
WHERE stud.prezStud LIKE 'Z%'
58
Za definiranje SELECT naredbi u kojima se koristi samo prirodno spajanje i spajanje uz uvjet i dalje se moe
koristiti dio sintaksnog dijagrama FROM Clause koji ne sadri poddijagram ANSI Table Reference. Primjer s
takvom sintaksom naredbe nalazi se na samom poetku ovog poglavlja. Meutim, kad se u naredbi koristi makar
jedno vanjsko spajanje, mora se koristiti samo ona grana dijagrama FROM Clause koja sadri poddijagram
ANSI Table Reference.
Kod vanjskog spajanja relacije se tretiraju nesimetrino. Jedna je dominantna, te se njene n-torke pojavljuju u
rezultatu bez obzira postoji li odgovarajua n-torka u podreenoj relaciji. U sljedeem upitu stud je
dominantna, a mjesto podreena relacija:
SELECT stud.*, mjesto.*
FROM stud LEFT OUTER JOIN mjesto
ON stud.pbr = mjesto.pbr
STUD
mbr prezime
1
Horvat
2
Kolar
3
Novak
pbr
10000
21000
51000
pbr
10000
NULL
51000
nazMjesto
Zagreb
NULL
Rijeka
Napomena: u primjerima se za prikaz NULL vrijednosti koristi oznaka NULL. U interaktivnim alatima za
obavljanje SQL naredbi se ta vrijednost obino prikazuje kao prazan prostor.
Kod vanjskog spajanja relacija koja se spaja moe biti:
dominantna (dominant, preserved) - njene se n-torke (ukoliko zadovoljavaju eventualno postavljeni uvjet
za selekciju u WHERE dijelu naredbe) pojavljuju u rezultatu bez obzira postoji li odgovarajua n-torka u
podreenoj relaciji.
podreena (subservient). Njezine se n-torke pojavljuju jedino u sluaju kada zadovoljavaju uvjet spajanja
(u dijelu naredbe kojim se definiraju uvjeti spajanja, tj. ON Clause)
Ukoliko za n-torku dominantne relacije ne postoji odgovarajua n-torka podreene relacije (tj. n-torka
koja zadovoljava uvjet spajanja definiran u ON Clause dijelu naredbe), u rezultatu se kao vrijednosti
atributa podreene relacije pojavljuju NULL vrijednosti.
Uvjet spajanja iz ON Clause dijela naredbe ne utjee na to hoe li se n-torka dominantne relacije pojaviti
u rezultatu ili ne - sve n-torke dominantne relacije koje zadovoljavaju uvjet selekcije iz WHERE Clause
dijela naredbe se pojavljuju u rezultatu. Uvjet spajanja iz ON Clause dijela naredbe odreuje jedino to
e se dogoditi s n-torkama podreene relacije.
Prema sintaksnom dijagramu, mogue je umjesto LEFT OUTER JOIN napisati samo LEFT JOIN. Znaenje je
jednako. Tako se npr., prethodni primjer moe napisati i ovako:
SELECT stud.*, mjesto.*
FROM stud LEFT JOIN mjesto
ON stud.pbr = mjesto.pbr
11.1 Razlika izmeu uvjeta spajanja i uvjeta selekcije u upitima s vanjskim spajanjem
U uvjetima s vanjskim spajanjem naroitu pozornost treba pokloniti razlici izmeu uvjeta spajanja i uvjeta za
selekciju. Uvjeti koji su napisani u ON Clause dijelu naredbe su uvjeti spajanja, a uvjeti napisani u WHERE
Clause dijelu naredbe su uvjeti selekcije (post-join filter).
SELECT stud.*, mjesto.*
FROM stud LEFT OUTER JOIN mjesto
ON stud.pbr = mjesto.pbr
59
STUD
mbr prezime
1
Horvat
2
Kolar
3
Novak
pbr
10000
21000
51000
pbr
10000
NULL
51000
nazMjesto
Zagreb
NULL
Rijeka
pbr
21000
51000
pbr
nazMjesto
NULL NULL
51000 Rijeka
pbr
10000
21000
51000
pbr
NULL
NULL
51000
nazMjesto
NULL
NULL
Rijeka
Primijetite da u prethodnom primjeru uvjetom stud.pbr <> 10000 nije eliminirana prva n-torka. Prva n-torka
nije eliminirana jer je uvjetima iz ON Clause dijela naredbe opisan samo uvjet spajanja, koji kod vanjskog
spajanja ne utjee na to hoe li se n-torka dominantne relacije pojaviti u rezultatu ili ne.
STUD
mbr prezime
1
Horvat
pbr
10000
pbr
naz_mjesto
10000 Zagreb
60
ISPIT
rbrIspit
1
2
3
4
mbrStud
2
3
3
4
mbrNastavnik
1
2
3
4
NASTAVNIK
mbrNastavnik
1
2
3
U rezultatu e se pojaviti sve n-torke iz relacije stud, a uz njih jedna ili vie n-torki iz ispit i nastavnik ukoliko
postoji odgovarajui rezultat spajanja relacija ispit i nastavnik. Za n-torke dominantne relacije stud, za koje ne
postoji odgovarajua n-torka nastala spajanjem relacija ispit i nastavnik, n-torka rezultata se nadopunjava s
NULL vrijednostima.
mbrStud
1
2
3
3
4
rbrIspit
NULL
1
2
3
NULL
mbrNastavnik
NULL
1
2
3
NULL
Primijetite da je rezultat sasvim razliit od rezultata koji bi se dobio spajanjem tih relacija uz malo promijenjen
redoslijed spajanja. Ovdje je prvo na relaciju stud vanjski spojena relacija ispit, a na dobiveni rezultat je
prirodno spojena relacija nastavnik.
SELECT stud.mbrStud, ispit.rbrIspit, nastavnik.mbrNastavnik
FROM stud
LEFT OUTER JOIN ispit
ON stud.mbrStud = ispit.mbrStud
INNER JOIN nastavnik
ON ispit.mbrNastavnik = nastavnik.mbrNastavnik
mbrStud
2
3
3
rbrIspit
1
2
3
mbrNastavnik
1
2
3
B) neka su zadane relacije R, S i T. Na dominantnu relaciju R vanjski se spaja relacija S, te se nezavisno o tom
spajanju, na dominantnu relaciju R vanjski spaja i relacija T
SELECT stud.mbrStud, ispit.rbrIspit, mjesto.pbr
FROM stud
LEFT OUTER JOIN ispit ON stud.mbrStud = ispit.mbrStud
LEFT OUTER JOIN mjesto ON stud.pbr = mjesto.pbr
61
STUD
mbrStud
1
2
3
4
5
ISPIT
rbrIspit
1
2
3
4
5
pbr
10000
20000
31000
21000
22000
mbrStud
3
4
4
5
5
MJESTO
pbr
20000
51000
21000
U rezultatu e se pojaviti sve n-torke iz relacije stud, a uz svaku takvu n-torku pojavit e se jedna ili vie n-torki
iz relacije ispit (ukoliko u relaciji ispit postoje odgovarajue n-torke), te jedna ili vie n-torki iz relacije mjesto
(ukoliko postoje odgovarajue n-torka u relaciji mjesto).
mbrStud
1
2
3
4
4
5
5
rbrIspit
NULL
NULL
1
2
3
4
5
pbr
NULL
20000
NULL
21000
21000
NULL
NULL
MJESTO
pbr
10000
20000
51000
22000
STUD
mbrStud
1
2
3
4
5
6
pbr
32000
20000
20000
20000
51000
22000
ISPIT
rbrIspit
1
2
3
4
mbrStud
1
5
5
4
U rezultatu e se pojaviti sve n-torke iz relacije mjesto, a uz njih jedna ili vie n-torke iz stud (ukoliko postoje
odgovarajue n-torka u stud). Pri tome e se uz svaku n-torku iz relacije stud pojaviti i jedna ili vie n-torki iz
relacije ispit (ukoliko postoje odgovarajue n-torka u relaciji ispit).
pbr
10000
20000
20000
20000
51000
51000
22000
mbrStud
NULL
2
3
4
5
5
6
rbrIspit
NULL
NULL
NULL
4
2
3
NULL
Sljedei primjeri ilustriraju prikazane oblike, A, B, C, vanjskog spajanja. U primjerima se koristi vanjsko
spajanje uz uvjet.
62
ZRAKOPLOV
tip
dolet
B747
6000
DC9
3000
B727
4500
AIRBUS 1800
PILOT
prezime
JOHNSON
SMITH
WALKER
tip
B747
AIRBUS
F16
LET
brLeta
CA-825
A-224
CA-878
udaljenost
7200
3300
4200
"obino" spajanje
SELECT * FROM zrakoplov, pilot, let
WHERE zrakoplov.tip = pilot.tip
AND zrakoplov.dolet >= let.udaljenost
tip
B747
B747
dolet
6000
6000
prezime
JOHNSON
JOHNSON
tip
B747
B747
brLeta
A-224
CA-878
udaljenost
3300
4200
dolet
6000
6000
1800
prezime
JOHNSON
JOHNSON
SMITH
tip
B747
B747
AIRBUS
brLeta
A-224
CA-878
NULL
udaljenost
3300
4200
NULL
sluaj A
SELECT *
FROM pilot
LEFT OUTER JOIN zrakoplov
INNER JOIN let
ON zrakoplov.dolet >= let.udaljenost
ON pilot.tip = zrakoplov.tip
prezime
JOHNSON
JOHNSON
SMITH
WALKER
tip
B747
B747
AIRBUS
F16
tip
B747
B747
NULL
NULL
dolet
6000
6000
NULL
NULL
brLeta
A-224
CA-878
NULL
NULL
udaljenost
3300
4200
NULL
NULL
sluaj B
SELECT *
FROM zrakoplov
LEFT OUTER JOIN pilot
ON zrakoplov.tip = pilot.tip
LEFT OUTER JOIN let
ON zrakoplov.dolet >= let.udaljenost
tip
B747
B747
DC9
B727
B727
AIRBUS
dolet
6000
6000
3000
4500
4500
1800
prezime
JOHNSON
JOHNSON
NULL
NULL
NULL
SMITH
tip
B747
B747
NULL
NULL
NULL
AIRBUS
brLeta
A-224
CA-878
NULL
A-224
CA-878
NULL
udaljenost
3300
4200
NULL
3300
4200
NULL
63
sluaj C
SELECT *
FROM pilot
LEFT OUTER JOIN zrakoplov
LEFT OUTER JOIN let
ON zrakoplov.dolet >= let.udaljenost
ON pilot.tip = zrakoplov.tip
prezime
JOHNSON
JOHNSON
SMITH
WALKER
tip
B747
B747
AIRBUS
F16
tip
B747
B747
AIRBUS
NULL
dolet
6000
6000
1800
NULL
brLeta
A-224
CA-878
NULL
NULL
udaljenost
3300
4200
NULL
NULL
64
1.1
Select Options
UNION
1.1
SELECT
Select Options
1.8
ORDER BY Clause
ALL
1.1. SELECT Options
1.2
1.4
Projection Clause
FROM Clause
1.5
WHERE Clause
1.6
HAVING Clause
ALL
1.3
1.16
Expression
SELECT List
FIRST
1.7
GROUP BY Clause
display_label
DISTINCT
max
*
table.
view.
1.9
FROM
AS
( subquery )
Table Reference
synonym.
alias.
1.10
1.14
GROUP BY
Column Name
,
1.16
ORDER BY
1.13
HAVING
Condition
ASC
table
DESC
synonym
Expression
alias
view
display_label
AS
1.11
Table Reference
Join Options
CROSS JOIN
1.9
Table Reference
1.9
Table Reference
ON
1.13
Condition
LEFT
RIGHT
OUTER
FULL
65
1.13. Condition
<
column
AND
<=
table.
1.15
>
Comparison Condition
>=
NOT
alias.
view.
1.18
synonym.
1.13
<>
Condition
1.12
Expression
Relational Operator
1.16
1.16
Expression
BETWEEN
Expression
1.16
1.16
AND
Expression
Expression
NOT
1.17
IN Condition
1.14
IS
Column Name
NULL
NOT
LIKE
quoted string
quoted string
NOT
1.14
ESCAPE 'char'
1.14
Column Name
Column Name
1.16. Expression
1.17. IN Condition
,
1.16
binary operator
IN
Expression
1.14
Column Name
constant
NOT
1.19
Conditional Expresion
1.16
IN
Expression
EXISTS
function expression
( subquery )
1.16
Expression
NULL
1.12
Relational Operator
( subquery )
ALL
1.16
( subquery )
NOT
aggregate expression
Expression
ANY
SOME
1.13
WHEN
1.16
THEN
Condition
Expression
ELSE
CASE
1.16
1.16
WHEN
Expression
Expression
THEN
1.16
END
Expression
1.16
Expression
ELSE
1.16
END
Expression
2. INSERT Statement
INSERT INTO
2.1
table
VALUES Clause
synonym
view
column
SELECT Statement
(subset)
constant
NULL
66
3. UPDATE Statement
3.1
UPDATE
table
SET Clause
1.5
synonym
WHERE Clause
view
SET
column
Expression
( singleton_select )
,
(
,
)
column
1.16
Expression
( singleton_select )
4. DELETE Statement
DELETE FROM
table
1.5
synonym
WHERE Clause
view
CREATE TABLE
table
Table Definition
5.2
Column Definition
,
5.5
Multiple-Column Constraint
5.2
Column Definition
Data Type
5.3
DEFAULT
5.4
Default Clause
Type
constant
Single-Column Constraint
UNIQUE
CONSTRAINT
constraint
CONSTRAINT
constraint
PRIMARY KEY
5.6
References Clause
5.7
Check Clause
,
(
UNIQUE
column
CONSTRAINT
PRIMARY KEY
FOREIGN KEY
constraint
,
(
column
5.6
References Clause
5.7
Check Clause
67
table
,
(
ON DELETE CASCADE
)
column
1.13
Condition
AS
view
,
(
column
SELECT Statement
(subset)
INDEX
UNIQUE
index
ON
table
synonym
column
ASC
DESC
68
NOT NULL
NOT NULL
INTEGER
NCHAR(25)
NCHAR(25)
INTEGER
INTEGER
DATE
CHAR(13)
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
INTEGER
NOT NULL
CHAR(8)
NCHAR(60) NOT NULL
INTEGER
INTEGER
INTEGER
DEFAULT 1
NOT
NOT
NOT
NOT
NOT
NULL
NULL
NULL
NULL
NULL
69
NOT NULL
DEFAULT 40
);
CREATE DISTINCT INDEX dvoranaUnique ON dvorana (oznDvorana);
CREATE TABLE rezervacija
( oznDvorana
CHAR(5)
, oznVrstaDan
CHAR(2)
, sat
SMALLINT
, sifPred
INTEGER
);
NOT
NOT
NOT
NOT
NULL
NULL
NULL
NULL
70