Predmet: INFORMACIONI SISTEMI II 1 Predava Predava č: č: Dr Dr Miroslav Medenica Miroslav Medenica
Predmet: INFORMACIONI SISTEMI II
1
PredavaPredavač:č:Dr Dr Miroslav MedenicaMiroslav Medenica
Unije, preseci, razlike (Unions, intersections, differences)
Podupiti, agregacjije, nule (Subqueries, Aggregations, NULLs)
Modifikovanje baze, indeksi, pogledi (Indexs, Views)
2
3
(SELECT Ime FROM Kupac WHERE Grad=“Kragujevac”)
UNION
(SELECT Ime FROM Kupac, Kupovina WHERE Kupac=Ime AND Prodavnica=“Com”)
(SELECT Ime FROM Kupac WHERE Grad=“Kragujevac”)
UNION
(SELECT Ime FROM Kupac, Kupovina WHERE Kupac=Ime AND Prodavnica=“Com”)
Na sličan način mogu se koristiti INTERSECT i EXCEPT.Mora se imati isti naziv atributa (u suprotnom: promeniti ime).
4
(SELECT Ime FROM Kupac WHERE Grad=“Kragujevac”)
UNION ALL
(SELECT Ime FROM Kupac, Kupovina WHERE Kupac=Ime AND Prodavnica=“Com”)
(SELECT Ime FROM Kupac WHERE Grad=“Kragujevac”)
UNION ALL
(SELECT Ime FROM Kupac, Kupovina WHERE Kupac=Ime AND Prodavnica=“Com”)
Podupit koji daje jednu vrednost
U ovom slučaju podupit daje jednu vrednost.
Ukoliko daje više onda je to run-time error.
5
SELECT Kupovina.ProizvodFROM KupovinaWHERE Kupac = (SELECT Ime FROM Kupac WHERE JMBG = ‘2907971920010‘);
SELECT Kupovina.ProizvodFROM KupovinaWHERE Kupac = (SELECT Ime FROM Kupac WHERE JMBG = ‘2907971920010‘);
Isto se može napisati i bez podupita:
Ovo je ekvivalentno prethodnom uputu kada je JMBG ključ i kada JMBG = ‘2907971920010‘ postoji u bazi podataka inače su različiti.
6
SELECT Kupovina.ProizvodFROM Kupovina, KupacWHERE Kupac = Ime AND JMBG = ‘2907971920010‘
SELECT Kupovina.ProizvodFROM Kupovina, KupacWHERE Kupac = Ime AND JMBG = ‘2907971920010‘
7
SELECT Kompanije.Naziv FROM Kompanije, Proizvodi WHERE Kompanije.Ime = Proizvodi.Proizvodjac AND Proizvodi.ime ININ (SELECT Kupovina.Proizvod FROM Kupovina WHERE Kupovina.Kupac = ‘Mika Mikić‘);
SELECT Kompanije.Naziv FROM Kompanije, Proizvodi WHERE Kompanije.Ime = Proizvodi.Proizvodjac AND Proizvodi.ime ININ (SELECT Kupovina.Proizvod FROM Kupovina WHERE Kupovina.Kupac = ‘Mika Mikić‘);
Naći kompaniiju koja proizvodi proiyvod koji je kupio Mika Mikić.
Ovde podupit vraća set vrenosti: neme više runtime errors.
8
SELECT Kompanije.Naziv FROM Kompanije, Proizvodi, Kupovina WHERE Kompanije.Ime = Proizvodi.Proizvodjac AND Proizvodi.Naziv = Kupovina.Proizvod AND Kupovina.Kupac = ‘Mika Mikić‘);
SELECT Kompanije.Naziv FROM Kompanije, Proizvodi, Kupovina WHERE Kompanije.Ime = Proizvodi.Proizvodjac AND Proizvodi.Naziv = Kupovina.Proizvod AND Kupovina.Kupac = ‘Mika Mikić‘);
Ekvivalentno sa:
Da li je ovaj upit jednak prethodnomDa li je ovaj upit jednak prethodnom ? ?
Voditi računa o duplikatimaVoditi računa o duplikatima ! !
9
SELECT DISTINCT Kompanije.Naziv FROM Kompanije, Proizvodi, Kupovina WHERE Kompanije.Ime = Proizvodi.Proizvodjac AND Proizvodi.Naziv = Kupovina.Proizvod AND Kupovina.Kupac = ‘Mika Mikić‘);
SELECT DISTINCT Kompanije.Naziv FROM Kompanije, Proizvodi, Kupovina WHERE Kompanije.Ime = Proizvodi.Proizvodjac AND Proizvodi.Naziv = Kupovina.Proizvod AND Kupovina.Kupac = ‘Mika Mikić‘);
SELECT DISTINCT Kompanije.Naziv FROM Kompanije, Proizvodi WHERE Kompanije.Ime = Proizvodi.Proizvodjac AND Proizvodi.ime IN (SELECT Kupovina.Proizvod FROM Kupovina WHERE Kupovina.Kupac = ‘Mika Mikić‘);
SELECT DISTINCT Kompanije.Naziv FROM Kompanije, Proizvodi WHERE Kompanije.Ime = Proizvodi.Proizvodjac AND Proizvodi.ime IN (SELECT Kupovina.Proizvod FROM Kupovina WHERE Kupovina.Kupac = ‘Mika Mikić‘);
Sada su jednaki!
10
SELECT Naziv FROM Proizvodi WHERE Cena > ALL (SELECT Cena FROM Proizvodi WHERE Proizvodjac=‘Microsoft’)
SELECT Naziv FROM Proizvodi WHERE Cena > ALL (SELECT Cena FROM Proizvodi WHERE Proizvodjac=‘Microsoft’)
Proizvodi( Naziv, Cena, Kategorija, Proizvodjac)Nađi proizvode koji su skuplji od svih proizvoda proizvedenih od strane “Microsoft”-a
Možemo koristiti: s > ALL R s > ANY R EXISTS R
11
SELECT DISTINCT Naslov FROM Film AS x WHERE Godina < > ANY (SELECT Godina FROM Film WHERE Naslov = x.Naslov);
SELECT DISTINCT Naslov FROM Film AS x WHERE Godina < > ANY (SELECT Godina FROM Film WHERE Naslov = x.Naslov);
Film (Naslov, Godina, Reditelj, Trajanje) Nadi sve filmove čiji se naslov ponavlja više od jedan put.
korelacija
Proizvodi ( Naziv, Cena, Kategorija, Proizvodjac, Godina) Naći proizovde (i njihove proizvođače) koji su skuplji
od svihproizvoda napravljenih od istog proizvođača pre 1971.
Moćno, ali nezgodno za optimizaciju !
12
SELECT DISTINCT Naziv, ProizvodjacFROM Proizvodi AS xWHERE Cena > ALL (SELECT Cena FROM Proizvodi AS y WHERE x.Proizvodjac = y.Proizvodjac AND y.Godina < 1971);
SELECT DISTINCT Naziv, ProizvodjacFROM Proizvodi AS xWHERE Cena > ALL (SELECT Cena FROM Proizvodi AS y WHERE x.Proizvodjac = y.Proizvodjac AND y.Godina < 1971);
13
Proizvodi ( Naziv, Cena, Kompanija)Kompanija ( Ime, Grad)
Nađi sve kompanija čiji neki proizvodi imaju cenu < 100
SELECT DISTINCT Kompanija.ImeFROM Kompanija, ProizvodiWHERE Kompanija.Ime = Proizvodi.Kompanija and Proizvodi.Cena < 100
SELECT DISTINCT Kompanija.ImeFROM Kompanija, ProizvodiWHERE Kompanija.Ime = Proizvodi.Kompanija and Proizvodi.Cena < 100
Moguće: lako !
14
Proizvodi ( Naziv, Cena, Kompanija)Kompanija ( Ime, Grad)
Nađi sve kompanije čiji svi proizvodi imaju cenu < 100
Opšte: teško !
15
2. Nađi sve kompanije čiji svi proizvodim imaju cenu < 100
1. Nađi kompanija: čiji neki proizvodi imaju 100
SELECT DISTINCT Kompanija.ImeFROM KompanijaWHERE Kompanija. Ime IN (SELECT Proizvodi.Kompanija FROM Proizvodi WHERE Proizvodi.Cena >= 100
SELECT DISTINCT Kompanija.ImeFROM KompanijaWHERE Kompanija. Ime IN (SELECT Proizvodi.Kompanija FROM Proizvodi WHERE Proizvodi.Cena >= 100
SELECT DISTINCT Kompanija.ImeFROM CompanyWHERE Company.cname NOT IN (SELECT Proizvodi.Kompanija FROM Proizvodi WHERE Proizvodi.Cena >= 100
SELECT DISTINCT Kompanija.ImeFROM CompanyWHERE Company.cname NOT IN (SELECT Proizvodi.Kompanija FROM Proizvodi WHERE Proizvodi.Cena >= 100
16
SELECT AVG(Cena)FROM ProizvodiWHERE Proizvodjac=“Adobe”
SELECT AVG(Cena)FROM ProizvodiWHERE Proizvodjac=“Adobe”
SQL podržava nekoliko operacija agregacije:
SUM, MIN, MAX, AVG, COUNTSUM, MIN, MAX, AVG, COUNT
17
SELECT COUNt(*)FROM ProizvodiWHERE Godina > 1995
SELECT COUNt(*)FROM ProizvodiWHERE Godina > 1995
Sem COUNT, sve ostale agregacije primenjuju se na određeni atribut
18
COUNT računa i duplikate, sem ukoliko se drugačije ne definiše
SELECT COUNT(Kategorija) isto kao COUNT(*)FROM ProizvodiWHERE Godina > 1995
U nekim slučajevima bolje je:
SELECT COUNT(DISTINCT Kategorija)FROM ProizvodiWHERE Godina > 1995
19
Kupovina(Proizvod, Datum, Cena, Količina)
Primer 1: fNaći totalnu sumu prodaje u celoj bazi podaaka
SELECT SUM (Cena* Kolicina)FROM Kupovina
Primer 2: Naći sumu totalne prodaje WindowsXP
SELECT SUM(Cena * Kolicina)FROM KupovinaWHERE Proizvod = ‘WindowsXP’
20
Obično su nam potrebne agregacije po određenim segmentima.
Kupovina(Proizvod, Datum, Cena, Kolicina)
Primer 3: Naći ukupnu prodaju posle 9/1/05 po proizvodu.
SELECT Proizvod, SUM(Cena*Kolicina) AS UkupnoFROM KupovinaWHERE datum > “9/1/05”GROUP BY Proizvod
SELECT Proizvod, SUM(Cena*Kolicina) AS UkupnoFROM KupovinaWHERE datum > “9/1/05”GROUP BY Proizvod
Šta ovo znači?
21
SELECT Proizvod, SUM(Cena * Kolicina) AS SumProdaja MAX(Kolicina) AS MaxKolicinaFROM KupovinaGROUP BY Proizvod
SELECT Proizvod, SUM(Cena * Kolicina) AS SumProdaja MAX(Kolicina) AS MaxKolicinaFROM KupovinaGROUP BY Proizvod
Za svaki proizvod, ukupna prodaja i maksimalana količina.
22
SELECT Proizvod, SUM(Cena*Kolicina) AS UkupnoFROM KupovinaWHERE Datum > “9/1/05”GROUP BY Proizvod
SELECT Proizvod, SUM(Cena*Kolicina) AS UkupnoFROM KupovinaWHERE Datum > “9/1/05”GROUP BY Proizvod
SELECT DISTINCT x.Proizvod, (SELECT SUM(y.Cena*y.Proizvod) FROM Kupovina y WHERE x.Proizvod= y.Proizvod AND y.Datum > ‘9/1’) AS UkupnoFROM Kupovina xWHERE x.Datum > “9/1/05”
SELECT DISTINCT x.Proizvod, (SELECT SUM(y.Cena*y.Proizvod) FROM Kupovina y WHERE x.Proizvod= y.Proizvod AND y.Datum > ‘9/1’) AS UkupnoFROM Kupovina xWHERE x.Datum > “9/1/05”
23
SELECT Proizvod, SUM(Cena * Kolicina)FROM KupovinaWHERE Datum > “9/1/05”GROUP BY ProizvodHAVING SUM(Kolicina) > 30
SELECT Proizvod, SUM(Cena * Kolicina)FROM KupovinaWHERE Datum > “9/1/05”GROUP BY ProizvodHAVING SUM(Kolicina) > 30
Upit sličan kao prethodni, samo ovde se traže samo oni proizvodikoji su prodati u najmanje 30 primeraka.
HAVING sadrži uslov za agregacije.
SELECT SFROM R1,…,Rn
WHERE C1GROUP BY a1,…,ak
HAVING C2
S = može da sadrži atribute a1,…,ak i/ili bilo koju agregaciju ili ne i druge atribute
C1 = je bilo koji uslov atributa u R1,…,Rn
C2 =je bilo koji uslov nad agregiranim izrazima
24
SELECT SFROM R1,…,Rn
WHERE C1GROUP BY a1,…,ak
HAVING C2
Koraci za evaluaciju:1. Sračunava se FROM-WHERE deo, određuje tabela sa
svim atributima iz R1,…,Rn
2. Grupišu se po a1,…,ak 3. Sračunavaju se agregaciju u C2 i zadržavaju samo one
grupe koje zadovoljavaju C24. Sračunava se agregacija u S i vraća se rezultat
25
Autor(login,ime)Dokument(url, naslov)Napisao(login,url)Pomenuo(url,rec)
26
Naći sve autore koji su napisali najmanje 10 dokumenata:
Primer 1: sa ugnježdenim upitima
27
SELECT DISTINCT Autor.imeFROM AutorWHERE COUNT(SELECT Napisao.url FROM Napisao WHERE Autor.login=Napisao.login) > 10
SELECT DISTINCT Autor.imeFROM AutorWHERE COUNT(SELECT Napisao.url FROM Napisao WHERE Autor.login=Napisao.login) > 10
Ovo jepočetnički
SQL
Naći sve autore koji su napisali najmanje 10 dokumenata:
Primer 2: sa (GROUP BY)
28
SELECT Autor.imeFROM Autor, NapisaoWHERE Autor.login=Napisao.loginGROUP BY Autor.imeHAVING COUNT(Napisao.url) > 10
SELECT Autor.imeFROM Autor, NapisaoWHERE Autor.login=Napisao.loginGROUP BY Autor.imeHAVING COUNT(Napisao.url) > 10
Napredni SQL
Nema potrebe za DISTINCT: po automatizmu GROUP BY
Naći sve autore koji imaju rečnik preko 10000 reči:
29
SELECT Autor.imeFROM Autor, Napisao, PomenuoWHERE Autor.login=Napisao.login AND Napisao.url=Pomenuo.urlGROUP BY Autor.imeHAVING COUNT(DISTINCT Pomenuo.rec) > 10000
SELECT Autor.imeFROM Autor, Napisao, PomenuoWHERE Autor.login=Napisao.login AND Napisao.url=Pomenuo.urlGROUP BY Autor.imeHAVING COUNT(DISTINCT Pomenuo.rec) > 10000
Pažljivo pogledati poslednja dva upita: ne pisati ih kao ugnježdeneUpite, ovakvi problemi se rešavaju sa GROUP BY
Kada god nemamo vrednost mi možemo postaviti nula vrednost (NULL)
Što može da znači sledeće: Vrednost ne postoji Vrednost postoji ali je nepoznata Vrednost nije dostupna itd.
U šemi se specificira da li vrednost nekog atribura može biti nula (nullable attribute) ili ne
Kako SQL radi sa tabelama kojie imaju nule?
30
C1 AND C2 = min(C1, C2) C1 OR C2 = max(C1, C2) NOT C1 = 1 – C1
Pravilo SQL: uključuje samo one vrste koje imaju
vrednost TRUE31
SELECT *FROM OsobaWHERE (godine < 25) AND (visina > 190 OR tezina > 90)
SELECT *FROM OsobaWHERE (godine < 25) AND (visina > 190 OR tezina > 90)
Primergodina=20visina=NULLtezina=200
Neočekivano ponašanje:
Neke osobe nisu uključene !
32
SELECT *FROM OsobaWHERE godine < 25 OR godine >= 25
SELECT *FROM OsobaWHERE godine < 25 OR godine >= 25
Možemo testirati NULL eksplicitno: x IS NULL x IS NOT NULL
Sada uključuje sve osobe
33
SELECT *FROM OsobaWHERE godine < 25 OR godine >= 25 OR godine IS NULL
SELECT *FROM OsobaWHERE godine < 25 OR godine >= 25 OR godine IS NULL
Spojevi u SQL: Proizvod(naziv, kategorija)
Kupovina(artikl, prodavnica)
Isto kao:
Ali proizvodi koji nisu prodavani biće izostavljeni!
34
SELECT Proizvod.naziv, Kupovina.prodavnicaFROM Proizvod JOIN Kupovina ON Proizvod.naziv = Kupovina.artikl
SELECT Proizvod.naziv, Kupovina.prodavnicaFROM Proizvod JOIN Kupovina ON Proizvod.naziv = Kupovina.artikl
SELECT Proizvod.ime, Kupovina.prodavnicaFROM Proizvod, KupovinaWHERE Proizvod.naziv = Kupovina.artikl
SELECT Proizvod.ime, Kupovina.prodavnicaFROM Proizvod, KupovinaWHERE Proizvod.naziv = Kupovina.artikl
Levi spoljašni spoj u SQL: Proizvod(naziv, kategorija)
Kupovina(artikl, prodavnica)
35
SELECT Proizvod.naziv, Kupovina.prodavnica FROM Proizvod LEFT OUTER JOIN Kupovina ON Proizvod.naziv = Kupovina.artikl
SELECT Proizvod.naziv, Kupovina.prodavnica FROM Proizvod LEFT OUTER JOIN Kupovina ON Proizvod.naziv = Kupovina.artikl
36
nazivnaziv kategorijakategorija
Maticna Maticna PlocaPloca HardwareHardware
WindowsXPWindowsXP SoftwareSoftware
PhotoshopCSPhotoshopCS SoftwareSoftware
artiklartikl prodavnicaprodavnica
Maticna Maticna PlocaPloca
TechnomediTechnomediaa
WindowsXPWindowsXP StartStart
WindowsXPWindowsXP BooxBoox
nazivnaziv prodavnicaprodavnica
Maticna Maticna PlocaPloca
TechnomediTechnomediaa
WindowsXPWindowsXP StartStart
WindowsXPWindowsXP BooxBoox
PhotoshopCSPhotoshopCS NULLNULL
Proizvod Kupovina
Levi spoljašni spoj: Spoljnim spajanjem Right Join biraju se svi redovi iz prve
tabele i samo oni redovi iz druge tabele čiji je sadržaj veznih polja jednak sadržaju veznih polja prve tabele
Desni spoljašni spoj: Spoljnim spajanjem Right Join biraju se svi redovi iz
druge tabele i samo oni redovi iz prve tabele čiji je sadržaj veznih polja jednak sadržaju veznih polja druge tabele
Kompletni spoljašni spoj: Uključuje obe i leve i desne zapise, čak i ako ne postoji
podudaranje37
Postoji tri vrste modifikacije: Insertovanje Brisanje Updejtovanje
Ponekad se svi zbirnonazivaju “updates”
38
39
Opšti oblik:
Nedostajući atribut NULL.Mogu se izostaviti nazivi atributa ukoliko se daju po redosledu.
INSERT INTO R(A1,…., An) VALUES (v1,…., vn) INSERT INTO R(A1,…., An) VALUES (v1,…., vn)
INSERT INTO Kupovina(kupac, prodavac, proizvod, prodavnica) VALUES (‘Mika’, ‘Pera’, ‘WindowsXP’,‘COM’)
INSERT INTO Kupovina(kupac, prodavac, proizvod, prodavnica) VALUES (‘Mika’, ‘Pera’, ‘WindowsXP’,‘COM’)
Primer: Insertovati novu kupovinu u bazu podataka:
40
INSERT INTO Proizvod(Naziv)
SELECT DISTINCT Kupovina.proizvod FROM Kupovina WHERE Kupovina.datum > “10/26/05”
INSERT INTO Proizvod(Naziv)
SELECT DISTINCT Kupovina.proizvod FROM Kupovina WHERE Kupovina.datum > “10/26/05”
Upit zamenjuje VALUES naredbu.Ovde insertujemo više zapisa u tabelu Proizvodi
41
artikl je strani ključ Proizvod.naziv
Pretpostavimo da je baza oštećena i da je potrebno da se popravi
nazivnaziv listaCenalistaCena kategorijakategorija
WindowsXWindowsXPP
100100 SoftwareSoftware
artiklartikl kupackupac cenacena
PhotoshopCPhotoshopCSS
PeraPera 200200
WindowsXPWindowsXP MikaMika 8080
PhotoshopCPhotoshopCSS
MikaMika 225225
Zadatak: insertovati u Proizvodi sve artikle iz kupovina
Proizvodi
Proizvod(naziv, listaCena, kategorija)Kupovina(artikl, kupac, cena)
Proizvod(naziv, listaCena, kategorija)Kupovina(artikl, kupac, cena)
KupovinaOštećena
42
INSERT INTO Proizvod(naziv)
SELECT DISTINCT artikl FROM Kupovina WHERE artikl NOT IN (SELECT naziv FROM Proizvodi)
INSERT INTO Proizvod(naziv)
SELECT DISTINCT artikl FROM Kupovina WHERE artikl NOT IN (SELECT naziv FROM Proizvodi)
nazivnaziv listaCenalistaCena kategorijakategorija
WindowsXPWindowsXP 100100 SoftwareSoftware
PhotoshopCPhotoshopCSS
-- --
43
INSERT INTO Proizvod(naziv, listaCena)
SELECT DISTINCT kupac, cena FROM Kupovina WHERE artikl NOT IN (SELECT naziv FROM Proizvod)
INSERT INTO Proizvod(naziv, listaCena)
SELECT DISTINCT kupac, cena FROM Kupovina WHERE artikl NOT IN (SELECT naziv FROM Proizvod)
namename listPricelistPrice categorycategory
gizmogizmo 100100 GadgetsGadgets
PhotoshopPhotoshopCSCS 200200 --
PhotoshopPhotoshopCSCS 225 ??225 ?? -- Zavisi od implementacije
44
DELETE FROM Kupovina
WHERE prodavac = ‘Mika’ AND proizvod = ‘WindowsXP’
DELETE FROM Kupovina
WHERE prodavac = ‘Mika’ AND proizvod = ‘WindowsXP’
Primer:
45
UPDATE ProizvodSET cena = cena/2WHERE Proizvod.naziv IN (SELECT artikl FROM Kupovina WHERE datum =‘Oct, 25, 2005’);
UPDATE ProizvodSET cena = cena/2WHERE Proizvod.naziv IN (SELECT artikl FROM Kupovina WHERE datum =‘Oct, 25, 2005’);
Primer:
46
Dosada je prezentovan Data Manipulation Language, DMLSledi: Data Definition Language (DDL)
Tipovi podataka: Definišu tipove..
Definicija podataka: definiše šemu
• Kreiranje tabela• Brisanje tabela• Modifikacija tabela
Indeksi: poboljšanje performansi
Karakteri: CHAR(20) -- fiksne dužine VARCHAR(40) -- promenljive dužine
Brojevi: BIGINT, INT, SMALLINT, TINYINT REAL, FLOAT -- različitih preciznosti MONEY
Vreme i datumi: DATE DATETIME -- SQL Server
Ostalo…
47
48
CREATE TABLE Osoba(
ime VARCHAR(30), brojLk INT, godine SHORTINT, grad VARCHAR(30), pol BIT(1), rodjendan DATE
);
CREATE TABLE Osoba(
ime VARCHAR(30), brojLk INT, godine SHORTINT, grad VARCHAR(30), pol BIT(1), rodjendan DATE
);
Primer:
49
Brisanje:
ALTER TABLE Osoba ADD telefon CHAR(16);
ALTER TABLE Osoba DROP godine;
ALTER TABLE Osoba ADD telefon CHAR(16);
ALTER TABLE Osoba DROP godine;
Altering: (dodavanje ili brisanje atributa).
Šta se dešava kada se naprave promene na šemi?
Primer:
DROP Osoba; DROP Osoba; Primer: Rukovati sa pažnjom !!
50
Specificiranje default vrednosti:
CREATE TABLE Osoba( ime VARCHAR(30), brojLk INT, godine SHORTINT DEFAULT 18, grad VARCHAR(30) DEFAULT ‘Kragujevac’, pol CHAR(1) DEFAULT ‘m’, rodjendan DATE
CREATE TABLE Osoba( ime VARCHAR(30), brojLk INT, godine SHORTINT DEFAULT 18, grad VARCHAR(30) DEFAULT ‘Kragujevac’, pol CHAR(1) DEFAULT ‘m’, rodjendan DATE
Default defaulta: NULL
51
Vrlo važno za ubrzavanje vremena izvršenja upita.
Pretpostavimo da imamo:
Osoba (ime, godine, grad)
Sekvencijalno pretraživanje fajla Osoba može dugo trajati
SELECT *FROM OsobaWHERE ime= “Sava”
SELECT *FROM OsobaWHERE ime= “Sava”
Kreirati indeks imena:
B+ drvo ima izlaz od 100s: max 4 nivoa !
52
AAcaca BaneBane CCicaica …….. SavaSava ……..
53
CREATE INDEX imeIndex ON Osoba(ime)CREATE INDEX imeIndex ON Osoba(ime)
Sintaksa:
54
Indeksi mogu biti korisni kod upita koji rade sa opsezima:
B+ pomaže kod:
Zašto ne bi napravili indekse od svih atributa?
CREATE INDEX godineIndex ON Osoba (godine)CREATE INDEX godineIndex ON Osoba (godine)
SELECT * FROM OsobaWHERE godine > 25 AND godine < 28
SELECT * FROM OsobaWHERE godine > 25 AND godine < 28
55
Indeksi mogu biti kreirani za više atributa:
SELECT * FROM Osoba WHERE godine = 55 AND grad = “Kragujevac”
SELECT * FROM Osoba WHERE godine = 55 AND grad = “Kragujevac”
Pomaže:
SELECT * FROM Osoba WHERE grad= “Kragujevac”
SELECT * FROM Osoba WHERE grad= “Kragujevac”
Ali ne i kod:
CREATE INDEX doubleindex ON Osoba (godine, grad)
CREATE INDEX doubleindex ON Osoba (godine, grad)
Primer:
SELECT * FROM Osoba WHERE godine= 55
SELECT * FROM Osoba WHERE godine= 55
Čak i kod:
Potreban nam je workload = set SQL upita sa podatkom koliko se često oni koriste
Koji su indeksi potrebni da bi se ubrzao proces ?
FROM/WHERE imaju koristi od indeksa INSERT/UPDATE nemaju korist od indeksa Izbor indeksa = obično rade ljudi, mada
postoje i varijante da se to čini automatski
56
57
Pogledi su relacije, sem onih koji se fizički ne čuvaju.
Zadatak im je da prezentuju različite informacije za različite korisnike.
Zaposleni(jmbg, ime, sektor, projekt, plata)
Računovodstvo ima pristup Zaposleni, ostali samo Razvoj
CREATE VIEW Razvoj AS SELECT ime, projekt FROM Zaposleni WHERE sektor = “Razvoj”
CREATE VIEW Razvoj AS SELECT ime, projekt FROM Zaposleni WHERE sektor = “Razvoj”
58
Osoba(ime, grad)Kupovina(kupac, prodavac, proizvod, prodavnica)Proizvod(naziv, proizvodjac, kategorija)
Imamo, novu, virtualnu tabelu:Kg-view(kupac, prodavac, proizvod, prodavnica)
CREATE VIEW Kg-view AS
SELECT kupac, prodavac, proizvod, prodavnica FROM Osoba, Kupovina WHERE Osoba.grad = “Kragujevac” AND Osoba.ime = Kupovina.kupac
CREATE VIEW Kg-view AS
SELECT kupac, prodavac, proizvod, prodavnica FROM Osoba, Kupovina WHERE Osoba.grad = “Kragujevac” AND Osoba.ime = Kupovina.kupac
59
SELECT ime, prodavnicaFROM Kg-view, ProizvodWHERE Kg-view.proizvod = Proizvod.naziv AND Proizvod.kategorija = “Software”
SELECT ime, prodavnicaFROM Kg-view, ProizvodWHERE Kg-view.proizvod = Proizvod.naziv AND Proizvod.kategorija = “Software”
Kasnije možemo da koristimo view:
SELECT ime, Kg-view.prodavnica FROM Kg -view, Proizvod WHERE Kg -view.proizvod = Proizvod.naziv
AND Proizvod.kategorija = “Software”
SELECT ime, Kg-view.prodavnica FROM Kg -view, Proizvod WHERE Kg -view.proizvod = Proizvod.naziv
AND Proizvod.kategorija = “Software”
60
SELECT ime, Kupovina.prodavnicaFROM Osoba, Kupovina, ProizvodWHERE Osoba.grad = “Kraguejavc” AND Osoba.ime = Kupovina.kupac AND Kupovina.proizvod = Proizvod.naziv AND Proizvod.kategorija = “Software”
SELECT ime, Kupovina.prodavnicaFROM Osoba, Kupovina, ProizvodWHERE Osoba.grad = “Kraguejavc” AND Osoba.ime = Kupovina.kupac AND Kupovina.proizvod = Proizvod.naziv AND Proizvod.kategorija = “Software”
61
Kako insertovati zapis u tabelu koja ne postoji?
Zaposleni(brLk, ime, sektor, projekt, plata)
CREATE VIEW Razvoj AS SELECT ime, projekt FROM Zaposleni WHERE sektor = “Razvoj”
CREATE VIEW Razvoj AS SELECT ime, projekt FROM Zaposleni WHERE sektor = “Razvoj”
INSERT INTO Razvoj VALUES(“Mika”, “Projekat 2”)
INSERT INTO Razvoj VALUES(“Mika”, “Projekat 2”)
INSERT INTO Zaposleni(brLk, ime, sektor, projekt, plata)VALUES(NULL, “Mika”, NULL, “Projekat 2”, NULL)
INSERT INTO Zaposleni(brLk, ime, sektor, projekt, plata)VALUES(NULL, “Mika”, NULL, “Projekat 2”, NULL)
Ukoliko napravimo sledeće insertovanje:
dobijamo:
62
CREATE VIEW Grad-Prodavnica AS
SELECT Osoba.grad, Kupovina.prodavnica FROM Osoba, Kupovina WHERE Osoba.ime = Kupovina.kupac
CREATE VIEW Grad-Prodavnica AS
SELECT Osoba.grad, Kupovina.prodavnica FROM Osoba, Kupovina WHERE Osoba.ime = Kupovina.kupac
Kako možemo dodati sledeđi zapis?
(“Kragujevac”, “Centralna prodavnica”)
Mi ne zanmo ime osobe koja je kupila proizovd, a ne možemo njeno ime da postavimo na nulu
Osoba(ime, grad)Kupovina(kupac, prodavac, proizvod, prodavnica)