Web programiranje i primjene Sveučilište Josipa Jurja Strossmayera u Osijeku, Odjel za matematiku, Trg Ljudevita Gaja 6 31000 Osijek Sveučilište Josipa Jurja Strossmayera u Osijeku, Odjel za matematiku, Trg Ljudevita Gaja 6 31000 Osijek My SQL Izrada baze podataka za WEB 8. vježbe Slobodan Jelić odabir baze use ima_baze; u našem slučaju: use books; izrada tabele: Upotreba odgovarajuće baze podataka create table ime_tabelestupci parametar stupci predstavlja popis stupaca odvojenih zarezom shema baze: CustomersCustomerID, Name, Address, City) OrdersOrderID, CustomerID, Amount, Date) BooksISBN, Author, Title, Price) Order_ItemsOrderID, ISBN, Quantity) uvesti datoteku bookorama.sql Book_ReviewsISBN, Reviews) Značenje ostalih rezerviranih riječi NOT NULL atribut mora imati vrijednost u svi redcima tablice AUTO_INCREMENT CustomersCustomerID, Name, Address, City) odnosi se na cjelobrojne stupce OrdersOrderID, CustomerID, Amount, Date) ako se prilikom unošenja polje ostavi prazno, MySQL automatski generira vrijednost BooksISBN, koja je Author, jedinstvena Title, u stupcu Price) generirana Order_ItemsOrderID, vrijednost je za ISBN, 1 veća Quantity) od postojeće maksimalne vrijednosti samo jedan stupac u tablici može imati ovu opciju Book_ReviewsISBN, Reviews) PRIMARY KEY govori da je stupac primarni ključ tablice automatski create se table indeksira customers može se navesti iza imena stupca samo ako se primarni ključ sastoji od jednog customerid stupca int unsigned not null ako auto_increment se primarni ključ sastoji primary od dva i key, više stupaca, onda se piše primary key name popis_stupaca) char50) not null, USIGNED address stupac char100) može imati not samo null, nenegativne cjelobrojne vrijednosti city char30) not null 1
Tipovi stupaca create table orders customerid cjelobrojni tip pišemo int orderid int unsigned not null svi ostali stupci auto_increment znakovnog tipa primary pišemo key, char u zagradi pišemo customerid koliko MySQL int unsigned treba dodijeliti not znakova, null, čak iako se vrijednost amount u stupcu sastoji float6,2), od manje znakova ostatak se popuni razmacima) date date not null moguće je staviti varchar tada vrijednost zauzima stvarni broj znakova NOT NULL sve kolone optimizacija amount realni broj create s pomičnom table customers točkom float date - datum customerid int unsigned not null auto_increment primary key, name char50) not null, address char100) not null, city char30) not null primarni ključ koji se sastoji od dva stupca quantity tinyint unsigned cjelobrojne vrijednosti između od 0 do 255 riview tekstualni tip - text, za duže tekstove poput novinskih članaka create table book_reviews isbn char13) not null primary key, review text create table order_items orderid int unsigned not null, isbn char13) not null, quantity tinyint unsigned, primary key orderid, isbn) 5 vrsta identifikatora: ime baze ime tablice ime stupca ime indeksa alijasi Identifikatori u MySQL-u Cjelobrojni tipovi mogu se zadati s ključnom riječi UNSIGNED nenumerički tipovi mogu imati i opciju ZEROFILL koja popunjava prazna mjesta vodećim nulama i automatski uključuje UNSIGNED Realni brojevi s pomičnom točkom može se zadati oblik broja M maksimalni broj znamenki D broj decimalnih mjesta maksimalno M-2 ) Datumski i vremenski tipovi omogućuje unos datuma kao numeričkih ili znakovnih vrijednosti 2
TIMESTAMP vremenski žig koristi se za bilježenje transakcija Znakovni tipovi 3 grupe znakovnih tipova obični znakovni podaci char i varchar BLOB i TEXT TEXT za duže tekstove BLOB eng. Binary Large Object) bilo što, primjerice zvučni i video zapisi) SET i ENUM SET stupac može sadržavati jednu ili više vrijednosti iz zadanog skupa ENUM stupac može sadržavati samo jednu vrijednost iz zadanog skupa Sveučilište Josipa Jurja Strossmayera u Osijeku, Odjel za matematiku, Trg Ljudevita Gaja 6 31000 Osijek Rad s MySQL-ovom bazom podataka 1. Unošenje podataka u bazu 2. Učitavanje podataka iz baze 3. Ažuriranje zapisa u bazi podataka 4. Naknadne izmjene strukture tablica 5. Brisanje zapisa iz baze podataka 6. Brisanje tabela 7. Brisanje cijele baze podataka Što je MySQL SQL kratica za Structured Query Language strukturirani jezik za upite standardni jezik za pristupanje RDBMS-u omogućuje unos i čitanje podatak u/iz baze poznati DBMS-i: MySQL Oracle PostgreSGL Sybase Microsoft SQL Server postoje razlike iz među MySQL i ANSI standarda http://dev.mysql.com/doc/refman/5.1/en/compatibility.html MySQL: DDL eng. Data Definition Language) jezik za definiranje podataka DML eng. Dana Manipulation Language) jezik za obradu podataka 3
pomoću iskaza INSERT Unošenje podataka u bazu sintaksa: INSERT [INTO] ime_tablice [stup1, stup2, stup3,...)] VALUES v1,v2,v3,... primjer: insert into customers values NULL, 'Julie Smith', '25 Oak Street', 'Airport West' jednostruki ili dvostruki navodnici create table customers za numeričke tipove ne trebaju navodnici NULL? customerid stavili smo atribut intauto_increment unsigned not null za primarni ključ customerid auto_increment primary key, name char50) not null, address char100) not null, city char30) not null moguć unos u SAMO određene stupce u određenom rasporedu primjer: insert into customers name, city) values Melissa Jones, Nar Nar Goon North koristimo u slučajevima kada nisu sva polja obvezna ili kada ne raspolažemo svim podacima moguć unos više redaka istovremeno svaki redak morate pisati između zagrada retke zagrade) odvojiti zarezom Unos u tablicu customers: insert into customers values 1, "Julie Smith", "25 Oak Street", "Airport West"), 2, "Alan Wong", "1/47 Haines Avenue", "Box Hill"), 3, "Michelle Arthur", "357 North Road", "Yarraville" insert into customers values 1, "Julie Smith", "25 Oak Street", "Airport West"), 2, "Alan Wong", "1/47 Haines Avenue", "Box Hill"), 3, "Michelle Arthur", "357 North Road", "Yarraville" 4
Unos u tablicu orders: insert into orders values NULL, 3, 69.98, "2007-04-02"), NULL, 1, 49.99, "2007-04-15"), NULL, 2, 74.98, "2007-04-19"), NULL, 3, 24.99, "2007-05-01" create table orders orderid int unsigned not null auto_increment primary key, customerid int unsigned not null, amount float6,2), date date not null insert into customers values 1, "Julie Smith", "25 Oak Street", "Airport West"), 2, "Alan Wong", "1/47 Haines Avenue", "Box Hill"), 3, "Michelle Arthur", "357 North Road", "Yarraville" Unos u tablicu books: insert into books values "0-672-31697-8", "Michael Morgan", "Java 2 for Professional Developers", 34.99), "0-672-31745-1", "Thomas Down", "Installing Debian GNU/Linux", 24.99), "0-672-31509-2", "Pruitt, et al.", "Teach Yourself GIMP in 24 Hours", 24.99), "0-672-31769-9", "Thomas Schenk", "Caldera OpenLinux System Administration Unleashed", 49.99 Unos u tablicu order_items: insert into order_items values 1, "0-672-31697-8", 2), 2, "0-672-31769-9", 1), 3, "0-672-31769-9", 1), 3, "0-672-31509-2", 1), 4, "0-672-31745-1", 3 Unos u tablicu order_items insert into order_items values 1, "0-672-31697-8", 2), 2, "0-672-31769-9", 1), 3, "0-672-31769-9", 1), 3, "0-672-31509-2", 1), 4, "0-672-31745-1", 3 create table order_items orderid int unsigned not null, isbn char13) not null, quantity tinyint unsigned, primary key orderid, isbn) insert into books values "0-672-31697-8", "Michael Morgan", "Java 2 for Professional Developers", 34.99), "0-672-31745-1", "Thomas Down", "Installing Debian GNU/Linux", 24.99), "0-672-31509-2", "Pruitt, et al.", "Teach Yourself GIMP in 24 Hours", 24.99), "0-672-31769-9", "Thomas Schenk", "Caldera OpenLinux System Administration Unleashed", 49.99 umetanje u tablicu book_reviews insert into book_reviews values "0-672-31697-8", "Morgan's book is clearly written and goes well beyond most of the basic Java books out there." insert into orders values NULL, 3, 69.98, "2007-04-02"), NULL, 1, 49.99, "2007-04-15"), NULL, 2, 74.98, "2007-04-19"), NULL, 3, 24.99, "2007-05-01" Pogledajte datoteku book_insert.sql uvesti datoteku book_insert.sql 5
Učitavanje podataka iz baze pomoću iskaza SELECT sintaksa: SELECT podaci FROM tables [ WHERE uvjeti ] [ GROUP BY grupiranje ] [ HAVING uvjet_grupe ] [ ORDER BY redoslijed ] [LIMIT ograničenja ] [PROCEDURE ime_procedureargumenti)] [način_zaključavanja]; Primjer: Učitati vrijednost stupaca name i city iz tablice customers select name, city from customers; Učitajte vrijednosti u SVIM kolonama tablice order_items select * from order_items; Učitavanje podataka koji ispunjavaju određene uvjete Operatori za usporedbu u odredbi WHERE koristimo odredbu WHERE Primjer: Učitajte sve narudžbe iz tablice orders koje je napravio kupac koji ima customerid=3 select * from orders where customerid = 3; upotreba logičkih operator AND i OR u zadavanju upita s više uvjeta select * from orders where customerid = 3 or customerid = 4; Što će se dogoditi ako u prethodnom upitu umjesto OR stavimo AND? Upit vratio 0 redaka? Zašto? Razlika između AND i OR? Unija AND), Presjek OR) 6
Učitavanje podataka iz više tablica istovremeno kada želimo odgovoriti na pitanje a za to nam trebaju podaci iz više tabela koji su kupci naručili knjige ovog mjeseca potrebne tablice customers i orders ako želimo znati što su naručili potrebna i je tablica order_items da bismo objedini podatke u fizički razdvojenim tablicama koje smo povezali stranim ključevima i spojnim tablicama) tablice je potrebno spojiti eng. JOIN) Primjer: želimo vidjeti sve narudžbe koje pripadaju kupcu Julia Smith u tabeli customer pronaći njezin identifikator, tj customerid s tim podatkom pretražiti tablicu orders Jednostavni spoj dvije tabele select orders.orderid, orders.amount, orders.date where customers.name = Julie Smith and customers.customerid = orders.customerid; upit na dvije tablice umjesto zareza može se pisati INNER JOIN ili CROSS JOIN računamo Cartesijev produkt) Kako funkcionira? select orders.orderid, orders.amount, orders.date Upit: select * ; u većini slučajeva Kartezijev produkt nema smisla jer on uparuje pravi uređene dvojke) svih redaka iz obje tablice kako eliminirati nepotrebno odredba WHERE uvjet spajanja select orders.orderid, orders.amount, orders.date where customers.name = Julie Smith select orders.orderid, orders.amount, orders.date where customers.name = Julie Smith select orders.orderid, orders.amount, orders.date where customers.name = Julie Smith and customers.customerid = orders.customerid; 7
Konačan rezultat upita: select orders.orderid, orders.amount, orders.date where customers.name = Julie Smith and customers.customerid = orders.customerid; Spajanje više od dvije tablice Problem: Pronaći kupce s najmanje jednom porudžbinom koja sadrži knjigu o Javi potrebno je pogledati u 4 tablice Rezultat: select customers.name, order_items, books where customers.customerid = orders.customerid and orders.orderid = order_items.orderid and order_items.isbn = books.isbn and books.title like %Java% ; jednakovrijedni spoj engl. equi-join) Pronalaženje redaka koji se ne poklapaju koristimo lijeve spojeve engl. left join) u prethodnom primjeru učitali smo retke u kojima je postojalo poklapanje među podacima ponekad želimo suprotno Primjer: Klijenti koji nisu ništa kupili Knjige koje nikada nisu kupljene lijevi spoj: ako u tablici na desnoj strani ne postoji redak koji bi odgovarao retku tablice na lijevoj strani, skupu rezultata se dodaje redak koji, umjesto vrijednosti iz stupca desne tablice, sadrži vrijednost NULL. Izvršite sljedeće upite za unos: insert into customers name, city) values Melissa Jones, Nar Nar Goon North insert into customers set name = Michael Archer, address = 12 Adderley Avenue, city = Leeton ; datoteka: unos_dodatni.sql select customers.customerid, customers.name, orders.orderid from customers left join orders on customers.customerid = orders.customerid; cross join želimo vidjeti samo klijente koji nisu ništa kupili nemaju narudžbu) tražimo samo one kupce koje na desnoj strani u tablici orders) imaju vrijednost NULL select customers.customerid, customers.name from customers left join orders using customerid) where orders.orderid is null; Što je s right join? Da li ima smisla gledati right join u ovom slučaju? USING ne zadajemo iz koje tablice dolazi zajednički atribut zbog čega u obje tablice on mora imati isto ime 8
Rezultat: Upotreba drugih imena iz tablice: ALIJASI alijas privremeni skraćeni naziv stupca primjer: select c.name from customers as c, orders as o, order_items as oi, books as b where c.customerid = o.customerid and o.orderid = oi.orderid and oi.isbn = b.isbn and b.title like %Java% ; spajanje tablice same sa sobom primjer: želite pronaći sve kupce koji žive u istom gradu select c1.name, c2.name, c1.city from customers as c1, customers as c2 where c1.city = c2.city and c1.name!= c2.name; Spojevi tablice Učitavanje podataka s određenim redoslijedom upotreba iskaza ORDER BY sortira retke po redoslijedu vrijednosti iz jedne ili više kolona navedenih u iskazu SELECT select name, address from customers order by name; Rezultat: Možemo li sortirati po prezimenu? Grupiranje podataka i grupne funkcije vrijednosti se standardno sortiraju rastućim redoslijedom ASC rastući redoslijed DESC opadajući redoslijed primjena funkcija na stupac ili tablicu kao cjelinu ili na grupu podataka u njoj select name, address from customers order by name asc; select name, address from customers order by name desc; 9
Primjer: select avgamount) from orders; Primjer: Izračunati prosječnu vrijednost narudžbina po kupcu grupiranje podataka) select customerid, avgamount) from orders group by customerid; Kako biste napravili upit koji vraća ime kupca pored prosječne vrijednosti njegovih narudžbi? 10