Top Banner
Predmet: INFORMACIONI SISTEMI II 1 Predava Predava č: č: Dr Dr Miroslav Medenica Miroslav Medenica
62
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: SQL 2 deo

Predmet: INFORMACIONI SISTEMI II

1

PredavaPredavač:č:Dr Dr Miroslav MedenicaMiroslav Medenica

Page 2: SQL 2 deo

Unije, preseci, razlike (Unions, intersections, differences)

Podupiti, agregacjije, nule (Subqueries, Aggregations, NULLs)

Modifikovanje baze, indeksi, pogledi (Indexs, Views)

2

Page 3: SQL 2 deo

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).

Page 4: SQL 2 deo

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”)

Page 5: SQL 2 deo

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‘);

Page 6: SQL 2 deo

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‘

Page 7: SQL 2 deo

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.

Page 8: SQL 2 deo

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 ! !

Page 9: SQL 2 deo

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!

Page 10: SQL 2 deo

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

Page 11: SQL 2 deo

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

Page 12: SQL 2 deo

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);

Page 13: SQL 2 deo

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 !

Page 14: SQL 2 deo

14

Proizvodi ( Naziv, Cena, Kompanija)Kompanija ( Ime, Grad)

Nađi sve kompanije čiji svi proizvodi imaju cenu < 100

Opšte: teško !

Page 15: SQL 2 deo

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

Page 16: SQL 2 deo

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

Page 17: SQL 2 deo

17

SELECT COUNt(*)FROM ProizvodiWHERE Godina > 1995

SELECT COUNt(*)FROM ProizvodiWHERE Godina > 1995

Sem COUNT, sve ostale agregacije primenjuju se na određeni atribut

Page 18: SQL 2 deo

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

Page 19: SQL 2 deo

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’

Page 20: SQL 2 deo

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?

Page 21: SQL 2 deo

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.

Page 22: SQL 2 deo

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”

Page 23: SQL 2 deo

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.

Page 24: SQL 2 deo

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

Page 25: SQL 2 deo

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

Page 26: SQL 2 deo

Autor(login,ime)Dokument(url, naslov)Napisao(login,url)Pomenuo(url,rec)

26

Page 27: SQL 2 deo

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

Page 28: SQL 2 deo

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

Page 29: SQL 2 deo

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

Page 30: SQL 2 deo

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

Page 31: SQL 2 deo

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

Page 32: SQL 2 deo

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

Page 33: SQL 2 deo

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

Page 34: SQL 2 deo

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

Page 35: SQL 2 deo

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

Page 36: SQL 2 deo

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

Page 37: SQL 2 deo

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

Page 38: SQL 2 deo

Postoji tri vrste modifikacije: Insertovanje Brisanje Updejtovanje

Ponekad se svi zbirnonazivaju “updates”

38

Page 39: SQL 2 deo

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:

Page 40: SQL 2 deo

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

Page 41: SQL 2 deo

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

Page 42: SQL 2 deo

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

-- --

Page 43: SQL 2 deo

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

Page 44: SQL 2 deo

44

DELETE FROM Kupovina

WHERE prodavac = ‘Mika’ AND proizvod = ‘WindowsXP’

DELETE FROM Kupovina

WHERE prodavac = ‘Mika’ AND proizvod = ‘WindowsXP’

Primer:

Page 45: SQL 2 deo

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:

Page 46: SQL 2 deo

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

Page 47: SQL 2 deo

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

Page 48: SQL 2 deo

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:

Page 49: SQL 2 deo

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 !!

Page 50: SQL 2 deo

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

Page 51: SQL 2 deo

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”

Page 52: SQL 2 deo

Kreirati indeks imena:

B+ drvo ima izlaz od 100s: max 4 nivoa !

52

AAcaca BaneBane CCicaica …….. SavaSava ……..

Page 53: SQL 2 deo

53

CREATE INDEX imeIndex ON Osoba(ime)CREATE INDEX imeIndex ON Osoba(ime)

Sintaksa:

Page 54: SQL 2 deo

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

Page 55: SQL 2 deo

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:

Page 56: SQL 2 deo

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

Page 57: SQL 2 deo

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”

Page 58: SQL 2 deo

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

Page 59: SQL 2 deo

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:

Page 60: SQL 2 deo

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”

Page 61: SQL 2 deo

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:

Page 62: SQL 2 deo

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)