Baze podataka 1

Vežbe 8

Uvod

Na početku poglavlja o bazama podataka smo videli da smeštanje svih podataka u jednu veliku tabelu dovodi do redundantnosti, neefikasnosti i povećava mogućnost nastanka grešaka. Zbog toga su podaci u bazi podataka organizovani u više tabela.

Do kojeg nivoa je potrebno razdvajati tabele će se pričati na kraju kursa u delu koji se tiče normalizacije baze podataka.

Sa druge strane, svi dosadašnji upiti su čitali podatke isključivo iz jedne tabele. U mnogim situacijama nam to nije dovoljno, već je potrebno da se podaci iz dve ili više tabela povežu i prikažu zajedno u rezultatu.

Implicitno spajanje

Prvi način da se dve ili više tabela spoje je tzv. implicitno spajanje. Naime, ako se nakon FROM navede više tabela razdvojenih zarezima, izračunava se njihov Dekartov proizvod. U slučaju dve tabele to znači da se svaka vrsta prve tabele kombinuje sa svakom vrstom druge tabele. U slučaju više tabela svaka takva vrsta bi se kombinovala sa svakom vrstom naredne tabele, itd.

SELECT *
FROM [Nastavnici] n, [Angazovanje] a
Snast Ime Snast Spred Ssmer
1 Petrović 1 1 NULL
1 Petrović 1 19 2
1 Petrović 2 2 NULL
1 Petrović 2 11 NULL
1 Petrović 3 3 NULL
1 Petrović 3 4 NULL
1 Petrović 4 5 NULL
1 Petrović 4 9 NULL

Vidimo da se svaki red iz tabele Nastavnici spojio sa svakim redom iz tabele Angazovanje.

Tako dobijenu tabelu mozemo filtrirati da nam uzme samo one redove.

Zadatak: izlistati imena nastavnika i sifre predmeta koje predaju.

U upitu iznad, dodacemo uslov tako da nam ostanu samo nastavnici i njihovi predmeti koji oni predaju.

SELECT *
FROM [Nastavnici] n, [Angazovanje] a
WHERE n.[Snast] = a.[Snast]
Snast Ime Snast Spred Ssmer
1 Petrović 1 1 NULL
1 Petrović 1 19 2
2 Tomić 2 2 NULL
2 Tomić 2 11 NULL
3 Marić 3 3 NULL
3 Marić 3 4 NULL
4 Marković 4 5 NULL
4 Marković 4 9 NULL
5 Nikolić 5 6 NULL

JOIN

U bazama podataka postoji nekoliko različitih operatora spajanja: INNER JOIN, CROSS JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN.

Oni se uglavnom razlikuju po tome šta se dešava u situaciji kada u jednoj od spojenih tabela ne postoji red koji bi trebalo spojiti.

Alt text

INNER JOIN

INNER JOIN klauzula bira redove koji imaju podudarajuće vrednosti u obe tabele.

JOIN klauzula se koristi za spajanje redova iz dve ili više tabela, bazirano na povezanoj koloni između njih.

Zadatak: izlistati imena nastavnika i sifre predmeta koje predaju.

SELECT *
FROM [Nastavnici] n
INNER JOIN [Angazovanje] a
ON n.[Snast] = a.[Snast]

LEFT JOIN

Ključna reč LEFT JOIN vraća sve zapise iz leve tabele i podudarajuće zapise iz desne tabele.Ako nema podudaranja, rezultat je 0 zapisa sa desne strane .

SELECT *
FROM [Nastavnici] n
LEFT JOIN [Angazovanje] a
ON n.[Snast] = a.[Snast]

RIGHT JOIN

Ključna reč RIGHT JOIN vraća sve zapise iz desne tabele i podudarajuće zapise iz leve tabele. Rezultat su 0 zapisa sa leve strane ako nema podudaranja.

SELECT *
FROM [Nastavnici] n
RIGHT JOIN [Angazovanje] a
ON n.[Snast] = a.[Snast]

FULL OUTER JOIN

SELECT *
FROM [Nastavnici] n
FULL OUTER JOIN [Angazovanje] a
ON n.[Snast] = a.[Snast]

SELECT *
FROM [Nastavnici] n
FULL JOIN [Angazovanje] a
ON n.[Snast] = a.[Snast]

CROSS JOIN

CROSS JOIN spaja svaki red jedne tabele sa svakim redom druge tabele. Ovo je dekartov proizvod dve tabele.

SELECT *
FROM [Nastavnici] n
CROSS JOIN [Angazovanje] a
WHERE n.[Snast] = a.[Snast]

VIEW

Primetili smo da se neki upiti često koriste kao osnova za izdvajanje određenih podataka. Na primer, često je potrebno spojiti dve ili više tabela, da bi se nad spojenim tabelama vršili različiti dalji upiti.

Sistemi za upravljanje bazama podataka omogućavaju da se često korišćeni upiti zapamte kao posebni pogledi na bazu podataka. Poglede možemo da shvatimo kao fiktivne tabele, koje se u kasnijim upitima SELECT mogu koristiti kao i sve ostale tabele. Pogledi nisu zaista sačuvani u bazi kao tabele, već se upit koji ih koristi integriše sa upitom kojim se pogled definiše i tako dobijeni kombinovani upit se optimizuje i izvršava. Pogledi se mogu koristiti samo za čitanje podataka i upis podataka u pogled nije moguć (jer pogledi nisu prave tabele). Kreiranje pogleda vrši se upitom narednog oblika:

Na primer, želimo da vršimo različite vrste upita nad studentima informatike. Sve studente koji studiraji informatiku možemo dobiti kao:

SELECT [Indeks], [Upisan], [Imes]
FROM [Studenti]
WHERE [Ssmer] IN (
                    SELECT [Ssmer]
                    FROM [Smer]
                    WHERE [Nazivs] LIKE '%Informatika%'
                 );
Indeks Upisan Imes
2 2001 Sanja
3 2001 Tanja
4 2000 Pavle
5 2001 Marko
5 2002 Sima
6 2001 Ivan
15 2002 Ana
18 2003 Saša

Ako bismo sada želeli da tražimo prosečne ocene, najveće ocene, koliko datih ispita ima student i slično, mi bismo svaki put morali da u naš upit dodamo isti ovaj upit koji će tražiti sve studente informatike.

Kako ne bismo to radili stalno, mi ćemo kreirati pogled nad ovim upitom.

CREATE VIEW [StudentiInformatike]
AS
SELECT [Indeks], [Upisan], [Imes], [Mesto]
FROM [Studenti]
WHERE [Ssmer] IN (
                    SELECT [Ssmer]
                    FROM [Smer]
                    WHERE [Nazivs] LIKE '%Informatika%'
                 );

CREATE je DDL naredba. Više reči o DDL naredbama će biti na sledećim časovima

I sada, ako bismo smo želeli da vidimo koliko studenata informatike dolazi iz Kragujevca, to možemo odraditi na sledeći način:

SELECT COUNT(*) as Ukupno
FROM [StudentiInformatike]
WHERE [Mesto] LIKE 'Kragujevac'
Ukupno
0

ZADACI