You are on page 1of 57

Kardinalnost

PK & FK ključevi
SQL SELECT
Nastavljamo dalje
Kardinalnost veze
Opisivanje učešća u vezi između entiteta
Veze
▪ Veza povezuje dva (ili više) entiteta
▪ Ali samo tamo gde veza između entiteta postoji
▪ Ograničenje učešća zovemo kardinalnost veze
▪ Jedan-na-jedan
▪ Jedan-na-više
▪ Više-na-više
Jedan-na-jedan (1:1)
▪ Kada jedan red iz entiteta
vezuje za jedan red iz
drugog entiteta

Na primer:
▪ Ko je sa kime u braku
▪ Ko je potpisao koji ugovor
Svaka osoba nije u braku ili jeste sa najviše jednom osobom
Svaki student je potpisao tačno jedan ugovor o školovanju
Svaki ugovor o školovanju je potpisao tačno jedan student
Jedan-na-više (1:M)
▪ Kada jedan red iz entiteta
vezuje za više redova iz
drugog entiteta

Na primer:
▪ Ko su deca od majke
▪ Ko su studenti na smeru
Svaka žena je rodila nijedno, jedno ili više dece
Svako dete je rodila tačno jedna žena
Svaki smer ima bar jednog studenta
Svaki student je na tačno jednom smeru
Više-na-više (M:N)
▪ Kada jedan red iz entiteta
vezuje za više redova iz
drugog entiteta i obrnuto

Na primer:
▪ Ko posećuje koju lokaciju
▪ Ko je položio koji predmet
Svaka osoba posećuje bar jednu lokaciju (ili više)
Svaku lokaciju posećuje bar jedna osoba (ili više)
Svaki student nije položio ništa, ili je položio jedan ili više predmeta
Svaki predmet je položio bar jedan student (a verovatno i više)
Granice
▪ Imamo gornju granicu (max) i donju granicu (min)
▪ Pravilo je da je uvek
▪ Možemo da imamo:
▪ 0,1 – minimalno 0, maksimalno 1
▪ 1,1 – minimalno 1, maksimalno 1
▪ 0,M – minimalno 0, maksimalno M (više)
▪ 1,M – minimalno 1, maksimalno M (više)
▪ Proizvoljno – 0,4 ili 1,10 ...
Svaka osoba mora biti rođena u nekom gradu
Svaka osoba mora živeti u nekom gradu
Teoretski možemo i ovako ali nije praktično (nije ista informacija)
Naziv veze ovde ne može da pokrije sve mogućnosti
Svaka zgrada mora da ima bar šest stanova (inače nije zgrada)
Svaki stan je uvek u samo jednoj zgradi
Primarni (PK) ključ
Bez ovoga baze podataka nemaju smisla
Čemu služi primarni ključ
▪ Unikatno pronalazi svaki zapis (svaki red, n-torku) u tabeli
(entitetu)
▪ Jedan primarni ključ → jedan zapis
▪ Svaki deo primarnog ključa mora biti unet
(imati vrednost)
Kakav može da bude
▪ Po broju atributa:
▪ Prost – jedan atribut čini primarni ključ
▪ Kompozitan – dva ili više atributa čine primarni ključ

▪ Po „izvoru“:
▪ Prirodan – već postoji (npr: broj indeksa, JMBG, kod valute)
▪ Generisan / Zamenjen – dodeljena nasumična vrednost
Kako nalazimo prirodan PK
1. Pronađemo sve super ključeve
sve kombinacije atributa koje mogu da identifikuju zapis
2. Pronađemo sve ključeve kandidate
najkraći super ključevi koji se više ne mogu skratiti
3. Jedan od kandidata biramo za primarni
onaj koji je najbolji sa stanovništva performansi
4. Ostali kandidati postaju alternativni ključ
preporučen korak
Prirodni primarni ključevi
▪ JMBG za osobe
▪ Broj ugovora za ugovore
▪ IATA kod za aerodrome
▪ ISO kodovi za valute, zemlje, jezike
▪ Titula + ime + prezime za kraljevsku dinastiju
▪ Broj formulara za dokumenta
Primeri
▪ https://www.iban.com/country-codes
▪ https://en.wikipedia.org/wiki/Language_code
▪ https://en.wikipedia.org/wiki/ISO_4217
▪ https://en.wikipedia.org/wiki/ISO_9362
▪ https://en.wikipedia.org/wiki/ISO/IEC_5218
▪ https://knjigovodja.in.rs/sh/sifrarnik-delatnosti
Osobine dobrog primarnog ključa
▪ Jednostavan ključ (jedan atribut)
▪ Fizički mala veličina (broj / datum / par karaktera teksta)
▪ Nepromenljiva veličina u bajtovima
▪ Uglavnom već uređene vrednosti (datum da, tekst?)

Ovo ne važi za alternativni ključ (sem možda u slučaju


teksta)
Zamenski, veštački (surrogate) PK
▪ IDENTITY, AUTO_NUMBER
automatski daje sledeću vrednost (uglavnom +1)
▪ SEQUENCE
slično prethodnom ali može da se resetuje i mogu različite
tabele da ga dele
▪ UUID, GUID
veći, nasumične vrednosti, dobar isključivo samo kada
imamo više baza koje moramo da sinhronizujemo
Prirodni primarni ključevi
▪ JMBG za osobe – predugačak
▪ Broj ugovora za ugovore – zavisi od broja karaktera
▪ IATA kod za aerodrome – 3 karaktera, dobar izbor
▪ ISO kodovi za valute, zemlje, jezike – dobar izbor
▪ Titula + ime + prezime za kraljevsku dinastiju – komp.
▪ Broj formulara za dokumenta – zavisi od broja karaktera
Strani (FK) ključ
Omogućava nam da povežemo informacije
Čemu služi strani ključ
▪ Strani ključ jednog entiteta se poziva na primarni ključ
drugog (ili istog) entiteta (ovo inače nije jedina opcija)
▪ Tamo gde postoje veze između entiteta mora postojati i
strani (alternativno: spoljni, preneseni) ključ
▪ Donja granica kardinalnosti nam kaže da li strani ključ
mora biti unet:
▪ Ako je donja granica 0 – može a ne mora
▪ Ako je donja granica 1 – mora biti unet
Svaki smer ima bar jednog studenta
Svaki student je na tačno jednom smeru
Strani ključ kod kardinalnosti 1:M
▪ Pošto je svaki student na jednom smeru a svaki smer ima
više studenata onda student mora znati smer dok smer ne
mora znati studente
▪ Kažemo da, u ovom slučaju, Smer spušta ključ u entitet
Student
▪ Strani ključ ne stavljamo kao atribut jer nam sama veza
govori da on mora postojati
▪ Smer nazivamo roditelj a Student nazivamo dete
Svaki student je potpisao tačno jedan ugovor o školovanju
Svaki ugovor o školovanju je potpisao tačno jedan student
Strani ključ kod kardinalnosti 1:1
▪ Ako znamo koji entitet popunjavamo prvi, onda će on
spustiti ključ u drugi entitet:
▪ Ako prvo unosimo ugovor – ugovor spušta ključ u studenta
▪ Ako prvo unosimo studenta – student spušta ključ u ugovor

▪ Ako ne znamo šta dolazi prvo, onda možemo da stavimo kako


izaberemo ali nešto uvek mora biti prvo
Bitno je znati
„Ako je primarni ključ entiteta na koji se strani ključ poziva
kompozitni, onda i strani ključ mora isto tako biti
kompozitni. Strani ključ se nikada ne može pozvati na deo
ključa već uvek mora na ceo“

„Ako strani ključ ima dodeljenu vrednost, onda ona mora


biti postojeći primarni ključ na koji se poziva. Nemoguće je
staviti vrednost koja ne postoji“
Alternativni (UQ) ključ
Jer neke stvari trebaju biti unikatne
Alternativni ključ
▪ Svi neiskorišćeni ključevi kandidati treba da budu unikatni
▪ Ako je bilo više od jednog kandidata
▪ Ako smo umesto kandidata stavili zamenski ključ
▪ Pošto i oni unikatno određuju svaki red, zovu se
alternativni ključevi
▪ Za razliku od primarnog, alternativni dozvoljava isključivo
jednu NULL vrednost (ako je tako postavljeno u kodu)
Inverzni (IX) ključ
Kada moramo brzo da pronalazimo redove
Inverzni ključ – Indeks (IX)
▪ Inverzni ključevi ili po mnogo poznatijem nazivu indeksi
služe za bržu pretragu vrednosti u tabeli
▪ Pažljivo ih treba birati jer opreterćuju sistem – korisni su
kada ih koristimo ali i štetni kada ih ne koristimo
▪ Strategija dodavanja zavisi od konkretnog korišćenja baze
i nije nešto što možete prediveti. Indeksi se dodaju po
potrebi
SELECT mogućnosti
Šta još možemo da uradimo u SELECT-u
TOP
▪ Kada želimo da vratimo samo određeni broj redova
▪ Postavljamo maksimalni broj redova ali ne mora da znači
da ćemo ih toliko dobiti
▪ Možemo da stavimo broj redova ili procenat od ukupnog
broja redova
Primeri zahteva za TOP
▪ Svi student
SELECT * FROM Student
▪ Prvih 10 studenata
SELECT TOP 10 * FROM Student
▪ Prvih 25% studenata
SELECT TOP 25 PERCENT * FROM Student
DISTINCT
▪ Kada želimo da vratimo samo unikatne vrednosti
▪ Ne možemo da biramo od kog tačno polja već vraćamo
unikatne vrednosti u izabranim kolonama
▪ Ako koristimo u kombinaciji sa TOP, onda ide prvo
DISTINCT pa onda TOP
▪ Suprotno za DISTINCT je ALL koji ne moramo da pišemo
Primeri zahteva za DISTINCT i ALL
▪ Unikatna imena
SELECT DISTINCT Ime FROM Student
▪ Unikatna imena i prezimena
SELECT DISTINCT Ime, Prezime FROM Student
▪ Sva imena i prezimena
SELECT ALL Ime, Prezime FROM Student
▪ Prvih 25 unikatnih imena
SELECT DISTINCT TOP 25 Ime FROM Student
Alijasi
▪ Alijas – alter ego, promenjen naziv
▪ Možemo da „promenimo“ ime kolone ili ime tabele
▪ Koristimo AS kao skraćenicu od alijas
▪ Nije neophodno koristiti AS ali je (ako mene pitate)
preporučljivo jer je lakše uočljivo
Primeri zahteva za alijas (AS)
▪ Alijas kolone
SELECT Ime AS ImeStudenta FROM Student
▪ Alijas tabele
SELECT * FROM Student AS s
▪ Realan primer korišćenja alijasa
SELECT Ime + ' ' + Prezime AS Student FROM
Student
Ako koristimo razmake u nazivu
▪ Realan primer korišćenja alijasa
SELECT s.Ime + ' ' + s.Prezime AS [Puno ime]
FROM Student AS s

▪ Uglaste zagrade koristimo kada imamo razmak


▪ Ako tabela ima alijas, ne koristimo više
tabela.polje već alijas.polje (trebaće nam ovo kasnije)
SQL funkcije
Ovo nam pre ili kasnije zatreba
Matematičke operacije
▪ SQL, slično Excel-u, možemo da koristimo da
izračunamo nešto
▪ Podržava osnovne operacije +, -, *, /
▪ Ostale operacije:
▪ POWER – na n-ti kvadrat, SQRT – koren (n=2)
▪ % - moduo odnosno ostatak pri deljenju
▪ SIGN – pozitivan broj, negativan broj ili nula
Primeri zahteva za operacije
▪ Osnovne operacije
SELECT 5 + 2, 5 - 2, 5 * 2, 5 / 2
▪ Dodatne operacije
SELECT POWER(5, 3), 17 % 2, SQRT(5)
▪ Funkcija SIGN
SELECT SIGN(-17), SIGN(5), SIGN(0)
Rad sa tekstom
▪ LEFT – daje nam prvih x karaktera
▪ RIGHT – daje nam zadnjih x karaktera
▪ SUBSTRING – daje nam karaktere iz sredine
▪ LEN – vraća nam dužinu teksta
▪ LTRIM – uklanja razmake sa početka teksta
▪ RTRIM – uklanja razmake sa kraja teksta
Primeri koda za tekstualne funkcije
▪ Delovi teksta
SELECT LEFT('neki tekst', 4), RIGHT('neki
tekst', 5), SUBSTRING('neki tekst', 3, 4)
▪ Uklanjanje razmaka
SELECT LTRIM(' tekst '), RTRIM(' tekst ')
▪ Dužina teksta
SELECT LEN('koliko ovde ima karaktera')
Rad sa tekstom
▪ ASCII – daje nam brojčanu vrednost karaktera
▪ CHAR – obrnuto od ASCII
▪ LOWER – pretvara tekst u sva mala slova
▪ UPPER – pretvara tekst u sva velika slova
▪ CHARINDEX – proverava postojanje teksta
▪ REPLACE – menja tekst sa drugim tekstom
Primeri koda za tekstualne funkcije
▪ ASCII kodna strana
SELECT ASCII('A'), CHAR(65)
▪ Promena „veličine“ slova
SELECT UPPER('Ana'), LOWER('Ana')
▪ Da li tekst sadrži reč i na kojoj poziciji
SELECT CHARINDEX('ana', 'Jovana'),
CHARINDEX('ena', 'Jovana')

SELECT REPLACE('Lana', 'L', 'J')


Ima još funkcija ...

... ali to ćemo neki drugi dan


Domaći zadaci za MOV
1. Nacrtati entitete Država, Grad i Plaža i povezati ih
2. Dodati po minimum 2 atributa za sva tri entiteta
3. Pronaći primarni ključ za svaki entitet
4. Napisati kardinalnost veze za sve veze
5. Dodati entitet Restoran, povezati i napisati kardinalnosti
Domaći zadaci za SQL
SELECT koji vraća:
1. Ime i prezime studenata kao jedno polje
2. Prvih 30 studenata sa imenom i prezimenom kao jedno
polje uređeno po proizvoljnom redosledu
3. Sva unikatna prezimena studenata sa „I“ smera
4. Poslednjih 30 studenata po broju indeksa
(zahteva da razmislite)
Napredni zadaci za SQL
SELECT koji vraća:
1. Ako se student ima ime „jovan“ i prezime „knežević“,
kako bi mogli da vidimo „knežević j.“ (sve mala slova)
2. Doraditi prethodni primer da kaže „Knežević J.“
3. Kako bi vratili studenta sa najdužim imenom
4. Izračunajte u SQL-u sledeću formulu:

You might also like