MarkoL Posted October 24, 2005 Report Share Posted October 24, 2005 Dakle potreban mi je tutorial za mysql od A do Quote Link to comment Share on other sites More sharing options...
Stator Posted October 24, 2005 Report Share Posted October 24, 2005 Mislim d aje ovo dobro mesto za pocetak http://www.elitesecurity.org/tema/50486-MySQL-Developer-zone Quote Link to comment Share on other sites More sharing options...
Sa1Nt Posted October 24, 2005 Report Share Posted October 24, 2005 win ili lin ? ako je win, skini www.easyphp.org, u njemu imash apache/php/mysql/phpmyadmin i vozi... Quote Link to comment Share on other sites More sharing options...
Guest account 5 Posted October 28, 2005 Report Share Posted October 28, 2005 Brate nadam se da ce ti ovo barem malo pomoci ... < I DEO > » Click to show Spoiler - click again to hide... «Kompjuteri Skola SQL Servera Kompjuterski savjeti Skola C# Skola HTML-a Skola SQL Servera 2 Igrice krugovi Kompjuteri->Sql_Server_2000 Zeljko Tomic : Sokolac Zasto bas SQL Server Kao prvo, dobro dosli u moju malu skolu SQL Servera 2000. Materijal koji je objavljen na ovoj stranici, su ustvari biljeske koje sam ja pravio u elektronskoj formi dok sam ucio SQL Server. Nedavno sam, sasvim slucajno, nasao taj materijal pa sam odlucio da ga, uz malu obradu, stavim na ovu stranicu. Siguran sam da negdje u svijetu postoji bar jedna osoba zeljna znanja, kojoj ce ovaj materijal pomoci da nauci SQL Server. SQL Server definitivno nije najbolja baza! Kralj baza podataka je Oracle i na ovom sajtu, jos od 2001. godine postoji kurs od nekih 600 stranica, koji mozete da vidite ako kliknete ovdje. Medjutim, pored toga sto je perfektan, Oracle je i skup, a i komplikovan za nauciti. Sve u svemu, ja sam ovdje da nesto kazem i o SQL Serveru. SQL Server je jedna dosta dobra baza podataka, sa jako lijepim interfejsom, koji se veoma lako uci. Ako imate imalo programerskog iskustva, mislim da ce vam ove biljeske biti dovoljne - ne morate trositi pare ni na kakvu knjigu. Kao i vecina Mikrosoftovih proizvoda, instalacija SQL Servera je prilicno jednostavna. Treba imati u vidu da ima nekoliko varijanti SQL Servera, pa vam preporucujem da obratite paznju koju(e) od njih podrzava vasa verzija Windows operativnog sistema. O tome ce biti rijeci i u narednih par lekcija ovoga kursa. Kurs je besplatan, a ukoliko nemate stalan pristup internetu, ovu stranicu mozete snimiti na vas kompjuter. U svakom slucaju, bio bih vam jako zahvalan ukoliko biste me obavjestili ako vam je ovo moje "pisanije" pomoglo da naucite SQL Server, pa bi mi bilo jako drago ako bite mi poslali neki e-mail na moju adresu: slavicnet@hotmail.com . Takodje sve sugestije, ispravke i komentari su dobro dosli. Zeljko Tomic : Sokolac Lekcija 1 - Verzije SQL Servera 2000 Napomena: Svaka od dolje navedenih verzija moze da se nadgradi u vecu • 1) Enterprise edition - ova verzija podrzava racunare sa vise procesora i razne druge vrste hardvera. Pored toga, ova opcija uklucuje Data Transformation Services. Jako je preporucujem za firme koje hoce da razviju aplikacije koje ce raditi na internetu. Osnovne komponente ove verzije su tkz. "Enterprise Manager", tj. alat za kreiranje baza podataka i svih objekata unutar baze. Sledeca komponenta je tkz. "Query Analyzer" koji se uglavnom koristi za pisanje programa i upita. Ova verzija moze da se izvrsava samo na sledecim operativnim sistemima: Windows NT4 (SP5), Win 2000, Win 2000 Advanced Server, Windows 2000 Data Center Server. Treba napomenuti i to da ova verzija ne radi sa Windows 2000 Professional. • 2) Developer Edition - ovo je po meni, za vas najbolja verzija. Jedina razlika izmedju ove verzije i gore pomenute je da nema graficki interfejs za setovanje ostalih jezika, sem engleskog. Dobra stvar je da je licenca mnogo jeftinija od "Enterprise Edition", a radi i na Windows 2000 Professional. Jedan od problema je da, po ugovoru tj. licenci koju dobijate od Mikrosofta, nemate pravo da je izvrsavate na serveru, nego samo na radnoj stanici (workstation). • 3) Standard Edition - ova verzija nema mnogo opcija koje imaju gornje verzije. Ona takodje ne radi na Windows 2000 Professional, ali ima jednu jako dobru opciju, tj. pomocu alata za tkz. replikaciju, cijelu bazu mozete veoma brzo i lako replicirati na drugi kompjuter. Ova verzija nije za pocetnike, i ja bih je preporucio jedino onima koji su novi u ovoj oblasti, hoce da kupe licencu jer im za biznis treba racunar na internetu, ali nisu sigurni da hoce da se u svom daljem radu vezu za SQL Server. • 4) Personal Edition - ova verzija je skoro ista kao i Standardna verzija izuzev sto moze da se izvrsava na Windows 2000 Professional, Windows NT Workstation and Windows 98. Ukoliko nemate racunar bolji od Pentijum 2, ja bih vam preporucio ovu verziju. • 5) SQL Server CE Edition - ova verzija radi na Windows CE, tj. na onoj verziji Windows-a koju mozete naci na tkz. "hand held devices", tj. na dzepnim kompjuterima. Kako je glavna osobina ovih dzepnih kompjutera da imaju veoma ogranicen kapacitet memorije, tako i ova verzija ima ogranicene mogucnosti. Ova verzija se moze konektovati na server, i sa njega skinuti podatke za osobe koje su stalno u pokretu, npr. trgovacki putnici itd. • 6) Desktop Edition - Ukoliko je neko za vas razvio neku aplikaciju na "Enterprise Edition", ali vi hocete da prodjete sa minimalnim ulaganjima, a uz to ne znati ama bas nista o razvoju aplikacija, onda je ova verzija za vas. Ova verzija nema nikakav inerfejs, niti administrativni alat. Jedina stvar koju mozete da radite sa ovom verzijom, je da koristite aplikaciju za rad sa bazom podataka. Zeljko Tomic : Sokolac Lekcija 2 - Kakav racunar trebate Za rad sa SQL Serverom 2000 morate imati minimalno: • 1) Pentijum I - P166 ili bolji • 2) Minimalno 64 Mb RAM-a, izuzev za Windows CE. "Personal Edition" moze da radi i na 32 Mb, dok za "Enterprise Edition" morate da imate najmanje 128 Mb, preporucivo 256 Mb da biste imali "swapping processes", ali to je duga prica. • 3) Hard Disk - 250 Mb za instalaciju, bez ikakvih podataka u bazi. • 4) Ekran rezolucije minimalno 800x600, preporucivo bar 1024x768. • 5) CD ROM za instalaciju • 6) Uredjaj za pravljenje kopije podataka (ne mislim na disketnu jedinicu.) Zeljko Tomic : Sokolac Lekcija 3 - Operativni sistem Ukoliko instalirate "Windows 2000 Professional" na: • 1) Windows 95 - imacete samo "Client Tools" ( bazi mozete pristupiti samo preko URL adrese, ili upitom sa komandne linije) i "Connectivity Only" (mozete se konektovati na server preko aplikacije koju ste napravili u nekom programskom jeziku • 2) Windows 98 - ovaj operativni sistem podrzava "Personal" i "Desktop" verziju. Na server se mozete povezati jedino koristeci "SQL Server Authentication", a ne kroz "System authentication". To znaci da ne mozete koristiti ime i lozinku koju koristite da se prijavite kada startujete Windows 98 (ja to ionako nikada nisam koristio.) U lekciji 1. i 2. smo rekli da Windows 2000 Professional radi sa "Developer" i "Personal" edition. Skoro sve verzije SQL Servera 2000 rade na Windows 2000 Server ili vecim verzijama. Zeljko Tomic : Sokolac Lekcija 4 - Baze unutar SQL Server-a Nakon instaliranja SQL Servera, ustanovicete da vec imate nekoliko baza podataka koje dodju sa serverom: 1. Master baza Ova baza je srce SQL Server-a. Prvu stvar koju treba da naucite o njoj je da nikada nista ne promjenite unutar baze. Ova baza sadrzi: • Korisnicke podatke potrebne za konektovanje u bazu. • Sistemske parametre - setovanje jezika, nacina sortiranje, sigurnosti pristupa. • Imena i informacije vezane za bazu: ime DB datoteka... • Lokacija baze podataka • Nacin na koji je server inicijalizovan. Tabele ove baze podataka sadrze: • Kako je "cache" koristen, tj. kako je memorija rasporedjena izmedju OS i baze. • Sifra jezika koji je instalisan. • Lista jezika koji su na raspolaganju. • Sistemske greske i opomene koje mogu biti upucene korisniku u toku rada. 2. tempdb baza Ova baza podataka je tkz. "privremena" baza, tj. traje samo dok je SQL Server aktivan. Ako zaustavite server, ili ponovo startujete vas kompjuter, ova baza ce biti ponovo kreirana, ali potpuno prazna, bez podataka. Ova baza se koristi za smjestaj privremenih podataka, prilikom sortiranja ili nekih matematickih operacija. Kada se jedna obrada tj. transakcija zavrsi, ti podaci vise nisu potrebni. 3. model baza Ova baza se koristi kao model za kreiranje svih ostalih baza podataka, koje cete vi kao korisnik kreirati. U njoj se nalazi parametar koji definise pocetnu velicinu baze, koji vi mozete promjeniti u ovoj bazi, ukoliko hocete da buduce baze budu razlicite velicine. Pored toga, ako zelite da sve vase buduce baze imaju vec definisane neke objekte, na primer tabele itd. vi mozete njih kreirati u ovoj bazi. Baza se koristi i kao sablon za kreiranje tempdb baze. 4. msdb baza Ova baza se koristi od strane SQL Server Agent-a za izvrsavanje poslova koji su programirani da pocnu u odredjeno vrijeme dana ili noci. Pored toga u ovoj bazi mozete naci i poruke o greskama koje su upucene korisniku u toku izvrsavanja upita. Neki drugi procesi koriste ovu bazu, npr. backup i restore. 5. pubs baza Ova baza podataka je jako korisan primjer iz koga mozemo mnogo nauciti, prije nego sto pocnemo da pravimo nase baze podataka. U ovoj bazi imamo primjer baze podataka nekog fiktivnog izdavaca knjiga. Baza podataka sadrzi podatke o knjigama, autorima, zaposlenim, kao i druge informacije. Northwind baza Ovo je drugi primjer baze podataka koja sadrzi podatke o nekoj fiktivnoj kompaniji koja snabdjeva trgovine robom. Baza sadrzi tabele tipa: Korisnici, Narudzbe, Fakture, Proizvodi itd. Zeljko Tomic : Sokolac Lekcija 5 - Tipovi podataka SQL Server moze da sacuva dvije vrste podataka: • Podatke u ASCII formatu - koristi se jedan bajt, koji moze sacuvati 256 razlicitih znakova jezika • Podatke u UNICODE formatu - koriste se dva bajta, sa 65536 znakovnih mjesta, sto je dovoljno za sve jezike SQL Server ima sledece pri-definisane tipove podataka: • 1) char - ovaj tip je tkz. fiksne duzine, tj. svaki podatak zauzima definisanu duzinu; maksimalna duzina je 256 znakova char(256). • 2) nchar - i ovaj podatak ima fiksnu duzinu, maksimalno nchar(65536), koristi se za UNICODE podatke • 3) varchar - ovaj tip podataka ima promjenjivu duzinu, tj. zauzima samo onoliko znakova kolika je duzina podatka, maksimalno varchar(8000) • 4) nvarchar - isto kao varchar, ali za UNICODE podatke - maksimalna duzina varchar(4000), jer UNICODE zauzima dva bajta po znaku • 5) text - ova vrsta podataka je varijabilne duzine, maksimalno 2 Gb. Ako je podatak manji od text(7000) podaci se cuvaju u skupa sa ostalim podacima, inace se u slog smjesti samo pointer na stvarne podatke. • 6) ntext - ova vrsta podataka je varijabilne duzine, maksimalno 1 Gb, jer cuva UNICODE podatke. • 7) image - ova vrsta podataka je slicna "text" tipu, izuzev sto cuva binarne podatke - slike. • 9) bigint - cuva cijele brojeve, izmedju -9x10**18 i 9x10**18 • 8) int - cuva cijele brojeve izmedju -2,147,483,648 i 2,147,483,647 • 10) smallint - cuva cijele brojeve, izmedju -32768 i 32767 • 11) tinyint - between 0 and 255 • 12) decimal, numeric - cuva decimalne brojeve izmedju -10**38+1 i 10**38 • 13) float - cuva brojeve sa pokretnim zarezom izmedju -1.79E308 i 1.79E308. Brojevi koji se zavrsavaju na 3,6 i 7 se zaokruzuju, pa moze doci do gubljenja preciznosti. • 14) real - cuva podatke izmedju -3.40E38 and 3.40E38. Vrijednost je priblizna, kao u prethodnom primjeru. • 15) money - cuva vrijednosti izrazene u valuti vase zemlje, vrijednosti su izmedju -9x10**14 i 9x10**14 sa 4 decimalna mjesta. • 16) smallmoney - cuva vrijednosti izrazene u nekoj valuti, vrijednosti su izmedju -214,748.3648 i 214,748.3647 • 17) datetime - cuva podatke tipa datum i vrijeme, vrijednosti su izmedju January 1, 1753 i December 31, 9999. Default vrijeme je "12:00:00". • 18) smalldatetime - Cuva datum i vrijeme izmedju January 1, 1900 i June 6th, 2079. • 19) timestamp/rowversion - Ukoliko kreirate slog koji sadrzi polje tipa "timestamp", svaki put kada je taj slog modifikovan u ovo polje ce biti automatski upisan datum i vrijeme promjene. Mikrosoft preporucije koristenje "rowversion" posto je ovaj tip kompatibilan sa SQL-92 standardom. • 20) uniqueidentifier (GUID) - vrijednost za ovo polje se generise automatski na osnovu broja koji je upisan u procesor vaseg racunara, kao i broja vase mrezne kartice, i naravno, datuma i vremena kada je transakcija uradjena. Ovo je jako vazno za neke institucije, kao drzavne organe, koji ponekad hoce da udju u trag koji je pojedinac izvrsio promjenu nekih podataka. Podatak je jedinstven za svaki kompjuter u svijetu. • 21) binary - koristi se za tkz. programske "flagove", ili kombinaciju "flagova". • 22) varbinary - pinarni podatak promjenjive duzine. • 23) bit - podatak zauzima samo 1 bit (cuva samo vrijednosti 0 i 1). Zeljko Tomic : Sokolac Lekcija 6 - SQL Server alati Za uspjesan rad sa SQL serverom, potrebno je znati nekoliko njegovih alata. Najvazniji su: • Enterprajz Menadzer (Enterprise Manager) - je jedan od najvaznijih alata SQL Servera. On nam omogucuje da izvrsimo skoro svaki administrativni zadatak potreban za rad sa ovom bazom podataka. • Kveri Analajzer (Query Analyzer) - koristi se za kreiranje, debagiranje i testiranje T-SQL (MS SQL jezik) skripti, kao i analiziranje brzine njihovog izvrsavanja. Zeljko Tomic : Sokolac Lekcija 7 - Enterprajz menadzer Engleski: Enterprise Manager Ako ste tek instalirali i poceli da ucite SQL Server, vjerovatno se ova baza nalazi na istom kompjuteru na kome sada radite. Medjutim, SQL Server je obicno instaliran na posebnom racunaru, koji je povezan u mrezu sa drugim racunarima. U skvakom slucaju, princip je isti. Glavna stvar koju vi treba da znate u vezi komunikacije sa bazom podataka je da na racunaru na kome je instaliran SQL Server, postoji jedan mali proces (program koji je stalno aktivan) koji "osluskuje" zahtjeve drugih programa i ispunjava njihove zelje. Funkcija pomenutog servisa je da prosledi nase zahtjeve SQL masini, koja je srce SQL Servera i koja u stvari izvrsava sve prosledjene upite nad podacima spremljenim u bazi podataka. Mozda je dobro pomenuti i to da, posto se ovaj servis izvrsava pod Windows-ima, onda su Windows-i odgovorni za uspjesnost izvrsavanje ovog programa jer mu oni dodjeljuju potrebnu kolicinu memorije, procesorskog vremena i ostalih kompjuterskih resursa. Posto je jedini nacin komuniciranja sa SQL Serverom putem ovog malog servisa, a on nema nikakvog korisnickog interfejsa (programa za komunikaciju sa bazom podataka, tj. SQL Server masinom), bilo je potrebno napraviti alate, kao sto je Enterprajz menadzer. Enterprajz menadzer je program koji moze biti koristen za razvoj programa i administraciju vise baza podataka istovremeno. 1. Mikrosoft menadzment konzola - je graficki alat koji predstavlja srz Enterprajz menadzera, zbog toga sto povezuje alate kao sto su Enterprajz menadzer i IIS server (Internet Information Server tj. Informacioni internet server). Za startovanje SQL server enterprajz menadzera izaberite Start->Programs->Microsoft SQL Server->Enterprise Manager. U prozoru koji ce se otvoriti, vidjecete tkz. nodove (nodes) koji su oznaceni sa + znakom. Nodovi su obicno zatvoreni, i otvaraju se ako kliknete na njih. Ukoliko pod opcijom SQL Server Group ne vidite ni jednu bazu podataka, provjerite da li imate instaliranu bazu ili pokusajte da se konektujete na neku od njih. Ako ste medjutim, uspjeli da se konektujete u vasu bazu podataka, pored imena vase baze vidjecete nekoliko nodova tj. cvorova, o kojima cemo jos da diskutujemo u narednim lekcijama. Security node - cvor za sigurnost baze - ovaj nod definise ko ima pravo da se konektuje (logins), koja prava korisnik ima u toj bazi (roles), koji su povezani serveri (Linked Servers) i udaljeni serveri (Remote Servers) sa kojima moze da radi. Database Node - cvor za baze podataka - ovaj nod, sadrzi ikone za svaku vrstu objekata koje baza podataka posjeduje. Na primjer, ako u desnom prozoru kliknemo na Tables, vidjecemo sve tabele koje su kreirane u bazi. View Node - cvor za dinamicke table - ovaj cvor sadrzi listu upita, koji se koriste za kreiranje dinamickih tabela, baziranih na jednoj ili vise tabela u bazi podataka. Napomena: Kod rada sa ovim vizuelnim alatima, veoma je vazno na kojem je nodu (cvoru) pozicioniran kursor. U zavisnosti od toga, dobijate na raspolaganje mnostvo drugih komandi na glavnom meniju i kada kliknete na desni taster misa 2. Menadzer servisa (Service Manager) - je programski alat koji omogucuje startovanje i zaustavljanje servisa, neophodnih za komuniciranje sa bazom podataka. Zeljko Tomic : Sokolac Lekcija 8 - Analizator upita Analizator upita (Query Analyser) - je mocan alat za pisanje, testiranje i izvrsavanje SQL upita, kao i prikazivanje dobijenih rezultata. Prvobitna verzija ovog alata se zvala, ISQL i mozete je probati startovanjem is CMD (DOS) prozora. Jako puno podsjeca na Oracle SQL*Plus. Za startovanje ovoga alata potrebno je izabrati opciju Start->Programs->Microsoft SQL Server->Query Analyzer. Prilikom startovanja ovog alata, potrebno je unijeti korisnicko ime i lozinku (password). Ukoliko ste instalirali bazu, ali niste kreirali novog korisnika, mozete se konektovati kao korisnik "sa". Za lozinku ostavite prazno polje. Drugi nacin je konektovanje koristeci prava koja ste stekli kada ste se prijavili kao Windows korisnik. Naime, vase korisnicko ime i lozinka, bice koristeni za konektovanje u bazu. Ukoliko je baza instalirana na istom kompjuteru, necete imati nikakvih problema ako izaberete ovu opciju. U desnom okviru prozora koji se otvorio kada smo startovali Analizator upita (The Object Browser), mozemo vidjeti nekoliko baza podataka (cetiri baze su neophodne za startovanje SQL servera; dvije baze su primjeri). Ova grupa baza podataka poznata je pod nazivom "sistemski objekti" ili System Objects. Ona ukljucuje sistemske table, poglede (dinamicke tabele), kao i cijele baze podataka. Druga grupa objekata se naziva "zajednicki objekti" ili Common Objects i ona ukljucuje sve one objekte koji su zajednicki za sve baze podataka. Zeljko Tomic : Sokolac Lekcija 9 - meni Analizatora upita (1) FILE->Connect - ovu opciju koristimo za konektovanje na novi server. FILE->Disconnect - ova opcija je za odjavu sa servera FILE->Disconnect All - ova opcija ukida sve konekcije SQL Servera FILE->New - Otvara prazan okvir za pisanje upita. To mozemo uraditi i sa <Ctrl+Shift+P> tasterima. FILE->Save - Ova opcija snima upit koji smo napisali ili rezultat tog upita. FILE->Exit - Odjavljuje nas od svih servera na koje smo konektovani, i zatvara Analizator upita. <Alt+F4> Edit->Clear Window - Opcija brise upit u radnom okviru <Ctrl+Shift+Delete > Edit->Bookmarks - Markira tekucu liniju u radnom okviru <Shift+F2>. Za skakanje na sledeci bookmark koristite F2 taster, na prethodni Shift+F2 a sa ukidanje bukmarka Ctrl+F2. Za brisanje svih bukmarka kucajte Ctrl+Shift+F2. Edit->Insert template - Ova komanda bacuje templejt u radni panel <Ctrl+Shift+Ins> Edit->Replace Template Parameters - Mijenja parametre sablona koji smo ubacili u radni panel <Ctrl+Shift+M> Edit->Advanced - Ova opcija se koristi za setovanje pod-meni opcija • Edit->Advanced->Make Selection Lower Case - Pretvara selektovani tekst u velika slova. <Ctrl+Shift+L> • Edit->Advanced->Make Selection Upper Case - Pretvara selektovani tekst u mala slova. <Ctrl+Shift+U> • Edit->Advanced->Increase Indent - uredjuje tekst, povecava broj praznina na pocetku redova <Tab> • Edit->Advanced->Decrease Indent - uredjuje tekst, smanjuje broj praznina na pocetku selektovanih redova <Shift+Tab> • Edit->Advanced->Comment out - stavlja znakove komentara na komande,tako da se nece izvrsiti <Ctrl+Shift+C> • Edit->Advanced->Remove Comments - Brise komentare iz selektovanog koda <Ctrl+Shift+R> Query->Change Database - Koristite ovu opciju ako hocete da se konektujete na drugu bazu podataka <Ctrl+U> Query->Parse - Kompajlira selektovani kod u cilju provjere gresaka <Ctrl+F5> Query->Execute - Izvrsava selektovani tekst <F5> <Ctrl+E> Query->Cancel Executing Query - Prekida izvrsavanje selektovanog teksta <Alt+Break> Query->Results in Text - Prebacuje rezultat nekog upita u format, pogodan za snimanje u tekst datoteku <Ctrl+T> Query->Results in Grid - Prikazuje rezultate u grid obliku <Ctrl+D> Query->Results to File - Salje rezultat upita direktno u datoteku <Ctrl+Shift+F> Query->Current Connection Properties - Prikazuje atribute vase konekcije na bazu podataka • SET noexec ON • SET parseonly ON • SET rowcount 20 - return only 20 redova iz upita • SET quoted_identifier OFF - omogucuje upotrebu duplih navodnika za definisanje vrijednosti stringa unutar skripta. Zeljko Tomic : Sokolac Lekcija 10 - meni Analizatora upita (2) Tools->Options Menu - <Ctrl+Shift+O> - ova opcija se koristi za setovanje mnogo opcija u Analizatoru upita. Ima vise tabulator dijalog boksova. • The General Tab - radni folder, ekstenzije datoteka... • The Tab Editor - definise karakteristike vaseg editora. Mozete da definisete i koliko praznih mjesta je vas tabulator, kao i da li hocete da snimite znakove za prazno umjesto "tab" znaka, ili da li hocete da snimate u UNICODE formatu. • The Result Tab - definise kako su rezultati prikazani u Kveri analajzeru. • The Connection Tab - mozete selektovati vas "regional setting", tj. nacin na koji ce biti prikazani datumi, brojevi, valute ... • The Connection Properties Tab - Isto kao "Query->Current Connection Property", izuzev sto se koristi za setovanje konekcije na SQL Server. • The Fonts Tab - definise fontove koje zelite da koristite. • The Script Tab - Definishe atribute skripti koje pisete. Tools->Customize Menu - programira funkcijske tastere da izvrse odgovarajucu radnju. Zeljko Tomic : Sokolac Lekcija 11 - Ostali alati SQL Servera Analysis Services - koriste se za "data mining" i "data warehousing". English Query - Omogucavaju onima koji nisu programeri da postavljaju upite na engleskom jeziku. Data Transformation Services - Koriste se za "obradu" i ciscenje podataka, povecavajuci njihovu tacnost. Izvor podataka moze biti bilo koja druga baza podataka, npr. Oracle, Access ... SQL Profiler ovaj alat koriste administratori baza podataka za nadgledanje performansi baze, tj. kako se procesi baze odvijaju. Zeljko Tomic : Sokolac Lekcija 12 - Kreiranje baze podataka Prvi korak pri radu SQL Servera je da kreirate svoju bazu podataka. Kreiranje baze podataka vrsi se u SQL Server Enterprise Manager-U. Prvo je potrebno da startujete Enterprajz Menadzer (Start->Programs->Sql Server->Enterprise Manager.Bazu podataka mozete kreirati na sledece nacine: • 1. Kliknete na "Databases", a zatim kliknete na desni taster misa. Na meniju koji dobijete izaberite opciju "New Database..". Slijedite instrukcije koje dobijete. Ukoliko nemate posebnih zahtjeva, ostavite sve kako vam Enterpajz menadzer predlozi. Naravno, preporucujem da promjenite ime baze podataka. • 2. Kliknite na "Wizard" taster na vasem "Toolbar"-u (to je mala ikona na vrhu ekrana, u obliku carobnog stapica). Slijedite instrukcije. Na kraju, kada je baza kreirana, dobicete poruku: "Would you like to create a maintenance plan ....". Kliknite na "No", i sa ovim je proces kreiranja baze zavrsen, ukoliko izvrsenje koda koji je Wizard generisao ne naidje na neki problem prilikom izvrsavanja. • 3. Otvorite "Query Analyzer" i kucate sledecu komandu: CREATE DATABASE snet_Test ON (NAME='snet_Test_Data', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\snet_Test_Data.MDF', SIZE=1, FILEGROWTH=10%) LOG ON (NAME='snet_Test_Log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\snet_Test_Log.LDF', SIZE=1, FILEGROWTH=10%) COLLATE SQL_Latin1_General_CP1_CI_AS GO Nakon sto ste ukucali ovu komandu, kliknite na zeleni trougao u "Toolbar"-u da izvrsite komandu. Prilikom instalacije nove baze podataka, SQL Server setuje mnogo parametara, koje mi nismo naveli u nasoj komandi. To zbog toga sto default vrijednost SQL Server cuva u "model" bazi podataka, tako da ih koristi prilikom kreiranja baze. Ukoliko niste zadovoljni sa nekom od ovih opcija vi ih mozete promjeniti ako ih ukucate u Kveri analizer. Evo i nekoliko primjera za to: EXEC sp_dboption 'snet_Test', 'autoclose','True' GO EXEC sp_dboption 'snet_Test', 'read only','False' GO EXEC sp_dboption 'snet_Test', 'dbo use','False' GO EXEC sp_dboption 'snet_Test', 'single','False' GO EXEC sp_dboption 'snet_Test', 'autoshrink','False' GO EXEC sp_dboption 'snet_Test', 'quoted identifier','True' GO EXEC sp_dboption 'snet_Test', 'ANSI null default','False' GO Treba reci da je sp_dboption jedna sistemska funkcija, koja nam omogucava da setujemo ove parametre. Rijec je o tkz. "stored procedure", tj. proceduri koja je uskladistena u samoj "master" bazi SQL Servera. Moj omiljeni parametar je 'quoted identifier' koji ja setujem na 'False'. U tom slucaju, vrijednosti za stringove unutar baze podataka mogu biti definisani koristenjem bilo apostrofa ili navodnika. Napominjem i to da su navodnici tj. znak " koristeni za varijable koje imaju prazno mjesto u imenu. Napomena: Ukoliko u "Object browser"-u ne vidite bazu koju ste kreirali, kliknite na ikonu "Refresh", koja se nalazi u Toolbar-u, a ista je kao u Internet Explorer-u. Zeljko Tomic : Sokolac Lekcija 13 - komande Query Analyser-a 1. Prikazivanje informacija o bazi podataka Unesite "sp_helpdb snet_test" komandu. Ova komanda ce prikazati sve podatke o bazi podataka. 2. Brisanje baze podataka Za brisanje baze podataka, koja vam vise nije potrebna kucate: "DROP DATABASE snet_test" u Query Analyser u pritisnete Execute ikonu. Ova komanda ce izbrisati sve podatke o ovoj bazi podataka iz sistem tabela, kao i fizicke datoteke na disku servera. Napominjem i to da morate pritisnuti ikonu "Refres", da bi baza podataka nestala iz "Object Navigator"-a. Zeljko Tomic : Sokolac Lekcija 14 - Kreiranje Tabela U prethodnoj lekciji smo naucili kako da kreiramo i izbrisemo bazu podataka. Baza podataka se definise kao jedan kontejner za sve ostale objekte koje baza moze sadrzati. Sa druge strane, tabele su osnovni objekti baze podataka, koji se koriste za smjestanje podataka. Baza podataka bez tabela je beskorisna. U ovoj lekciji cete nauciti kako da kreirate, modifikujete i izbrisete neku tabelu iz baze podataka. Kao i u prethodnoj lekciji, i ovdje cemo koristiti "Enterprise Manager" i "Query Analyzer" da izvrsimo ovaj zadatak. Za tabelu kazemo da je kontejner za slogove (ili vrste), koji su opet podjeljeni na polja(ili kolone). Svaka kolona ima svoj tip podataka, koji moze da cuva. Svako polje ima i dvije specijalne osobine: NULL i IDENTITY. Ako kolona dozvoljava smjestanje NULL vrijednosti ("nije poznata vrijednost polja"), to znaci da mi mozemo dodati novu vrstu u tabelu bez unosenja vrijednosti tog polja. Naravni, vrijednos uvijek moze biti naknadno dodata. Drugi atribut polja je IDENTITY. Ovaj atribut omogucuje da se polje popuni sa numerickom vrijednoscu, koja je generisana automatski. Using "IDENTITY" properti IDENTITY properti je vrlo slican "AutoNumber" u Access-u, izuzev sto ne garantuje jedinstvenu vrijednost za svaku kolonu. IDENTITY, kao i "SEQUENCE" u Oracle-u, ima svoju pocetnu vrijednost (default 1), kao i svoj inkrement (default 1). Drugim rijecima, to znaci da ce prvi slog koji unesemo u tabelu dobiti vrijednost 1, a svaki sledeci ce biti uvecan za 1 ( tj. 2,3,4...). Kucajte u "Query Pane" sledecu komandu: CREATE TABLE Test ( testID int IDENTITY NOT NULL, testName varchar(20) NULL ) sledeca komanda je malo drugacija, ali daje isti rezultat: SET ANSI_NULL_DFLT_OFF ON CREATE TABLE Test ( testID int IDENTITY(1,1) NOT NULL, testName varchar(20) NULL ) Jedina razlika je sto smo kod druge komande eksplicitno naznacili da se polje "testID" automatski popunjava sa pocetnom vrijednostu 1 i svaki sledeci put se uvecava za 1. Stvar je sto su to iste vrijednosti, kao i one koje su unaprijed definisane. Jos nekoliko interesantnih stvari: • IDENTITYCOL kljucna rijec nam omogucuje da izvrsimo upit na IDENTITY koloni, cak ako ne znamo ni ime kolone. Postoji nekoliko nacina da nadjemo informacije o IDENTITY koloni u SQL Serveru. • Funkcije IDENT_SEED() i IDENT_INCR() nam omogucuju da vidimo pocetnu vrijednost i inkrement za definisanu kolonu. • Sistemska funkcija @@IDENTITY vraca vrijednost zadnje kolone koja je dodata u tabelu. Quote Link to comment Share on other sites More sharing options...
Guest account 5 Posted October 28, 2005 Report Share Posted October 28, 2005 < II DEO > » Click to show Spoiler - click again to hide... «Using "NULL" properti SQL Server "Allow Null" property ("dozvoli nule property"), definise da li neka kolona moze biti ostavljena nepopunjena tj. prazna. Vrijednost "NULL", znaci da vrijednost za to polje postoji, ali jos nije poznato. Primjera radi, broj odsutnih studenata moze biti "NULL", sto bi znacilo da vrijednost nije poznata, tj. da je profesor zaboravi da prebroji studente. Sa druge strane, vrijednost moze biti nula tj. "0", sto znaci da su svi studenti bili prisutni tj. da je profesor prebrojao studente i ustanovio da nema odsutnih. Prilikom racunanja prosjecne posjecenosti nastave, profesor moze izostaviti "NULL" vrijednosti i na taj nacin ce dobiti mnogo bolji prosjek, nego da pretpostavi da su "NULL" vrijednosti vrijednost 0. U gornjem primjeru, kada smo kreirali nasu prvu tablu na ovom kursu, vidjeli smo da smo za "testID" naznacili da vrijednost ne moze biti NULL. Sa druge strane, vrijednost "testName" NULL vrijednost je dozvoljena. Primljer: Kreiraj tabelu "Test2" i dodaj jedan slog. Nakon toga, izbrisi tabelu iz baze. CREATE TABLE Test2 ( testID int, testName varchar(20) ) GO INSERT INTO TEST2 VALUES ( '2', 'MARIJA' ) GO DROP TABLE TEST2 GO Zeljko Tomic : Sokolac Lekcija 15 - Korisnicki tipovi podataka Tabela u SQL Server moze da ima do 1024 kolone. Medjutim, duzina jedne vrste je ogranicena na 8060 bajtova, izuzev za podatke tipa "IMAGE" i "TEXT", jer se oni cuvaju izvan vrste. Pored sistemskih tipova podataka koji su ugradjeni u bazu podataka ( npr. VARCHAR, INT, NUMBER, TEXT...) i vi mozete definisati svoje tipove podataka. Oni se u SQL Serveru nazivaju "user-defined types". Oni se mogu koristiti za standardizaciju tipova kolone unutar svih tabela. Treba napomenuti i to da su ovi tipovi podataka smjesteni u bazi koju ste vi kreirali, a ne u "master" bazi. Kreiranje definicije korisnickog tipa podataka Tip podataka MORA biti kreiran prije tabele u kojoj hocete da ga koristite. Za kreiranje se koristi sledeca sintaksa: sp_addtype PostanskiBroj, 'int', 'NOT NULL' go Da vidite koji sistemski tipovi postoje kucajte: SELECT * FROM systypes go name ---------------- image text uniqueidentifier tinyint smallint int smalldatetime real money datetime float sql_variant ntext bit decimal numeric smallmoney bigint varbinary varchar binary char timestamp nvarchar nchar sysname PostanskiBroj Za brisanje tipa podataka iz tabele koristimo: sp_droptype PostanskiBroj Dobijamo poruku: (1 row(s) affected) Type has been dropped. Zeljko Tomic : Sokolac Lekcija 16 - Odrzavanje tabela Ako ste nekada kreirali tabelu, pa kasnije ustanovili da u nju niste ukljucili neke vazne kolone, susreli ste se sa problemom izmjene strukture tabele. U SQL Serveru mozete dodati kolonu, promjeniti parametre kolone, ili jednostavno izbrisati kolonu. U ovoj lekciji cemo vidjeti kako je to moguce. MODIFIKOVANJE TABELE Modifikovanje strukture tabele mozemo uraditi iz "Enterprise Manager"-a ili iz "Query Analyser"-a. Dodavanje kolone u tabelu ALTER TABLE Test2 ADD MojaAdresa VARCHAR(40) Modifikovanje kolone u tabeli Ako smo nakon izvjesnog vremena ustanovili da je duzina polja "MojaAdresa" premala za nase potrebe, polje mozemo povecati koristeci sledecu komandu: ALTER TABLE Test2 ALTER COLUMN MojaAdresa VARCHAR(60) Brisanje kolone u tabeli Ako nakon nekog vremena, ustanovite da imate suvisnu kolonu u tabeli, mozda biste trebali da je izbrisete. Brisanje tabele je moguce samo ukoliko kolona nije indeksirana. ALTER TABLE Test2 DROP COLUMN MojaAdresa Kliknite na tabelu Test2 u Objekt navigatoru, a onda sa desnim tasterom na misu, pozovite "Refresh" da bi kolona "MojaAdresa" nestala i iz "Objekt Navigatora". Zeljko Tomic : Sokolac Lekcija 17 - Generisanje skripti Ako imate jednu SQL bazu, sa jednom ili vise tabela, kao i drugih objekata baze podataka, bilo bi dobro da znate i kako generisati T-SQL skriptu, tako da imate: • kopiju baze podataka, u slucaju da morate opet da je kreirate • mozete da kreirate identicnu bazu na drugom serveru • koristite taj skript da napravite slicnu bazu podataka. Recimo da hocete da napravite skript za kreiranje "Nortwind" baze podataka. U "Object Navigator" prozoru kliknite na "Northwind", a zatim kliknite na desni taster misa. Izaberite opciju "All Tasks->Generate SQL Script". Na "General" panelu kliknite na "Show All" opciju, nakon cega ce svi objekti baze biti prikazani. Izaberite objekte za koje zelite da napravite skript. Na "tab"-u "Formatting" izaberite opcije kako hocete da skript bude kreiran. Npr. skript moze prvo da pokusa da pobrise bazu podataka (ukoliko vec postoji), mozete imati komentare, ili skript moze biti kompatibilan sa starijim verzijama SQL Servera. Na "tab"-u "Options" imate jos nekoliko nacina na koji skript moze biti kreiran. Nakon sto ste izabrali sve zeljene opcije, kliknite na "OK" i program ce vas pitati gdje i pod kojim imenom zelite da kreirate skript. Vjezba: • Kreirajte "type" BrojTelefona: EXEC sp_addtype BrojTelefona 'VARCHAR(12)', 'NULL' GO • Kreirajte tabelu "Korisnici" CREATE TABLE Korisnici ID int IDENTITY NOT NULL, Ime VARCHAR(20), Prezime VARCHAR(20), Telefon BrojTelefona ) GO • Upisite neki podatak u tabelu: INSERT INTO Korisnici VALUES ( 'Zeljko','Tomic','604-528-0990' ) INSERT INTO Korisnici VALUES ( 'Marija','Tomic','604-528-0487' ) • kucajte: EXEC sp_help BrojTelefona Dobicete sve potrebne informacije o objektu koji ste kreirali na pocetku ove vjezbe. • Ukoliko vam ova tabela ne treba kucajte: DROP TABLE Korisnici GO • Da biste izbrisali tip podataka "BrojTelefona" morate koristiti proceduru sp_droptype: EXEC sp_droptype 'BrojTelefona' GO • U sledecem primjeru imamo skript za kreiranje jedne male baze podataka za neku videoteku. Baza ima sledece tabele: Actors( ili Glumci), Customers (ili Kupci), Genres (ili KategorijaFilma), MovieCasts( ili Uloge), Movies ( ili Filmovi), Rentals (ili Iznajmljivanje). CREATE TABLE Customers ( CustomerID INT IDENTITY NOT NULL, Last_Name VARCHAR(30), First_Name VARCHAR(30), Address VARCHAR(50), Apartment INT, City VARCHAR(20), Province VARCHAR(20), PostalCode VARCHAR(7), AreaCode VARCHAR(3), PhoneNumber VARCHAR(12) ) GO CREATE TABLE Movies ( MovieCode int IDENTITY(100,1) NOT NULL, MovieTitle VARCHAR(100), YearReleased CHAR(4), PlotSummary VARCHAR(4000), RentalPrice SMALLMONEY, GenreID SMALLINT ) GO CREATE TABLE Genres ( GenreID SMALLINT IDENTITY(200,1) NOT NULL, GenreName VARCHAR(100) ) GO CREATE TABLE Actors ActorID int IDENTITY(300,1) NOT NULL, FirstName VARCHAR(30), LastName VARCHAR(30) ) GO CREATE TABLE MovieCasts ( ActorID int NOT NULL, MovieID int NOT NULL ) GO CREATE TABLE Rentals ( TransactionID int IDENTITY(1000,1) NOT NULL, CustomerID int NOT NULL, TransactionDate SMALLDATETIME, DueDate SMALLDATETIME, MovieID SMALLINT NOT NULL, TransactionAmount SMALLMONEY ) Zeljko Tomic : Sokolac Lekcija 18 - Rad sa indeksima Indeksi su objekti baze podataka koji ze baziraju na jednoj ili vise kolona tabele. Svrha im je da ubrzaju pretrazivanje tabela. Za pravilno koriscenje indeksa treba dosta iskustva. Ponekad neki indeks radi jako dobro , medjutim nakon sto tabela postane velika, brzina dobijanja podataka pomocu tog indeksa moze znacajno da degradira. Iako indeksi ubrzavaju pretrazivanje podataka, oni u isto vrijeme usporavaju unosenje novih podataka u tablu, azuriranje i brisanje podataka, jer se sa svakom od ovih operacija istovremeno azuriraju svi indeksi napravljeni na toj tabeli. U ovoj lekciji cemo da objasnimo razlicite tipove indeka koji se mogu kreirati u SQL Serveru, koristenjem "Enterprise Manager"-a i "Query Analyzer"-a. Kreiranje indeksa Indeksi ubrzavaju pronalazenje podataka, sortiranje podataka ili spajanje tabela ("join"). Pored toga omogucavaju kreiranje kolona koje ne mogu sadrzati duplikate, kao i sortiranje podataka po odredjenom pravilu. Medjutim, ako indeks ima manje od 90% jedinstvenih vrijednosti, za njega kazemo u SQL Serveru da nije "SELEKTIVAN", tj. SELECT komanda ga ne koristi, jer je skeniranje tabele brze. Sa druge strane, treba biti oprezan sa kreiranjem indeksa, jer SQL Server mora da azurira sve indekse prilikom ubacivanja (insert), azuriranja (update) i brisanja (delete) podataka u toj tabeli. SQL Server podr?ava tkz. "Clastered Indexes". Ova struktura forsira fizicki redosled podataka na disku, koji se na disk smjestaju sortirani po vrijednosti indeksa. Pretrazivanje podataka uredjenih na ovaj nacin je jako brzo. Kod indeksa koji nisu uredjeni na ovaj nacin, podaci (slogovi) se smjestaju onim redosledom kako se unose u bazu. Takodje treba primjetiti, da je za indekse koji su tipa "klaster", treba mnogo vise prostora na disku. SQL Server koristi tkz. "Balanced Tree" ili "Balansirano stablo" ili "B-Tree" za smještanje indeka. Ako mi zatra?imo od SQL Servera pretra?ivanje podataka po nekoj tabli koja nije indeksirana, SQL Server ce da skenira cijelu tabelu, tj. procita sve slogove tabele. U SQL Serveru mo?emo kreirati, ne samo indekse zasnovane na jednoj, nego i indekse zasnovane na više kolona. Na primjer, mozemo kreirati indeks koji je zasnovan na prezimenu, a unutar prezimena i po imenu. Ovakav indeks se naziva "composite" ili "mjesoviti" indeks. SQL Server podrzava maksimalno 16 kolona u jednom indeksu sa maksimalnom kombinacijom od 900 bajtova. Kod kreiranja slozenih indeksa preporucuje se da se na prvo mjesto stavi kolona koja ima najmanje duplikata. Takodje, kod pravljenja upita, nakon "WHERE" rijeci treba staviti polja tabele u redosledu kombinovanog indeksa. Ako ne ispostujete redoslijed, SQL Server nece moci da koristi indeks za pretrazivanje. Zeljko Tomic : Sokolac Lekcija 19 - Rad sa indeksima (2) Za kreiranje indeksa mozete koristiti "Template" tj. šablon iz Analizatora upita. U "object navigator", kliknite na "Templates" tabulator. Izaberite "Create Index Basic" opciju. Nakon toga idite na "Edit->Replace Template Parameters" opciju i ukucajte vrijednosti za ponudjene parametre. Nakon toga dobicete sledecu DDL komandu: CREATE INDEX Fudbaleri_Ime_Prezime_ndx ON Test.dbo.Fudbaleri (Prezime, Ime) GO Ova komanda ce kreirati indeks nad tabelom "Fudbaleri". Indeks je zasnovan na dvije kolone: Prezime i Ime. Primjetili ste da je prva kolona u indeksu "Prezime". To je zbog toga sto u vecini slucajeva izvjestaje koje pravimo, ili pretrazivanje koje vrsimo, koristimo "Prezime" kolonu. Clastered indeks kreiramo komandom: CREATE UNIQUE CLASTERED INDEX Fudbaleri_ID_Prezime_ndx ON Test.dbo.Fudbaleri (ID, Prezime DESC) GO Ovaj indeks je zasnovan na kolonama "ID" i "Prezime". Primjecujete i to da iza rijeci "Prezime" ide kljucna rijec "DESC", sto znaci da hocemo da indeks bude uredjen u opadajucem redoslijedu prezimena. Takodje treba naglasiti da ovaj indeks nema smisla, jer "ID" kolona je jedinstvena, prema tome kolona "Prezime" nema nikakvog uticaja na indeks. Opcija DROP_EXISTING se koristi kao direktiva SQL Serveru da se postojeci index, sa istim imenom, zamijeni sa novim indeksom. Sledeca komanda se koristi da se kreira indeks nad tabelom "Fudbaleri" u bazi podataka "Glasinac", nad kolonama "Prezime" i "Ime". CREATE UNIQUE CLUSTERED INDEX Fudbaleri_Ime_Prezime_ndx ON Glasinac.dbo.Fudbaleri (Prezime DESC, Ime) WITH PAD_INDEX, FILLFACTOR = 50, IGNORE_DUP_KEY, DROP_EXISTING, STATISTICS_NORECOMPUTE ON [PRIMARY] GO Da biste vidjeli koji indeksi su kreirani u SQL Serveru, koristite sledeci upit u "Query Analyser"-u. SELECT o.name AS [Table Name], i.name AS [index Name], i.indid AS [index ID], i.FirstIAM FROM sysobjects AS o JOIN sysindexes AS i on o.id = i.id WHERE o.id > 100 ORDER BY o.name Ovaj upit iz sistemskih tabela dobija podatke koji indeksi su kreirani u bazi podataka sa kojom mi trenutno radimo. Primjeticete da se indeks kreira svaki put kada mi kreiramo tabelu sa kolonom za koju definisemo da ne moze imati nule. Zeljko Tomic : Sokolac Lekcija 20 - Rad sa indeksima (3) • Indeksi u SQL Serveru su takodje organizovani u vidu tabela, kao i sami podaci. • Indeksne tebele su obicno mnogo manje nego tabele sa podacima. • Zbog brzine pretrazivanja, u velikim bazama podataka, indeksne tabele se cuvaju na posebnim diskovima. • Kada se trazeni podatak nadje u indeksnoj tabeli, iz indeksne tabele dobijemo fizicku adresu na disku gdje se nalaze podaci. • Indeks moze biti kreiran na jednoj koloni simple index ili na vise kolona compound index. • Postoje dvije vrste indeksa, clastered i non-clastered. • Kod klasterovanih indeksa, podaci i indeksi se cuvaju skupa, tj. indeksi kontrolisu fizicki raspored podataka. • Kod indeksa koji nisu klasterovani, podaci i indeksi se cuvaju odvojeno. Podaci se smjestaju na disk u redosledu u kome se unose u bazu. • Primarni kljuc se moze kreirati na koloni (ili grupi kolona) koje uvijek vracaju jedinstvenu vrijednost, tj. nemaju duplikate. • Alternativni kljuc ("Alternate Key") je kolona u tabeli, koja bi takodje mogla biti proglasena za kljuc. Primjera radi, ukoliko imamo tabelu sa maticnim brojem i brojem licne karte, bilo koja od ove dvije kolone bi mogla da bude proglasena primarnim kljucem. • Samo kolone tabele cije vrijednosti se ne mjenjaju cesto, su dobri kandidati za kljuceve. • Strani kljuc, ili Foreign key je kolona u tabeli koja mora imati vrijednost primarnog kljuca neke druge tabele. Na primjer, u tabeli "Ispiti", imamo polje "Sifra_Studenta", koja mora odgovarati polju "Sifra_Studenta" u tabeli "Studenti". • Kod tkz. klasterovanih indeksa, ili clastered indexes, ubacivanje novih slogova moze znaciti da se vec postojeci slogovi moraju prepisati na drugu lokaciju na disku. SQL Server ima opciju da "full factor" bude specificiran, tj. da mjesto za slogove bude rezervisano. Primjera radi, ako imamo slogove sa kljucem: 1,2,3,4,6,7,8,9, i 10 vec upisane na disku, SQL Server bi ostavio prazno mjesto za slog sa kljucem 5. • Ako niste sigurni da li pravilno koristite indekse u nekoj bazi podataka, koristite Index Tuning Wizard, alat u SQL Serveru. Zeljko Tomic : Sokolac Lekcija 21 - Kreiranje indeksa Kreiranje indeksa iz Enterprise Manager-a U "Object Navigator"-u, kliknite na tabelu nad kojom hocete da kreirate indekse. Zatim, kliknite na desni taster misa, i izaberite opciju "Design Table". Nakon toga, kliknite na "Manage Indexes/Keys" na toolbar-u. Na tabulatoru "Indexes/Keys", kliknite na "New" taster, a zatim: upisite ime indeksa, izaberite kolonu (ili kolone) na kojoj je indeks baziran, "order" - da li je indeks rastuci ili opadajuci, da li zelite "UNIQUE" i "CLUSTERED" indeks. Definisanje primarnog kljuca iz Enterprise Manager-a U "Object Navigator"-u, kliknite na tabelu nad kojom hocete da kreirate indekse. Zatim, kliknite na desni taster misa, i izaberite opciju "Design Table". U prozoru koji ce se otvoriti, selektujte polje koje hocete da proglasite za primarni kljuc, a onda kliknite na desni taster misa i izaberite opciju "Set Primary Key". Kreiranje indeksa koriscenjem "wizard"-a Wizard Mozete startovati sa "Tools->Wizards" ili kliknite na "Wizard" ikonu na toolbar-u. Izaberite "Create Index Wizard", selektujte odgovarajucu bazu podataka i tabelu nad kojom hocete da kreirate kljuc. Zatim, izaberite kolonu(e) nad kojima hocete da kreirate indeks. Kreiranje indeksa koriscenjem "All Tasks" opcije Kliknite na tabelu u "Object Navigator"-u za koju zelite da kreirate indeks. Kliknite na desni taster na vasem misu, a zatim izaberite opciju "All Tasks->Manage Indexes". Ukucajte ime indeksa, izaberite kolone na kojima hocete da kreirate indeks i izaberite "Clustered index" opciju. Ova opcija vam omogucava da vidite "SQL Script" koji se kreira u pozadini, ako kliknete na taster "Edit SQL...". Kliknite na taster "OK", kada ste spremni da kreirate indeks. Kreiranje indeksa u Query Analyzer - Template Otvorite SQL Server Query Analyzer, i na "Object Browser" kliknite na "Templates" tab, koji se nalazi na dnu "Object Browser" okvira. Izaberite "Create Index Full Sintax" templejt, a onda idite na "Edit->Replace Template Parameters" opciju. Ukucajte odgovarajuce vrijednosti za parametre a onda pritisnite "OK". Kada je komanda pripremljena pritisnite na "Execute" na "Toolbar"-u. Da biste provjerili da li je indeks kreiran, kliknite na "Tools->Manage Indexes". Izaberite bazu podataka i tabelu. Kliknite na indeks koji vas interesuje, a zatim na "Edit" ako zelite nesto da promjenite. Kreiranje indeksa u Query Analyzer - kucanjem komande USE Test_Baza CREATE CLASTERED INDEX Ix_Rezultati_Vrijeme ON Tabela_Rezultata(Broj_utakmice, Datum) ON [PRIMARY] GO Brisanje indeksa Indeks se brise iz baze podataka sa komandom "DROP INDEX ime_indeksa" USE Test_Baza DROP INDEX Ix_Rezultati_Vrijeme GO Takodje treba obratiti paznju da ne kreiramo dupli indeks, na primjer da indeksiramo istu kolonu dva puta, ali pod razlicitim imenom. Zeljko Tomic : Sokolac Lekcija 22 - "CREATE INDEX" komanda CREATE [uNIQUE] [CLUSTERED|NONCLUSTERED] INDEX index_name ON table_name (column1 [ASC|DESC], ......) [WITH {IGNORE_DUP_KEY|DROP_EXISTING|SORT_IN_TEMPDB}] [ON filegroup] • CREATE - obavezna kljucna rijec. • UNIQUE - opcionalna rijec. Ako je koristena, znaci da indeks ne moze imati duplikate. • CLUSTERED|NONCLUSTERED - opcionalna rijec. Ako nista nije specificirano, NONCLUSTERED indeks ce biti kreiran. • index_name - obavezna rijec, koju vi izmislite. Takav objekat ne smije postojati u bazi. • ON - obavezan. Koristi se ispred imena tabele nad kojom se indeks kreira. • table_name - obavezna rijec. Oznacava ime tabele koja postoji u bazi. • column1 - obavezna rijec. Oznacava ime kolone koja se indeksira. • ASC|DESC - opcionalna rijec. Osnacava da su podaci uredjeni u rastucem (ASC) ili opadajucem (DESC) redoslijedu. Ako nista nije naznaceno, podaci se uredjuju u rastucem (ASC) redosledu. • WITH - opcionalna rijec. • IGNORE_DUP_KEY - Ako je ova rijec koristena, kod unosa novih slogova, dupli slogovi ce biti ignorisani, tj. nece biti upisani u tabelu. Umjesto greske, samo ce opomena biti generisana. Kontrolisite sistemsku varijablu @@ERROR poslije svakog DML iskaza. • DROP_EXISTING - ova opcija ce ponovo kreirati indekse. Indeksi se samo reorganizuju, a ne brisu ("DROP INDEX"). To je dobro, ako imamo "forein key" koji zavisi od ovog indeksa. • SORT_IN_TEMPDB - u ovom slucaju "TEMPDB" baza podataka ce biti koristena za sortiranje prilikom kreiranja indeksa. • ON - opcionalna. Iza ove rijeci slijedi "filegroup". Standardna vrijednost je "PRIMARY", koja se koristi, ako nista nije definisano. Zeljko Tomic : Sokolac Vjezba 2 SELECT * FROM Fudbaleri WHERE Prezime LIKE 'To%' Ova komanda ce iz tabele "Fudbaleri" izlistati sve fudbalere cije prezime pocinje sa slovima "To". Zeljko Tomic : Sokolac Lekcija 23 - Dijagrami podataka Lekcija 23 - Relacije i crtanje dijagrama Relacije definisu vezu izmedju dvije table. Kada je relacija devinisana izmedju dvije table, za table kazemo da su povezane. U bilo kojoj vezi izmedju tabela, postoji "roditelj" i "dijete" tabela. Postoje tri tipa direktne veze izmedju tabela i jedan tip indirektne veze. Tipovi direktne veze su: 1:1, 1:M i M:1. Indirektna veza se naziva: M:M. Ova veza se smatra indirektnom zato sto se ona ne moze direktno implementirati u bazi, bez kreiranja nove tabele, koja je sa dvije postojece tabele povezana relacijom 1:M. Referencijalni integritet je niz pravila koje se koriste da definisu i sacuvaju vezu izmedju tabela u nekoj bazi podataka. Na primjer, referencijalni integritet osigurava da tabele ne sadrze tkz. "slogove sirocad", tj. da neki slog iz zavisne tabele ("dijete") nije povezan sa nekim slogom iz tabele tipa "roditelj", a da slog u "roditelj" tabeli ne postoji. • Referencijalni integritet povecava tacnost vasih podataka. • Pretpostavimo da imamo tabele Studenti(stud_id, Ime, Prezime, Smjer) i tabelu Knjige(Knjiga_ID, Naziv, Stud_id, Broj_Strana, Datum). Ukoliko je referencijalni integritet definisan izmedju ove dvije tabele, onda vrijednost Stud_ID u tabeli knjiga mora biti prazna tj. NULL ili pokazivati na postojecu vrijednost Stud_ID u tabeli Studenti. Ovaj primjer nije normalizovan ali moze posluziti da shatite o cemu govrim. • Slog "siroce" je slucaj kada imamo definisan podatak u jednoj tabeli, a taj podatak ne postoji u drugoj tabeli. Primjera radi, ako u tabeli Filmovi(Film_ID, Naziv_Filma) nemamo film pod rednim brojem 7 i nazivom "Mars na Drinu", a u tabeli Iznajmljeni_Filmovi(Broj, Film_ID, Datum) imamo film sa "Film_id=7", onda slog sa tim podatkom u tabeli "Iznajmljeni_Filmovi" smatramo sirocetom, jer ne pripada nikome. • Primjer sa "slogom tipa siroce" javlja se kada neko u tabeli "Filmovi" izbrise neki film, a da se zavisni podaci ne izbrisu i u zavisnim tabelama. Baze podataka (RDMS) podrzavaju kaskadno brisanje i azuriranje slogova u cilju zastite referencijalnog integriteta. Ovo znaci da ukoliko promjenite vrijednost kljuca u jednoj tabeli, sva pojavljivanja tog istog kljuca u drugim tabelama ce biti takodje promjenjen. Isto tako, ako izbrisete podatak u jednoj tabeli, svi zavisni podaci ce takodje biti izbrisani. ER Dijagrami ili Dijagrami entitet-veza, su praktican i jednostavan nacin za dizajniranje i dokumentovanje baza podataka. Ovi dijagrami su jednostvni za razumjevanje. • Koristite Database Diagram Wizard da brzo kreirate osnovni dijagram. • Mozete dodavati labelu sa komentarom prilikom kreiranja dijagrama. • Dijagrami mogu biti koristeni da se kreiraju relacije izmedju tabela vizuelnim putem. Zeljko Tomic : Sokolac Lekcija 24 - Kreiranje relacija Da biste kreirali vezu izmedju dvije tabele potrebno je: • Startovati SQL Server Enterprise Manager, izabrati bazu u kojoj se nalaze vase tabele i kliknuti na tabelu koja je glavna u vezi (naziva se "parent" ili "master"). • Kliknuti desnim tasterom misa, i nakon sto dobijete meni izaberite opciju "Design Table". Na toolbar-u izaberite opciju Manage Relationships, cija ikona je predstavljena sa tri kockice povezane sa dvije linije. • Na tabulatoru Relationships upisite ime za naziv relacije (ukoliko vam se ponudjeno ime ne svidja), a zatim iz ponudjene liste izaberite: Primary Key Table i Foreign Key Table, kao i odgovarajuce kljuceve iz ovih tabela. Ostale parametre ne morate mijenjati. Kliknite na Close dugme da zatvorite i snimite ove promjene. Nakon toga, dobicete tkz. "Snimi dijalog boks", na kome treba da kliknete Yes za zavrsite operaciju. • Ukoliko zelite da napravite relaciju izmedju dvije tabele, medjutim tabla tipa "Roditelj" nema za primarni kljuc polje koje nam je potrebno, onda nad tim poljem mozemo definisati "Unique" kljuc. Nakon toga cemo moci da napravimo relaciju izmedju dvije tabele. CREATE UNIQUE CLASTERED INDEX IX_Igraci_IgracID on TestDB.dbo.Igraci (IgracID) ON [PRIMARY] GO Relaciju mozemo kreirati i putem SQL upita: USE TestDB GO CREATE UNIQUE INDEX IX_Utakmice_UtakmicaID ON Utakmice (UtakmicaID) ON [PRIMARY] GO ALTER TABLE Utakmice_Rezultati ADD CONSTRAINT FK_Utakmice_Rezultati_Utakmica FOREIGN KEY (UtakmicaID) REFERENCES Utakmice (UtakmicaID) GO Kao sto vidite, prvo smo nad tabelom "Utakmice" kreirali jedinstven indeks nad kolonom UtakmicaID, a onda smo pomocu iskaza "ALTER TABLE" nad tabelom "Utakmice_Rezultati" kreirali relaciju ("CONSTRAINT") sa imenom "FK_Utakmice_Rezultati_Utakmica", koju smo proglasili stranim kljucem ("FOREIGN KEY") na tabelu "Utakmice". Prikazivanje zavisnosti izmedju tabela Sada kada smo kreirali relaciju izmedju dvije tabele, treba da znamo i kako mozemo da provjerimo koje relacije postoje izmedju tabela u bazi. Recimo da hocemo da provjerimo da li tabela "Utakmice" ima bilo kakvu relaciju u odnosu na ostale tabele. Da bismo to uradili treba da u "Enterprise Manager"-u kliknemo na tabelu "Utakmice", a onda kliknemo na desni taster misa i izaberemo opciju Display Dependencies. Zeljko Tomic : Sokolac Vjezba 3 U sledecem primjeru cemo kreirati bazu podataka za Ligu RS. U bazi podataka cemo imati sledece podatke: • 1. Klubovi - Svaki klub ima svoj broj, ime, broj telefona i adresu. • 2. Utakmice - Svaku utakmicu igraju dva kluba, pa zato imamo dva strana kljuca u tabeli utakmice, kao i broj golova za klub A i klub B. • 3. Titule - Ova table je staticna i ima samo dvije vrijednosti: 1. Prvak RS, 2. Prvak kupa RS. • 4. Klubovi_Titule - U ovoj tabeli registrujemo prvaka za svaku godinu i pobjednika kupa za svaku godinu. Ovo je samo jedan primjer za koji mi je trebalo 15 minuta da ga napravim. Naravno, stvarna baza bi bila mnogo komplikovanija. U ovom slucaju, tabela rezultata bi trebala da se racuna programski, posto su u bazi smjesteni samo rezultati. CREATE DATABASE [LigaRS] ON (NAME = N'LigaRS_Data', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\LigaRS_Data.MDF' , SIZE = 1, FILEGROWTH = 10%) LOG ON (NAME = N'LigaRS_Log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\LigaRS_Log.LDF' , SIZE = 1, FILEGROWTH = 10%) COLLATE SQL_Latin1_General_CP1_CI_AS GO use [LigaRS] GO CREATE TABLE [dbo].[Klubovi] ( [KlubID] [int] NOT NULL , [Klub_Ime] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Klub_Adresa] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Klub_Telefon] [varchar] (12) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Klub_Faks] [varchar] (12) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Predsjednik] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Godina_Osnivanja] [datetime] NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[Titule] ( [iD] [int] NOT NULL , [Naziv_Titule] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Komentar] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[Klubovi_Titule] ( [KlubID] [int] NOT NULL , [TitulaID] [int] NOT NULL , [Godina_Osvajanja] [varchar] (4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[utakmice] ( [KlubIDa] [int] NOT NULL , [KlubIDb] [int] NOT NULL , [Datum] [datetime] NULL , [Golova-a] [int] NULL , [Golova-b] [int] NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[Klubovi] WITH NOCHECK ADD CONSTRAINT [PK_Klubovi] PRIMARY KEY CLUSTERED ( [KlubID] ) ON [PRIMARY] GO ALTER TABLE [dbo].[Titule] WITH NOCHECK ADD CONSTRAINT [PK_Titule] PRIMARY KEY CLUSTERED ( [iD] ) ON [PRIMARY] GO ALTER TABLE [dbo].[Klubovi_Titule] WITH NOCHECK ADD CONSTRAINT [PK_Klubovi_Titule] PRIMARY KEY CLUSTERED ( [KlubID], [TitulaID] ) ON [PRIMARY] GO ALTER TABLE [dbo].[utakmice] WITH NOCHECK ADD CONSTRAINT [PK_Utakmice] PRIMARY KEY CLUSTERED ( [KlubIDa], [KlubIDb] ) ON [PRIMARY] GO CREATE INDEX [iX_Utakmice] ON [dbo].[utakmice]([KlubIDa]) ON [PRIMARY] GO ALTER TABLE [dbo].[Klubovi_Titule] ADD CONSTRAINT [FK_Klubovi_Titule_Klubovi] FOREIGN KEY ( [KlubID] ) REFERENCES [dbo].[Klubovi] ( [KlubID] ), CONSTRAINT [FK_Klubovi_Titule_Titule] FOREIGN KEY ( [TitulaID] ) REFERENCES [dbo].[Titule] ( [iD] ) GO ALTER TABLE [dbo].[utakmice] ADD CONSTRAINT [FK_Utakmice_Klubovi] FOREIGN KEY ( [KlubIDa] ) REFERENCES [dbo].[Klubovi] ( [KlubID] ), CONSTRAINT [FK_Utakmice_Klubovi1] FOREIGN KEY ( [KlubIDb] ) REFERENCES [dbo].[Klubovi] ( [KlubID] ) GO Zeljko Tomic : Sokolac Lekcija 25 - Punjenje tabele podacima Do sada smo naucili kako se kreira baza podataka, tabele u bazi, kao i indeksi nad tabelama, a zatim i veze (relacije) izmedju tabela. Medjutim baza podataka bez podataka je beskorisna. Proces upisivanja podataka u tabelu je poznat pod nazivom punjenje tabela tj engleski population. Kod popunjavanja podataka SQL Server vodi racuna o kontroli integriteta podataka. To znaci da ce samo podaci koji zadovoljavaju skup kriterijuma koje smo mi definisali, biti upisani u tabele. Integritet podataka je omogucen putem trigera (triggers) i tkz. ogranicivaca (CONSTRAINTS). Svaki put kada definisemo neku relaciju, SQL Server ce da definise tkz. ogranicivac ili uslov. Prilikom ubacivanja podatataka u tabelu, provjeravaju se svi uslovi, i ukoliko su svi zadovoljeni podaci ce biti upisani u tabelu. Trigeri su programi, smjesteni u bazi podataka. Svaki triger je vezan za jednu tabelu, i oni se izvrsavaju prije ili poslije svakog upisivanja, brisanja ili azuriranja neke tabele. Triger takodje moze da zabrani operaciju nad tabelom, ukoliko podaci ne zadovaljaju kriterijum definisan u trigeru. Podatke mozemo upisati u tabelu iz Query Analyzer-a. Sledeca komanda ce upisati jedan slog u tabelu Customers. Primjer 1: Upisivanje slogova u tabelu Klubovi INSERT INTO LigaRS.dbo.Klubovi (KlubID, Klub_Ime, Klub_Adresa, Klub_Telefon, Klub_Faks, Predsjednik, Godina_Osnivanja) VALUES(1, 'Glasinac', 'Milana Sarca bb', '057-868-324', '057-868-325', 'Crni Djordje', '1960') Primjer 2: Upisivanje slogova u tabelu "CUSTOMERS" INSERT INTO CUSTOMERS VALUES ( 'John', 'Travolta', '1050 Smithe', '305', 'Vankuver', 'BC', 'V6E 1J1', '604', '111-1111' ) Primjer 3: Resetovanje vrijednosti kljuca Ukoliko sledeci upit izvrsimo u Query Analyzer-u, vrijednost kolone Society_GroupID ce biti resetovano na vrijednost 4. Ovo je dobro u slucaju ako smo ubacili u tabelu veliki broj podataka, a onda ih izbrisali. Na taj nacin kljuc tabele, koji je automatski generisan, ce opet poceti od nekog malog broja. DBCC CHECKIDENT('Society_Groups', RESEED, 4) Kod sledeceg inserta, vrijednost kljuca ce biti 5. Primjer 4: Greske kod upisa SET QUOTED_IDENTIFIER OFF INSERT INTO Society_Groups (Society_Group_Desc) VALUES ("Blues Country") Izvrsite ovu komandu sa <Ctrk>+E ili sa <F5> uku pritiskom na Execute ikonu na toolbar-u. Dobicete poruku da je potrebno navesti podatke i za jos neka druga polja koja ne mogu da budu NULL vrijednost. Zeljko Tomic : Sokolac Lekcija 26 - Dodavanje Constraint-a Dodavanje constraint-a ili ogranicivaca je moguce izvesti pomocu: • 1. Pomocu "Enterprise Manager"-a koriscenjem "Table Properties" dijalog boksa. • 2. Koristenjem T-SQL iskaza iz "Query Analyzer"-u. Primjer 1: Dodavanje primarnog kljuca u tabelu ALTER TABLE Players ADD CONSTRAINT Pk_Players PRIMARY KEY NONCLUSTERED ( PlayerID ON [PRIMARY] ) GO Primjer 2: Dodavanje "CONSTRAINT"-a za provjeru vrijednosti ALTER TABLE Players WITH NOCHECK ADD CONSTRAINT Ck_Players_PointsCheck CHECK (( Points_Scored >= 0)) GO Quote Link to comment Share on other sites More sharing options...
Guest account 5 Posted October 28, 2005 Report Share Posted October 28, 2005 Izvini sto ti saljem u Delovima ali primoran sam zbog toga sto mi javlja da nemoze sve da stane odjednom ... SORRY < III DEO > » Click to show Spoiler - click again to hide... «Primjer 3: "CONSTRAINT"-a za "DEFAULT" vrijednost polja ALTER TABLE Players WITH NOCHECK ADD CONSTRAINT Df_Plaers_Games_Played DEFAULT (0) FOR Games_Played GO Izvrsite ove komande sa <Ctrl>+E ili sa <F5> ili pritiskom na Execute ikonu na toolbar-u. Zeljko Tomic : Sokolac Lekcija 27 - INSERT iz tabele u tabelu Ponekad je potrebno podatke, ili dio podataka, iz jedne tabele prebaciti u drugu tabelu. • U sledecem primjeru, iz tabele NoviKorisnici selektujemo samo korisnike cije prezime pocinje sa T i dodajemo ih u tabelu korisnici. INSERT INTO Korisnici (Ime, Prezime, Adresa, Grad, Telefon) SELECT ime, prezime, adresa, grad, telefon FROM NoviKorisnici WHERE SUBSTRING(prezime,1,1) = 'T' Primjetili ste da smo koristili i SUBSTRING funkciju. Ova funkcija iz neke promjenljive (u nasem slucaju prezime) izdvaja dio stringa koji pocinje od prve pozicije, a duzina je jedan znak. Takodje treba primjetiti da indeks u SQL Serveru pocinje od jedan, ne od nule kao u Javi, C#, C, C++ i drugim programskim jezicima. Nova tabele, tj. tabela koju zelimo da kreiramo moze biti permanentna (stalna) ili privremena (temporary). Privremena tabela moze biti dostupna samo vama, ili moze biti privremena globalna tabela, kojoj mogu pristupiti svi korisnici SQL Servera. Da bismo kreirali privremenu lokalnu tabelu ispred tabele stavimo znak '#', a za privremenu globalnu tabelu stavimo dupli znak '#', tj. '##'. #Korisnici -> Privremena lokalna tabela ##Ispiti -> privremena globalna tabela • Tabela koju kreiramo, tj. nova tabela, ne mora imati ista imena kolona kao tabela iz koje uzimamo podatke. Da bismo to ostvarili koristimo tkz. alias-e, tj. u nasem upitu dodjeljujemo nova imena kolona. Evo i jednog primjera: SELECT Ime AS ImeKupca, Prezime AS PrezimeKupca INTO #temp_Kupci FROM Kupci U gornjem primjeru smo kreirali privremenu lokalnu tabelu, koja ima samo dvije kolone sa imenima ImeKupca i PrezimeKupca. • U sledecem primjeru koristimo NULL i DEFAULT vrijednost za kolone. Pomenuo sam ranije da null znaci da vrijednost nije poznata. SQL Server takodje dozvoljava da prilikom kreiranja tabele dodijelimo default value, sto je neka vrijednost koja se najcesce javlja u bazi. Npr. u nasoj bazi za videoteku, broj kaseta za neki film je uglavnom 1. Zbog toga, ako smo za "default" vrijednost kolone izabrali 1, onda mozemo da umjesto te vrijednosti samo upisemo "DEFAULT", rijec. Mozda se pitate, zasto je ovo potrebno! Pa, jednoga dana mozemo vrijednost "Default" za tu kolonu da promjenimo u definiciji tabele u 2. Ne moramo da idemo kroz nasu aplikaciju i na svakom INSERT iskazu mijenjamo vrijednost "1" u "2". INSERT INTO Filmovi (id, naslov, duzina, datum, Kategorija) VALUES ('T_601', 'Yojimbo', NULL, DEFAULT, 'Drama'); Zeljko Tomic : Sokolac Lekcija 28 - Intgritet podataka Bez tacnih podataka, baza podataka je beskorisna. zbog toga je veoma bitno da korisnicima ne dozvolimo da u bazu unose nepotpune i netacne podatke. Postoje dva metoda pomocu kojih mi regulisemo integritet podataka. To su: deklerativni i proceduralni. Kod deklerativnog metoda, integritet je definisan na nivou objekata, tj. tabela. Kod proceduralnog integriteta podataka, potrebno je napisati programe (trigere i uskladistene procedure) koji kontrolisu integritet podataka. Postoje tri razlicita tipa deklerativnog integriteta podataka: entitet, domejn, i referencijalni integritet (engleski: entity, domain, referential integrity). Deklerativni integritet podataka • Domain - ovo je integritet podataka nad kolonom (da li su dozvoljene NULL vrijednosti, u kom opsegu su podaci ...) • Entity - ovo je integritet na nivou tabele. Npr. Primarni kljuc je primjer ovog integriteta jer svi slogovi tabele moraju imati razlicitu vrijednost i ne smiju biti NULL. • Referential - ovo je integritet koji se definise izmedju dvije tabele. U ovom slucaju, svaki podatak iz kolone jedne tabele, mora postojati u koloni druge tabele nad kojom je definisan primarni kljuc. SQL Server ima sledeca deklerativna ogranicenja (engleski: constraints): CHECK - definisan na koloni DEFAULT - definisan na koloni REFERENTIAL - definisan na koloni FOREIGN KEY - referencijalni (izmedju dvije tabele) CHECK - referencijalni (izmedju dvije tabele) PRIMARY KEY - definisan nad tabelom UNIQUE - definisan nad tabelom Zeljko Tomic : Sokolac Lekcija 29 - kreiranje ogranicenja Prije svega potrebno je znati kao mozemo provjeriti koja su ogranicenja definisana nad nekom tabelom. Kao i za vecinu zadataka vezanih za bazu podataka, u SQL Serveru postoje uskladistene procedure, koje mozemo pozvati iz Query Analyzer-a: • exec sp_helpconstraint 'ime_tabele' -> prikazuje sva ogranicenja definisana nad tabelom. • exec sp_help 'ime_ogranicenja' -> prikazuje pdatke o specificiranom ogranicenju • exec sp_helpdb 'ime_tabele' -> prikazuje podatke o tabeli, kao i ogranicenja nad tabelom Ogranicenje po primarnom kljucu - PRIMARY KEY CONSTRAINT • Kreiranje primarnog kljuca prilikom kreiranja tabele CREATE TABLE Klubovi ( KlubID int CONSTRAINT PK_Klubovi_KlubID PRIMARY KEY CLUSTERED, ...... • Kreiranje primarnog kljuca nakon kreiranja tabele: ALTER TABLE dbo.Klubovi WITH NOCHECK ADD CONSTRAINT PK_Klubovi PRIMARY KEY CLUSTERED ( KlubID ) ON PRIMARY GO Ogranicenje po jedinstvenom kljucu - UNIQUE CONSTRAINT • Kreiranje jedinstvenog kljuca prilikom kreiranja tabele CREATE TABLE Radnici (Rjesenje_O_Prijemu VARCHAR CONSTRAINT Ux_Radnici_Rjesenje UNIQUE NONCLUSTERED, .... • Kreiranje jedinstvenog kljuca nakon kreiranja tabele ALTER TABLE Radnici ADD CONSTRAINT Ux_Radnici_Rjesenje1 NONCLUSTERED (Rjesenje_O_prijemu) Ogranicenje po stranom kljucu - FOREIGN CONSTRAINT • Kreiranje stranog kljuca prilikom kreiranja tabele CREATE TABLE Utakmice ( Kluba INT CONSTRAINT Fk_Utakmice_kluba FOREIGN KEY REFERENCES Klubovi(KlubID), .... • Kreiranje stranog kljuca nakon kreiranja tabele ALTER TABLE Utakmice ADD CONSTRAINT FK_Utakmice_Kluba FOREIGN KEY (Kluba) REFERENCES Klubovi(KlubID) SQL Server ne kreira automatski indeks po stranom kljucu. Vi treba da to uradite sami! Kaskadni integritet - Cascading Integrity SQL Server 2000 ima moducnost da dozvoli promjenu ili brisanje podataka na svim slogovima koji imaju strani kljuc prema tom primarnom kljucu. CREATE TABLE ime_tabele (ime_kolone INT CONSTRAINT Fk_Tabela_Kolona FOREIGN KEY REFERENCES ref_tabela(ref_kolona) [ON DELETE (CASCADE | NO ACTION)] [ON UPDATE (CASCADE | NO ACTION)] Osnovno ogranicenje - Default constraint CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric DEFAULT 9.99 ); Ogranicenje provjere vrijednosti - Check Constraint • Kreiranje ogranicenja provjere prilikom kreiranja tabele CREATE TABLE Studenti (ocjena INT CONSTRAINT Cs_Studenti_Ocjena CHECK (ocjena > 5), ..... • Kreiranje ogranicenja provjere nakon kreiranja tabele ALTER TABLE Studenti ADD CONSTRAINT Cs_Studenti_Ocjena CHECK (ocjena >= 5 AND ocjena <= 10), .... Zeljko Tomic : Sokolac Lekcija 30 - Rad sa ogranicenjima Ogranicenja definisana na tabeli mogu biti: • izbrisana • privremeno ukinuti, tj. onesposobljeni ili deaktivirani Brisanje ogranicenja ALTER TABLE Studenti DROP CONSTRAINT Cs_Studenti_Ocjena Deaktiviranje ogranicenja • Dodavanje ogranicenja koje je neaktivno ("disabled"): ALTER TABLE Ispiti WITH NOCHECK ADD CONSTRAINT Cs_Ispiti_Ocjena FOREIGN KEY (StudentID) REFERENCES Studenti(StudentID) • Dodavanje ogranicenja provjere, koje nije aktivno: ALTER TABLE Ispiti WITH NOCHECK ADD CONSTRAINT cH_Ispiti_Ocjena CHECK (ocjena >= 5 AND ocjena <= 10) • Deaktiviranje ogranicenja provjere, prilikom upisivanje velikog obima podataka u bazu. ALTER TABLE Ispiti NOCHECK CONSTRAINT ALL ili ALTER TABLE Ispiti NOCHECK CONSTRAINT cH_Ispiti_Ocjena • Aktiviranje ogranicenja provjere, kada je to potrebno: ALTER TABLE Ispiti CHECK CONSTRAINT ALL ili ALTER TABLE Ispiti CHECK CONSTRAINT cH_Ispiti_Ocjena Zeljko Tomic : Sokolac Lekcija 31 - Komanda ALTER TABLE • Dodavanje nove kolone tipa varchar u tablu: ALTER TABLE distributors ADD COLUMN address VARCHAR(30); • Brisanje kolone iz tabele: ALTER TABLE distributors DROP COLUMN address RESTRICT; • Preimenovanje kolone u tabeli: ALTER TABLE distributors RENAME COLUMN address TO city; • Preimenovanje postojece tabele: ALTER TABLE distributors RENAME TO suppliers; • Dodavanje NOT NULL ogranicenja nad kolonom: ALTER TABLE distributors ALTER COLUMN street SET NOT NULL; • Uklanjanja NOT NULL ogranicenja nad tabelom: ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL; • Dodavanje check constraint-a nad tabelom: ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5); • Ukidanje check constraint-a iz table i sve njegove djece: ALTER TABLE distributors DROP CONSTRAINT zipchk; • Dodavanje stranog kljuca u tabelu: ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL; • Dodavanje ogranicenja sa vise kolona: ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode); • Dodavanje primarnog kljuca u tabelu, koji ce biti imenovan automatski: ALTER TABLE distributors ADD PRIMARY KEY (dist_id); Zeljko Tomic : Sokolac Lekcija 32 - Pretrazivanje podataka Pretrazivanje podataka je najcesci zadatak koji izvrsavamo nad nekom bazom podataka. Moc baza podataka je upravo u cinjenici da na veoma jednostavan i brz nacin mozemo naci odgovor na pitanje poput ovog: "Koja prodavnica ima najvecu prodaju u zadnjih 15 dana". Za dobijanje informacija iz baze podataka koristimo "SELECT" komandu. Za vracanje samo slogova koji zadovoljavaju neki kriterijum koristimo "WHERE" iskaz. Ukoliko zelimo da kolone koje zadovoljavaju uslov pretrazivanja (one se nazivaju u result set) budu sortirane u odredjenom redosledu, koristimo i "ORDER BY" iskaz. Pored toga, "GROUP BY" iskaz nam omogucuje da podaci budu grupisani po nekoj kategoriji ( na primjer po radniku ili radnoj jedinici). Za dobijanje zeljenih rezultata obicno moramo da izvrsimo pretrazivanje vise tabela. Da bismo podatke izvukli iz vise tabela moramo izvsiti tkz. spajanje tabele tj. join. Korisne informacije kod koriscenja SELECT iskaza • NULL vrijednost nije isto sto i nula ("0") ili prazan string. Ukoliko zelite da pronadjete koj vrijednosti neke kolone imaju NULL vrijednosti koristite sintaksu WHERE ime_kolone IS NULL. • Za pretrazivanje podataka u nekom opsegu koristite BETWEEN kljucnu rijec: SELECT Ime_Proizvoda, Cijena FROM Proizvodi WHERE CIJENE BETWEEN 10.00 AND 14.00 • Moguce je uporedjivati vrijednosti u nekoj koloni sa listom vrijednosti: SELECT ImeKompanije, Direktor, Telefon FROM Korisnici WHERE Drzava IN ('Austrija','Njemacka','Holandija') • Preporucuje se koriscenje operatora"<>" umjesto "!=" jer ovaj drugi nije ANSI SQL 92 standard. Formatiranje izlaza Kod formatiranja izlaza treba obratiti paznju da je modguce kreirati kolone koje su dobijene kao rezultat neke matematicke operacije, eliminisati duplikate, i dodjeliti koloni novo ime. • Za eliminisanje duplikata iz dobijenih rezultata koristimo DISTINCT kljucnu rijec. SELECT DISTINCT Autor FROM Knjige • Za spajanje dvije ili vise kolone koristimo + operator. SELECT Ime + ' ' + Prezime FROM RADNICI • Veoma cesto, imena kolona nemaju ime koje je razumljivo za korisnike sistema. Zbog toga, kod pisanja upita, mozemo koristi i tkz. "ALIAS"-e, koji sluze da preimenujemo kolonu u prikazivanju rezultata upita. SELECT Ukupno0001 AS Sati_U_Sedmici FROM Plate WHERE Ukupno0001 < 40 Rezultat bi izgledao ovako: Sati_U_Sedmici 33 0 35 38 Zeljko Tomic : Sokolac Lekcija 33 - Grupne funkcije Rad sa grupnim funkcijama Grupne funkcije se izvrsavaju nad podacima jedne kolone u tabeli, i vracaju jedan rezultat. • AVG() - ova funkcija vraca prosjek svih numerickih vrijednosti u koloni, koji su vraceni kao rezultat upita. SELECT AVG(sati) FROM PLATE WHERE MJESEC = 'Decembar' • COUNT(*) - ova funkcija vraca broj kolona koje zadovoljavaju neki uslov: SELECT COUNT(*) FROM Proizvodi WHERE Cijena > 10 • COUNT(DISTINCT Radne_Jedinice) - Ove funkcije vracaju broj jedinstvenih podataka, od kojih ni jedna nije NULL. • COUNT() - funkcija vraca broj vrijednosti u nekom izrazu. Funkcija izbacuje sve kolone koje su NULL. • MAX() - Funkcija vraca najvecu vrijednost u koloni SELECT MAX(Cijena) AS 'Maksimalna cijena' FROM Proizvodi • MIN() - ova funkcija vraca minimalnu vrijednost izraza. SELECT MIN(Cijena) FROM Proizvodi MAX() i MIN() funkcije ne mogu da se koriste kod podataka tipa BIT. • Da bismo imali vise od jedne kolone u SELECT iskazu koji ima grupnu funkciju, moramo koristiti i GROUP BY iskaz. SELECT Kategorija, MAX(Cijena) FROM Proizvodi GROUP BY Kategorija • TOP ili TOP n PERCENT kljucne rijeci se koriste za vracanje odredjenog broja vrsta. Sledeci iskaz ce vratiti 4 najskuplja proizvoda: SELECT TOP 4 ImeProizvoda, Cijena FROM Proizvodi ORDER BY Cijena DESC naravno, morali smo da kazemo SQL Serveru da proizvode poredja po opadajucoj vrijednosti cijena. Komanda SELECT TOP N uvijek vraca onoliko slogova koliko smo trazili. Recimo da u prethodnom primjeru 4. proizvod koji smo dobili je knjiga "SQL Server", koja kosta $19.99. Medjutim, u nasoj bazi podataka ima jos 2 knjige sa istom cijenom. Ako zelimo i njih da ukljucimo u nasu listu koristicemo TOP WITH TIES klaz. SELECT TOP 4 WITH TIES ImeProizvoda, Cijena FROM Proizvodi ORDER BY Cijena DESC U nasem primjeru ovaj upit ce vratiti 6, a ne 4 sloga. Zeljko Tomic : Sokolac Lekcija 34 - Rad sa vise tabela Da bismo pretrazivali vise od jedne tabele, moramo da izvrsimo tkz. spajanje tabela ili join. Postoje cetiri tipa join operacije, ali je tkz. unutrasnje spajanje ili "inner join" najcesce korisceno. Spajanje tabela se obicno vrsni na osnovu kolona koje sadrze isti tip podataka. Najcesce spajanje je izmedju primarnog kljuca jedne tabeli i tkz. stranog kljuca druge tabele tj. tkz. "foreign relationship" izmedju tabla. • INNER JOIN - spajanje dvije tabele koje imaju zajednicke vrijednosti u nekim os svojih kolona. Primjera radi, mozemo spojiti tabele Radnici i Plate, jer tabela "Plate" ima sifru radnika. SELECT Radnici.Prezime, Radnici.Ime, Radnici.Odeljenje, Plate.Iznos FROM Radnici INNER JOIN Plate ON Radnici.RadnikID = Plate.RadnikID • OUTER JOIN - Postoji "LEFT OUTER JOIN" i "RIGHT OUTER JOIN" tj. lijevo i desno vanjsko spajanje. Recimo da imamo sledeci primjer: SELECT Korisnici.ImeKompanije, Korisnici.BrojTelefona, Narudzbe.DatumNarudzbe FROM Korisnici LEFT JOIN Narudzbe ON Customers.KorisnikID = Narudzbe.KorisnikID U ovom primjeru rezultat pretrazivanja ce sadrzati sve korisnike, bez obzira da li imaju nula, jednu ili vise narudzbi. Korisnici sa vise narudzbi bice prikazani u rezultujucoj tabeli onoliko puta koliko narudzbi imaju. • CROSS JOIN je takodje poznato kao Kartazijanski proizvod. Rezultat koji dobijemo je kombinacija svih vrsta jedne tabele sa svim vrstama druge tabele. Primjera radi, mozemo napraviti novu tabelu spajanjem tabela "Studenti" i "Ispiti". SELECT Studenti.StudentID, Kursevi.KursID FROM Studenti AS s CROSS JOIN Kursevi AS k Primjetite da ON iskaz nije koristen. • SELF JOIN je slucaj kada spajamo kolonu samu sa sobom. Recimo da imamo tabelu "Radnici" koja ima kljuc "RadnikID". Zelimo da napravimo listu svih radnika, sa imenima njihovih menadzera. Naravno, menadzer je takodje u tabeli "Radnici". SELECT e1.Prezime AS "Prezime", e1.Ime AS "Ime", e2.Prezime AS "Menadzer" FROM Radnici e1 INNER JOIN Radnici e2 ON e1.MenadzerID = e2.RadnikID Zeljko Tomic : Sokolac Lekcija 35 - String funkcije • LTRIM() - uklanja praznine sa lijeve strane • RTRIM() - uklanja praznine sa desne strane • LEFT(string) ili LEFT(string,30) -> vraca prvi znak ili 30 znakova nekog stringa. • RIGHT(string) ili RIGHT(string,3) -> isto kao left, ali pocinje sa desne strane, tj. sa kraja string. SET ROWCOUNT n Ova komanda se moze koristiti sa bilo kojom DML komandom. Zaustavlja izvrsavanje komandi cim je odredjeni broj kolona obradjen. LIKE oprator • Procenat (%) - koristi se da zamjeni bilo koji broj znakova SET QUOTED_IDENTIFIER OFF SELECT grad FROM Gradovi WHERE Grad LIKE "%oko%" Ova komanda ce da izlista sve gradove koji imaju "oko" u njihovom nazivu: Izlaz: Grad ---- Sokolac Visoko • Donja crtica (_) - zamjenjuje jedan znak (bilo koju vrijednost) SET QUOTED_IDENTIFIER OFF Select Rijec FROM Rijecnik WHERE Rijec LIKE "_a" Ova komanda ce izlistati sve rijeci koje imaju dva slova, a drugo slovo je "a". • Srednje zagrade. SET QUOTED_IDENTIFIER OFF SELECT ImeKluba FROM Klubovi WHERE ImeKluba LIKE "[D-G]%" Ova komanda ce da izlista sve klubove koji pocinju sa: D,E,F ili G. • Iskljucivanje vrijednosti pomocu znaka ^ SET QUOTED_IDENTIFIER OFF SELECT ImeKluba FROM Klubovi WHERE ImeKluba LIKE "[^D-G]%" Ova komanda ce izlistati sve klubove cije ime ne pocinje sa slovima: D,E,F,G. Zeljko Tomic : Sokolac Lekcija 36 - UNION kljucna rijec Kljucnu rijec UNION koristimo u upitima ukoliko hocemo da rezultat iz dvije ili vise tabela spojimo u jedan izvjestaj. Pri tome koristimo dva SQL iskaza, koje spajamo sa rijecju UNION. Prilikom koristenja UNION kljucne rijeci treba znati sledece: • 1. Oba SELECT iskaza moraju na izlazu imati isti broj kolona istog ili kompatibilnog tipa • 2. Oba SELECT iskaza moraju imati isti broj selektovanih kolona • 3. Resosled kolona mora biti identican u oba SELECT upita • 4. Duplikati ce biti automatski ignorisani. Ukoliko zelimo da vidimo duplikate, moramo koristiti UNION ALL frazu prilikom spajanja iskaza. PRIMJERI • U sledecem primjeru spajamo tabelu klubovi ( u kojoj imamo samo jedan klub - "Glasinac") sa tabelom "Titule" gdje imamo dvije vrste "Kup RS" i "Prvak RS". select Klub_Ime AS Zajednicko_ime FROM Klubovi UNION SELECT Naziv_Titule FROM Titule Rezultat ovog upita ce izgledati ovako: Zajednicko_ime ------------------------------- Glasinac Kup RS Prvak RS (3 row(s) affected) Takodje trebamo primjetiti da ovaj izlaz bas nema mnogo smisla, jer spajamo "babe i zabe", tj. "Klubove" i "Titule". • U sledecem primjeru spajamo dvije tabele: "Studenti" i "Diplomirani_Studenti". Tabele imaju iste kolone SELECT Prezime+' '+Ime AS [ime i prezime] FROM Studenti UNION SELECT Prezime+' '+Ime FROM Diplomirani_Studenti Ovaj primjer ima mnogo vise smisla, jer ce nam vratiti spisak svih studenata: onih koji jos studiraju, kao i onih koji su diplomirali. Zeljko Tomic : Sokolac Lekcija 37 - Pisanje podupita Podupiti (Subqueries) su upiti koje koristimo unutar slozenih upita. Za podupite kazemo da su "ugnjezdeni" ili "uglavljeni" unutar slozenih upita. Podupiti vracaju samo jednu kolonu. Podupit moze imati svoj podupit, i tako do 32 nivoa. Naravno u stvarnom zivotu, rijetko imamo vise od jednog nivoa podupita. Koriscenje podupita se preporucuje samo u slucaju kada zeljeni rezultat ne mozemo dobiti spajanjem tabela (JOIN). Podupit unutar WHERE iskaza SELECT ime, prezime, starost FROM Studenti WHERE Starost < (SELECT AVG(starost) FROM Studenti) U gornjem primjeru, podupit nam koristi da izracunamo prosjecnu starost svih studenata, a onda izlistamo podatke o svim studentima koji slu mladji od prosjecne starosti. Podupit unutar SELECT iskaza SELECT Naslov, Cijena, (SELECT AVG(Cijena) FROM Knjige WHERE Kategorija = 'Kompjuteri') FROM Knjige WHERE Kategorija = 'Kompjuteri' Ovaj upit ce vratiti spisak svih knjiga, njihovih cijena, i prosjecnih cijena za knjige iz kategorije "Kompjuteri". Kreiranje izvedenih tabela (Derived Tables) Izvedene tabele mozemo kreirati koristenjem podupita nakon FROM iskaza SELECT Ime FROM (SELECT Ime FROM Glumci WHERE GlumacID = 300) Glumci Ime ------------------------------ Ljubisa (1 row(s) affected) Upotreba podupita u JOIN klazu I u ovom slucaju, podupit je isto sto i privremena tabela. SELECT lista_kolona FROM Tabela1 JOIN (podupit) Upotreba podupita nakon IN kljucne rijeci Podupit se moze koristiti da vrati listu vrijednosti, koji ce se kasnije uporedjivati unutar glavnog upita: SELECT ime, prezime FROM Studenti WHERE StudentID IN (SELECT StudentId FROM Ispiti WHERE IspitID = 17) Ovo je i najcesci nacin koriscenja ugnjezdenih upita. Primjer prikazuje sve studente koji su polozili ispit sa sifrom 17. Primjer nije bas najbolji jer bi ga bilo bolje uraditi spajanjem tabela "Studenti" i "Ispiti", ali prikazuje princip rada. Medjutim, sledeci primjer, koji koristi NOT IN sintaksu, ne mozemo dobiti spajanjem tabela. Primjer prikazuje studente koji nisu polozili ispit sa sifrom 17. SELECT ime, prezime FROM Studenti WHERE StudentID NOT IN (SELECT StudentId FROM Ispiti WHERE IspitID = 17) Upiti sa EXISTS i NOT EXISTS iskazom Kada hocemo da povezemo vise od jedne kolone iz glavnog upita sa podupitom, onda koristimo EXIST i NOT EXISTS operatore. EXISTS vraca "true" ili "istina" ako je bar jedna kolona pronadjena u podupitu. U protivnom vraca "false" ili "laz". SELECT k.ImeKompanije FROM Kompanija AS k WHERE k.Drzava = 'Srbija' AND EXISTS (SELECT DatumNarudzbe FROM Narudzbe WHERE Narudzbe.BrojKorisnika = k.BrojKorisnika) U ovom primjeru listamo sve kompanije iz Srbije, koje su narucile bar jedan proizvod. Zeljko Tomic : Sokolac Lekcija 38 - Optimizacija upita Primjetili ste da je iste rezultate moguce dobiti pomocu upita napisanih na sasvim drugi nacin. Medjutim, treba da znate, da brzina izvrsavanja upita u velikim bazama podataka moze biti kriticna, pa treba nesto znati i o tome kako napisati optimalan upit, tj. upit koji ce baza podataka (tj. RDBMS) najbrze izvrsiti. Vecine baza podataka imaju tkz. Optimajzer, jedan inteligentan program, koji u zavisnosti od velicine tabele, uslova spajanje, raspolozivih indeka nad tabelama, i fizicke organizacije podatka (CLASTERED ili NONCLASTRED) kreira plan za izvrsavanje upita koji dobija rezultate koji su vama potrebni. Mada sve ovo nije toliko vazno za male baze podataka sa vise stotina slogova, vi biste trebali da znate stvari koje vi treba da uradite da Optimajzeru olaksate rad. • Kreirajte indekse U sustini, kljuceve treba kreirati nad poljima koji se koriste za filtriranje kolona, kao i za spajanje tabela, zatim grupisanje i sortiranje podataka, kao i izvrsavanje matematickih operacija. Indekse nemojte kreirati nad kolonama koje su primarni kljucevi u tabelama, jer te su kolone vec indeksirane. • Koristite filtere ("Restrict Criteria") Prije svega, izbjegavajte da selektujete veliku kolicinu slogova iz tabela, ukoliko je to moguce. Pored toga koristite filtere prije spajanja tabela. Na primjer "Drzava = 'Srbija'", je jedan od filtera, nakon cega mozete spojiti dvije tabele. Ako primjenite filtere prije spajanja tabela, odmah cete dobiti jednu malu tabelu, umjesto jedne ogromne, iz koje DBMS masina mora da brise nepotrebne slogove. • Izbjegavajte koristenja "GROUP BY" iskaza Ukoliko morate koristiti ovaj iskaz u vasem upitu, koristite sto manje "grupnih polja". Pored toga, grupiranje radi brze nad jednom, nego nad vise tabela. Konacno, koristite grupiranje prije spajanja tabela (knjiga SQL Servera ovo tvrdi, mada ja nisam siguran da je to tako. • Provjerite da li koristite prava ogranicenja Ponekad neka ogranicenja rade brze od drugih. Primjera radi uslov >300 radi sporije od BETWEEN 300 and 1000. • Denormalizujte tabele Vec ranije smo govorili o denormalizaciji. Ponekad je dobro ne pretjerivati sa normalizacijom baze podataka, da bi performansa baze bila bolja. Zeljko Tomic : Sokolac Vjezba 4 - Rad sa "Videoteka" bazom • Primjer za "LEFT OUTER JOIN" nad tabelama "Movies" i "Rentals". Rezultujuca lista je spisak svih filmova koji nikada nisu bili iznajmljivani. SELECT m.MovieTitle FROM Movies m LEFT OUTER JOIN Rentals r ON m.MovieID = r.MovieID WHERE r.TransactionID IS NULL Kako ovaj upit radi? LEFT OUTER JOIN se prvo izvrsi kao INNER JOIN tj. napravi se jedna velika, rezultujuca tabela koja sadrzi sve kolone obje tabele, na osnovu zajednickog polja, u ovom slucaju (MovieID). Zatim se u tu privremenu tabelu dodaju svi slogovi iz lijeve tabele koji ne postoje u desnoj tabeli. Sva polja iz desne tabele se popune NULL vrijednostima. Nakon toga, mi smo filtrirali samo slogove koji imaju NULL vrijednost u nekom od polja iz desne tabele. MovieTitle ---------------------------------------- Harry PotterL The Philosopher's Stone Braveheart Last of the Mohicans (3 row(s) affected) • Sledeci upit koristi unutrasnji (NESTED) upit, umjesto "LEFT OUTER JOIN". Rezultat je identican kao u prethodnom primjeru. SELECT m.MovieTitle FROM Movies m WHERE NOT EXISTS (SELECT r.TransactionID FROM RENTALS r WHERE r.MovieID = m.MovieID) MovieTitle ---------------------------------------- Harry PotterL The Philosopher's Stone Braveheart Last of the Mohicans (3 row(s) affected) Ovo je jos jedan dobar primjer da se identicni podaci iz baze podataka mogu dobiti pomocu dva potpuno razlicita upita. Quote Link to comment Share on other sites More sharing options...
Guest account 5 Posted October 28, 2005 Report Share Posted October 28, 2005 (edited) Delove koje sam ti naveo u Spoilerima kopiraj i prebaci u Wordu (zbog lepshe preglednosti) ili u nekom tekstualnom editoru po tvojoj zelji ... Srecan rad ...SQL Edited October 28, 2005 by XT3X[C]ha0s Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.