You are on page 1of 67

1

Mal ve k databzy - 1.!as$


Najv ia cena je cena informcie povedal dvnejie aksi obchodnk, a isto tm myslel t sprvnu informciu v sprvny as. Tu sprvnu v nekone nej zmeti velijakch informcii, balastu aj skuto nch perl. Kedysi, ke# jedinm komunika nm prostriedkom na v ie vzdialenosti bol konsk povoz krlovskej poty, bolo informcii poriedko, a tak nebolo ve $km problmom udra % ich v kompetentnej hlave a sprvne vyhodnoti%. Avak dnes, v dobe ke# sa na ns valia informcie zo vetkch strn rchlos%ou svetla, je ve$mi dleit rzne informcie niekde uklada% a vyhodnocova% na zklade konkrtnych kritri. Takmto skladom informcii hovorme databzy. #o me by% databzou? S vade okolo ns, v zamestnan, na ulici alebo v tej mliekrni na rohu ulice. Lebo tovn programy, cestovn poriadok autobusov alebo zoznam tovaru v obchode nie je ni m inm jako skladom informci, teda databzou. A preto sa po #me pozrie% databzam bliie na zbky. Vysvetlme si zkladn pojmy, povieme si nie o z histrie databz a programov na prstup k nim. A kede dnes vldnu svetu databzy typu SQL ( o to je, to sa dozvieme neskr), budeme sa venova% jednej z nich, a to MySQL. e ste o nej u po uli, ale neviete ni podrobnejie? Tak prve vm je ur en tento seril. Tto databzu si naintalujeme a o je najzaujimavejie, budeme s &ou pracova% na obidvoch najrozrenejch opera nch systmoch poslednch dn na Linuxe i na Windowsoch. A tak si prdu na svoje priaznivci oboch systmov. Okrem intalcie sa spravovanie SQL serveru na obidvoch systmoch skoro neli, a tak nie je problmom konvertova % k inej platforme. A naviac, nie je problm pristupova % k serveru na Linuxe z Windows alebo naopak, ba dokonca si tak program ek v Delphi, prpadne v inom vyom programovacom jazyku napeme. e neviete programova %? Tak si daje z databze pripojme do Excelu a tam si z nich urobime graf! A nakoniec si ukeme, jako pomocou SQL serveru meme prezentova% svoje dta na intranete alebo dokonca internete tak, e nai klienti bud potrebova % iba internetov prehliada . Tak o, ideme na to? Trocha terie. Hned vodom si povedzme, e nebudeme bra % v vahu rozdiel medzi dtami a informciami. Budeme predpoklada %, e vetky dta s pre ns zrove& informciami, pretoe ich dokeme interpretova % a priradi% im zmysel. Dta sa ukladaj do tabuliek (tab. .1). Naa cvi n tabu$ka sa nazva KNIHA. ID NAZOV 1 Angelika a kr 2 KGB 3 Bratia Ricovci 4 Vtky v t!ni 5 Linux-praktick pruvodce 6 Nau$te se programovat v 7
Delphi Pouvame Linux AUTOR Golon Anne a Serge GordijevskyOleg Simenon Georges McclloughovCollen Sobell Mark G. Binzinger Thomas VYDAVATEL Slovensk spisovate EAAP Smena Slovensk spisovate Computer Press Grada TEMA romn faktografia krimi romn odborn odborn odborn CENA POZNAMKA 56 239 18 66 1073 439 494

Welsh M.a Kaufman L Computer Press

Databzov tabu$ka je ve$mi podobn tabu $ke v textovom editore alebo v tabu$kovom kalkultore, napr. Excel, Quattro a pod., alebo tej, o si narysujeme doma na papier, aby ste zaznamenali ur it informcie. Sklad sa z jednotlivch riadkov a st(pcov. Riadkom hovorme zznamy (vety) a st(pcom hovorme poloky (polia). Vrazy v ztvorkch s tie sprvne, s to ekvivalenty, s ktormi sa tie meme v databzach stretn%. My bude pouva% tie prv vrazy. St&pce tabu)ky Kad st(pec (poloka) m nzov, ktormu sa hovor atribt. Atribtom tretej poloky je AUTOR, teda v tomto st(pci sa bud nachdza% men autorov jednotlivch knh. Kad tabu$ka mus obsahova% aspo& jeden st(pec.

2 Riadky tabu)ky Zatia$ o poloky maj rozdielne atribty, zznamy obsahuj rovnak poloky. To znamen, e jednotliv riadky maj rovnak st(pce. V naej tabu$ke vidme iba 7 zznamov, ale v tabu$ke bva obvykle ve$a riadkov. Meme sa stretn% s tabu$kami, ktor obsahuj a miliny riadkov, ale na druhej strane s tabu$ky, v ktorch nie je iadny riadok. Takmto tabu$km hovorme, e s przdne. Zznamy meme do tabu $ky pridva%, alebo ich maza%, ale iba cel riadky. Taktie vsledkom naich dotazov (lingvisti sorry, ale akosi mi slovo dopyt nejde z st!) bude jeden alebo skupina celch riadkov. Hodnoty = dta =informcie V priese nku riadku a st(pca je konkrtna hodnota (aj przdna hodnota je hodnota!). Tto hodnota reprezentuje ur it vz%ah medzi zznamom a polokou. V priese nku riadku popisujceho knihu Briatia Ricovci a st(pca CENA njdeme sumu 18, o predstavuje osemns% vtedajch korn eskoslovenskch. (Skuto ne, vo$akedy stla kniha smiene peniaze). Sbor tabuliek, logicky vytvrajcich ur it celok, tvor databzu. Tak ako kad tabu$ka, tak aj databza m konkrtne meno, ktorm sa prezentuje. Nau databzu pomenujeme KNIZNICA. V naej databze mme zatia $ iba jednu tabu$ku KNIHA, ale me ich tu by% viac, ktor s danou tmatikou projektu riadenia vpoi ky knh bud zko svisie%. Isto ns napadne, e by tu mala by% aksi tabu$ka o lenoch - itate$och kninice, napr. CLENOVIA, kde bu bud ich osobn daje a ak kniky si poi ali. Nepredbiehajme, k tomuto sa ete dostaneme. Databzov systm Okrem roz lenenia dt do jednotlivch tabuliek v rmci databze mme k dispozcii ete nstroje na manipulciu s tmito dtami. Meme dta vklada %, upravova%, meni% alebo vykonva% nad nimi rzne opercie, ako napr. s itova%, porovnva%, triedi% do podskupn a podobne. Zl enm dt a nstrojov, pomocou ktorch vykonvame spomnan opercie, dostaneme databzov systm . Kad databzov systm mus obsahova % tieto zkladn nstroje pre: vytvorenie, vyh$advanie, aktualizciu a ruenie uvate$skch dt definciu truktry dt definciu a zaistenie integrity dt zaistenie fyzickej a logickej nezvislosti dt

a prpadne nstroje pre: podporu prce viacerch uvate $ov (definovanie prstupovch prv) zlohovanie dt replikciu dt Fyzick nezvislos dt znamen oddelenie zpsobu fyzickho uloenia dt (napr. na disku) od prce s nimi. Ak chceme pracova% s tabu$kou knh, odkeme sa na &u pomocou jej nzvu KNIHA a nemysme sa zaobera% tm, kde je uloen na disku po ta a a akm spsobom s fyzicky zaznamenan data v nej uloen. O logickej nezvislosti dt hovorme vtedy, ke# zmena logickej truktry dt (napr. rozrenie o #a$ie tabu$ky alebo st(pce v existujcej tabu$ke) nevyaduje pravu u existujcich programov alebo dotazov pracujcich s dtami. Dtove typy U z naej jednoduchej tabu$ky vidme, e dta obsiahnut v rznych st(pcoch mu by% rzneho druhu. Je tu hodnota v st(pci CENA, ktor je zadvan ako slo a meme teda s &ou vykonva% seln opercie, napr. s ta%, od ta%, nsobi% a pod. +alej s tu hodnoty v st(pcoch NAZOV, AUTOR, VYDAVATEL, ktor s textovho charakteru a meme ich porovnva%, h$ada% podobn at #. Existuj vak aj in druhy hodnt, ktor sa mu v tabu$ke vyskytova%. St(pec ID je tak trochu zvltny typ. Je sce seln, ale s autoinkrementa nou vlasnos%ou, teda databzov systm sm za ns prid slo o jedno vyie, ke# vlome nov zznam do tabu$ky. Odborne sa tmto druhom hodnt hovor dtov typy . Zkladn dtov typy databzovho systmu MySQL, s ktorm budeme pracova %, s v tab. .2. Samozrejme, MySQL ich m podstatne viac. Ke # budeme niektor typ pouva%, vysvetlme si ho.

Dat. typ int smallint tinyint float char(n) varchar(n) decimal(p)

Popis cel $slo v rozsahu -2 147 483 648 do 2 147 483 647 cel $slo v rozsahu -32 768 do 32 767 cel $slo v rozsahu od 0 do 255 $slo s pohyblivou rdovou $iarkou textov re'azec d(ky n (max. 255 znakov) textov re'azec max. d(ky n (max. 255 znakov) desatinn $slo s p platnmi $slicami

decimal (p,d) desatinn $slo s p platnmi $slicami a s d desatinnmi miestami money pe*an $iastka datetime time date blob daj o $ase a dtume vo formte RRRR-MM-DD HH:MM:SS daj o $ase v tvare HH:MM:SS daj o dtume v tvare RRRR-MM-DD pecilny typ pre ukladanie dlhch binrnych dt

V jednom st(pci dtovej tabu$ky sa mu vyskytova% iba hodnoty rovnakho datovho typu. Potom je zrejm, e nem zmysel poadova% vloenie textovej hodnoty do st(pca ID alebo CENA. Preto hovorme o dtovom type celho st(pca tabu$ky. Nabudce si povieme nie o vzbch v tabu$kch, o k$ och a indexoch. A naintalujeme si datbzov systm.

Mal ve k databzy - 2.!as$


V minulej asti sme sa venovali iba jednej tabu$ke. Povedali sme si vak, e v databze me by% (a obvykle bva) viac tabuliek. Hlavn vznam databz spo va prve vo v om po te vzjomne previazanch tabuliek. Predstavme si teraz, e naa kninica m viac oddelen, kde s knihy uloen pod $a jednotlivch nrov. Preh$ad tchto oddelen je v tabu$ke .3, ktor si nazveme ZANER: CIS_ODD TEMATIKA
1 2 3 4 5 6 7 pozia romn krimi detsk lit. cestopis lit. faktu odborn lit.

Vr%me sa k naej prvej tabu$ke s nzvom KNIHA. Vidme, e st(pec TEMA sa d nahradi% st(pcom CIS_ODD z tabu$ky ZANER. Potom bude naa opraven tabu $ka KNIHA vyzera% takto: ID NAZOV
1 Angelika a kr 2 KGB 3 Bratia Ricovci 4 Vtky v t!ni 5 Linux-praktick pruvodce 6 Nau$te se programovat v Delphi 7 Pouvame Linux AUTOR Golon, Anne a Serge Gordijevsky,Oleg Simenon, Georges Mcclloughov,Collen Sobell, Mark G. Binzinger, Thomas Welsh,M.,Kaufman,L VYDAVATEL Slovensk spisovate EAAP Smena Slovensk spisovate Computer Press Grada Computer Press CIS_ODD 2 6 3 2 7 7 7 CENA POZNAMKA 56 239 18 66 1073 439 494

Nebudeme sa teraz zaobera % spsobom, ktorm by sme upravili tabu $ku v batabzi a prejdime rovno k vslednej podobe tabu $ky KNIHA. K omu je dobr, e sme vymenili textov zpis nru za slo riadku z inej tabu$ky? Ak budeme pridva% #al zznam o novej knihe v naej kninici, u nemusme pracne vypisova% textov re%azec, napr. odborn , ale sta zapsa% prslun seln kd z tabu$ky ZANER. Pri zapisovan ve$kho po tu knh to podstatne zjednodu a zrchli nap(&anie tabu$ky KNIHA. Predstavme si, e by sa jednho d &a oddelenie romn premenovalo na prza, m by zah-&alo aj novely, poviedky a in. (Priznvam, e toto nie je z literrno - vedeckho poh$adu plne ist, ale ide o ilustra n prklad). Potom sta opravi% iba jedno miesto v jedinej tabu$ke ZANER. Keby sme si nechali pvodn tabu$ku, museli by sme u kadho zznamu, ktor v st(pci TEMA obsahuje slovo romn, prepsa% zameranie tematiky na prza. V naom prpade by sa jednalo iba o dva riadky z tabu $ky KNIHA, ale o by to bolo za kninicu, keby sme mali iba dve knihy z tohto nru, ve# v relnej situcii by to mohli by% stovky a stovky zznamov. Takmto istm spsobom by sme mohli nahradi % st(pec VYDAVATEL. Zistili sme, e do pomocnch tabuliek vkladme tie informcie, ktor sa nie ve$mi asto menia a s pre mnoh zznamy v hlavnej tabu$ke spolo n. Potom sa v hlavnej tabu$ke sta odvola% na prslun poloky pomocnej tabu $ky. Vidme, e takto vznikol medzi dvomi rznymi tabu $kami ur it vz%ah, a pre popis tohto vz %ahu sa pouvaj tzv. identifiktory. Identifiktory riadkov lohou identifiktoru je jednozna ne identifikova% jeden riadok v tabu$ke. Identifiktor mus teda by% v rmci jednej tabu$ky jedine n - nesm existova% dva riadky s rovnakou hodnotou identifiktoru. Teraz vieme, e st(pec ID tabu$ky KNIHA , ako aj st(pec CIS_ODD tabu$ky ZANER s identifiktormi, lebo sp(&aj podmienku jedine nosti. Identifiktorom bva spravidla seln hodnota, u ktorej mme istotu, e sa nikdy nezmen. U osb to bva ich rodn slo, slo pasu alebo slo ob ianskeho preukazu.

Dvodom pre pouitie siel miesto textovch nzvov bva spora miesta a nsledne i zvenie rchlosti spracovania. Textov re%azec toti me by% a 255 znakov (a teda aj bajtov) ve $k, zatia$ o slo me ma% ve$kos% jednho bajtu. A pri vyh$advan je neskonale rchlejie porovna% jeden bajt ako 255 bajtov. Ak si domyslme tabu$ku o miline zznamov, potom tak vyh$advanie v nevhodne vytvorenej tabu$ke me trva% aj ve$mi dlh as. Zapamtajme si, e v niektorch prpadoch nesta k jednozna nej identifikcii riadku iba jedna hodnota. Aby sme mohli presne identifikova% dan riadok, musme pozna% hodnt viac. Vtedy hovorme o zloench identifiktoroch. Primrny k) Identifiktor je akmsi k$ om k danmu riadku tabu$ky, a preto mu hovorme aj k) . Ak m identifiktor okrem vlastnosti jedine nosti aj minimlnu d(ku, hovorme mu primrny k) , alebo aj primary key. Meme poveda%, e st(pec ID a CIS_ODD s primrne k$ e vo svojich tabu$kch. My vieme, e sa v tabu$ke KNIHA odkazujeme do tabu$ky ZANER pomocou st(pca CIS_ODD. Ak sa teda primrnym k$ om cudzej tabu$ky vytvra odkaz v tabu$ke KNIHA, je tento st(pec tzv. cudzm k!"om (foreign key). Indexy Okrem vlastnch dt, ako je nzov, autor, vydavate$, cena, ner knihy a podobne, s v databze uloen aj informcie, ktor s iba pomocn. Tieto informcie slia hlavne pre zrchlenie spracovania naich poiadaviek. Medzi najviac pouvan doplnkov informcie k tabu$km patria tzv. indexy. S indexmi sa stretneme aj v naej kninici. Namiesto toho, aby sme museli prechdza % dlh police a h$ada% poadovan kniku, sta preh$ada% mal karti ky v katalgu. Tieto karti ky, ktorm hovorme aj indexy, s spravidla uloen v uplku v registra nej skrini a s zoraden pod$a nzvu knihy, o nm ve$mi z$ah uje vyh$advanie. Samozrejme, e pod $a nzvu mu by% zoraden aj knihy priamo v policiach na regloch, ale to m nieko $ko nevhod. Manipulcia s %akmi knihami je ur ite nro nejia ne s malmi karti kami. Ak by sme chceli prida% #aliu knihu doprostred police, museli by sme posun% vetky nasledujce knihy o jedno miesto #alej. Na konci police by nemuselo by% dostato n miesto a tak by sme museli prena% posledn knihu do #alej police. Naproti tomu vloenie malej karti ky do katalgu na sprvne miesto nie je vbec nro n. A v prpade nedostatku miesta nie je problm presun% nieko$ko poslednch karti iek do inej priehradky. Hlavnou vhodou pouitia indexov vak je, e ich meme vytvori% aj nieko$ko pre tie ist dta. Meme ma % jeden katalg zoraden pod $a nzvu knh, druh pod$a mien autorov a kone ne tret pod$a nru. Pri vyh$advan potom pouijeme ten, ktor sa najviac hod pre nae potreby. Ke # budeme vyh$adva% knihy o leteckom modelrstve (ach, krsne asy), pouijeme nrov katalg. Ak potrebujeme vetky diela od Karla Maya (ach, prekrsne asy), pouijeme katalg pod $a autorov. Aj ke# hovorme o kninici a katalgoch s papierovmi karti kami, platia uveden vhody a nevhody v prpade pouitia po ta ov a elektronickch mdi. Aj v po ta i musia by% dta umiestnen na disku a ich fyzick radenie do ur itho poradia a z toho vyplvajce presvanie zaberie ur it as. Aj ke# dta vyh$adva po ta , bude vsledok k dispozcii skr (a o nieko$ko rdov), ak bude vedie %, na ktorom mieste disku s uloen zznamy o knihch s titulom za najcim na M. V opa nom prpade by musel postupne od za iatku prejs% riadok po riadku a kontrolova % nzov titulu. V s asnej dobe nie je potrebn vedie% presn truktru indexov a spsob prce s nimi. Sta , ak vieme o ich existencii a o tom, e mu vrazne urchli% dobu potrebn k zskaniu poadovanch informcii z tabu$ky. Metadta Okrem vlastnch dt a indexov s v databze uloen informcie popisujce tieto dta. V tchto metadtach s zaznamenan nzvy existujcich tabuliek, po ty a nzvy pol a #alie informcie nutn k tomu, aby sme mohli s databzou pracova %. Tmto metadtam sa niekedy hovor slovnk dt. Spravidla bvaj pre benho uvate$a databze neprstupn a preto sa nimi nebudeme #alej zaobera%. Administrtorsk tabu)ky prv Okrem vlastnch dt, indexov a metadt existuj v databzovom systme pecilne tabu $ky, ktorm sa hovor administrtorsk tabu$ky prv. V nich s uloen informcie, kto a o me robi % s tou-ktorou databzou alebo tabu$kou. Nie vetci uvatelia databze mu robi % rovnak opercie. Napr. hlavn knihovnk me dop (&a% zznamy do tabu$ky KNIHA, zatia$ o ben itate$ me tto tabu$ku iba prezera%, aby zistil, ak knihy s k dispozcii, neme vak zznamy upravova%. A napr. tovate$ka kninice neme dop(&a% zznamy, me vak meni% cenu jednotlivch knh pod$a ceny nkupu alebo precenenia.

6 Na toto slia prve tabu$ky prv. Prstup do tchto tabuliek m sprvca databzovho systmu, ktormu sa hovor aj administrtor. Me to by % aj osoba, ktorej sprvca poskytne svoje prva alebo ich as%. V naom prpade budeme sprvcovia systmu my. Fakt, e dta (vetky, i vlastn alebo administrtorsk) verne zobrazuj relny stav, ktor popisuj, sa nazva integrita alebo konzistencia dt. Zkladnm predpokladom udrania dt v konzistentnom stave je kvalitne navrhnut dtov zklad&a. Nekonzistencia medzi realitou a dtami, ktor ju popisuj, mu vznika % z tchto dvodov: n nedostato n aktualizcia dt Dta sa postupne stvaj neaktulnymi. Stva sa tak v prpade, e nedokeme zaisti % pridanie novch zznamov do tabu$ky, opravu hodnt v existujcich riadkoch a ruenie riadkov o u neexistujcich objektoch relneho sveta. Ako prklad posli strata ur itej knihy. Ak neupravme zznam o tejto knihe v tabu$ke KNIHA, me sa sta%, e sa stle na &u bud viaza% objednvky k zpoi ke a s tm svisiace zznamy v inch tabu$kch. Pri tatistickch dajoch o innosti kninice by sme mohli dosta% nejednozna n , ba dokonca nezmyseln vsledky. Preto je nutn pravidelne aktualizova% dta. Aj ke# sa jedn o trivilne kony, me udriavanie dtovej zkladne v aktulnom stave vyadova% u rozsiahlych aplikci nemal silie, as a peniaze n referen n integrita Tm, e mme daje o knihch v jednej tabu$ke, daje o itate$och v tabu$ke #alej a o vypoi anch knihch v tretej tabu$ke, musme dba% o to, aby sme pri ruen konkrtneho itate$a vymazali nielen zkladn informcie o &om, ale aj vetky jeho vpoi ky. Obecne povedan, musme vymaza% vetky zznamy z ostatnch tabuliek, ktor sa na tohto itate$a odkazovali. Ak by sme tak neu inili, neboli by sme neskr schopn ur i%, ku ktormu itate$ovi tieto daje patria a dtov zklad &a by u nezobrazovala verne stav reality. Rela n model dt Ke# sme hovorili o naich tabu$kch a vz%ahoch medzi nimi, dali by sa popsa % tieto vz%ahy pomocou rela nej algebry. Tmto vz%ahom potom hovorme relcie, a z toho vyplva, e pouvame rela n model dt . Na tejto algebre je postaven jazyk SQL, ktor je nosnou as%ou naej prce. My sa tu nebudeme teraz zaobera % matematikou, ale toto uvdzam len pre plnos %. SRBD U vieme, o s to tabu$ky a databzy. Prstup k dajom uloench v databze obstarva program, ktormu sa hovor SRBD - Systm Riadenia Bze Dt. Tento krkolomn nzov vznikol z anglickho DBMS - DataBase Management System. Medzi SRBD patria tak programy ako je Oracle, Informix, MS SQL Server, Progress. Nejedn sa o programy zrovna lacn, ich cena sa pohybuje v desiatkach i skr v stovkch tiscok korn. Na%astie, aj na poli SRBD existuj programy ren zdarma ako freeware - napr. PostgreSQL i MySQL, ktor my budeme pouva%. Jazyk SQL V rokoch 1974 a 1975 prebiehal vo firme IBM vskum monost vyuitia rela nch databz. Pre tento projekt bolo nutn vytvori% sadu prkazov, ktormi by sa rela n databza ovldala. Tak vznikol jazyk SEQUEL (Structured English Query Language). Ako napoved sm nzov, bolo cie$om tvorcov vytvori% jazyk, v ktorom by sa prkazy tvorili syntakticky o najbliie k benmu (anglickmu) jazyku. Tento jazyk sa ve$mi rozril aj medzi ostatn firmy, zaoberajce sa databzovmi systmami a asom sa premenoval na SQL - Structured Query Language (trukturovan dopytovac jazyk) a tandardizoval sa. Preto v ina prkazov, pouvanch napr. v MySQL, je funk n aj v Informixe a inch systmoch. Hovorm v ina, lebo, ako to u vo svete chod, kad tvorca databze vytvor aj pecifick skupinu prkazov len pre svoju databzu. Architektra klient - server Databzov systmy bvaj rznej architektry. Naj astejie sa pouvaj systmy s centrlnym uloenm dt . Dta s uloen v databzach na konkrtnom centrlnom po ta i a jednotliv programy, pracujce na loklnych staniciach uvate$ov v sieti, si zdielaj disk s uloenmi dtami. To umo&uje, aby dta boli centralizovan a spravovan na jednom mieste. M to vak ur it obmedzenia, ktor je nutn repektova %. Predstavme si, e mme databzu o ve$kosti 20 megabajtov. Ak chce nejak program pristpi % k dtam v tejto databze, potrebuje si k sebe po sieti natiahnu% do opera nej pamte zna n as% z tejto databze, pokia $ nenjde prslun informcie a nespracuje ich. Takto sa ve$mi za%a prenosov schopnos% siete a ak bud naraz pristupova% viacer uvatelia k tejto databze, odozvy bud viac ne katastroflne. Preto sa systm zdie $ania dt v tomto

7 spsobe u ve$mi nevyuva. Z tohoto dvodu sa vytvoril systm klient - server s jazykom SQL. Server pochdza z latinskho servo = sluha, teda sli ostatnm klientom a vykonva ich prkazy. Systm klient - server tie vyuva centrlne uloenie dt, avak nad dtami operuje server SQL. Ten prijma od jednotlivch klientov poiadavky (query), ktor maj ve $mi mal ve$kos% nieko$kch bajtov, tieto spracuje a vsledok vracia po sieti klientovi. Ak je vsledkom napr. iba jeden riadok z tej 20 megabajtovej tabu $ky, ktor vyhovel poiadavke klienta, m odpove# ve$kos% iba pr bajtov. Takto sa informcie dostan ve $mi rchlo k iadate$ovi, o sa vyuva hlavne v Internete a intranete. Ak takto pristupuje v loklnej sieti naraz aj nieko$ko uvate$ov, s odpovede aj tak ve$mi rchle. Modern SQL systmy s architektrou klient - server spracovvaj on line poiadavky od tiscok uvate$ov a tto ani nepostrehn aksi zdranie vo svojej prci. Takmto systmom sa hovor, e s to SQL servery. Zapamtajme si, e SQL server aj klient nemusia, ale mu bea % na tom istom po ta i. Dokonca nemusia bea% na tej istej platforme. Server me by% na Linuxe a klient na Windows, alebo naopak, ako si to ukeme neskr. Ako som spomnal, my budeme pracova % s SQL serverom, ktor sa nazva MySQL. Dnes je tento server (pre Linux) u free, o znamen, e ho meme pouva % bez toho, aby sme platili licen n poplatky. A samozrejme, taktie ho meme slobodne poui % v naich komer nch aplikcich. Tento server je dostupn jako pre platformu Linux, tak aj pre Windows. (Pre Windows mete vo $ne poui% iba starie verzie programu, za aktulnu posledn verziu pre Windows sa platia licen n poplatky. Ale aj tie s v porovnan s inmi komer nmi SQL servermi ve$mi smiene). Take t, ktor maj monos% pracova% s Linuxom, bud asi preferova% verziu pre Linux, ostatn, ktorm Linux ete stle zav&a exotikou, mu pracova% na oknoidnej verzii. Obe tieto verzie s dostupn na rznych cd kch, alebo na internetovej adrese www.mysql.com alebo na eskom zrkadle www.mysql.cz. Na tchto adresch njdete aj prslunho klienta pre poadovan platformu. Posledn stabiln verzia nesie ozna enie 3.22.xx, verzie s ozna enm 3.23.xx s uvolnen ako alpha release, preto ich nebudeme pouva%. Na niektorch CD - diskoch s Linuxom, vydanch u ns alebo v /echch, je verzia, ktor je preloen aj s eskm triedenm. Toto vak teraz nie je nutnos%ou, ale pri tvorbe u ozajstnho projektu sa to hod. Pripravte si intala n sbory pre t vau platformu, nabudce si ich naintalujeme a za neme s nimi pracova%.

Mal ve k databzy/ 3. as%


Dnes si kone ne MySQL server naintalujeme. Verm, e ste niekde zskali alebo stiahli z internetu prslun sbory s SQL serverom a k nemu prslunm klientom. Zopakujme si, e server je t as%, ktor vykonva nae prkazy a vracia nm poadovan odpovede a klient je t as%, cez ktor tomu serveru tie prkazy zadvame a v ktorom poadovan vsledky vidme. Naintalova % len samotn server je mon, lebo meme k nemu pristupova% aj inak, ako cez klienta. Naprklad meme komunikova% s SQL serverom aj cez webovsk prehliada (Netscape, Opera, Internet Explorer a in) alebo z inej aplikcie, ako je Excel a podobne. Naintalova% klienta bez servera zmysel nem. Balky MySQL (tak ako v ina na Linuxe) sa ozna uje zvltnym spsobom, napr: MySQL-3.22.27-1cs.i386 , kde slica 3 znamen verziu pouitch formtov sborov, slo 22 je slo jadra programu a slo 27 je tzv. release verzia. 1cs znamen pravu na pouvanie s. znakov a i386 hovor, e tento sbor je ur en pre procesory Intel od 386-ky a vyie. Posledn stabiln verzia je 3.22.xx, kde na tom xx a tak ve$mi nezle. Ak budete pouva% verziu 3.21.xx, nemusia vetky prkazy fungova% korektne. Pripomnam, e verzie pre Windows mete pouva % v zmysle shareware podmienok a ako free len t, ktor bola uvo$nen po uveden novej verzie (napr. 3.21.xx). Pre Linux toto obmedzenie neplat, ale zase sa nevyplca pouva% najposlednejie verzie, (3.23.xx) ktor bvaj spravidla ete nevychytan! Ako sme si povedali, MySQL server existuje pre platformu Windows aj pre Linux. Ukeme si postupy intalcie pre obidva systmy. Intalcia MySQL pre Windows Kompletn balk, teda server aj klient, sa nachdza v jednom spakovanom sbore, napr. mysql-shareware3.22.34-win.zip , o je posledn stabiln shareware verzia pre 32-bitov Windows . Nzov sa me mierne li% pod$a verzie programu. Jeho ve $kos% je pribline 5 MB. Po rozzipovan balka spustme program setup, ktor ns prevedie klasickou oknoidnou intalciou, ktor zvldne aj za iato nk. Meme si zvoli% cestu, kam sa MySQL naintaluje. Pokm neintalujeme MySQL do defaultnho adresra c:\mysql, budeme potrebova % sbor my.cnf, ktor je potrebn prekoprova % do kore&ovho adresra na disku c:. Tento zskame premenovanm a upravenm sboru my-example.cnf, ktor njdeme v adresri, kde sme intalovali MySQL. Rovnako budeme sbor my.cnf potrebova%, ak z akhoko$vek dvodu nau intalciu neskr presunieme do inho adresra. V oboch prpadoch je potrebn njs % a upravi% pod$a skuto nosti riadok s direktvou basedir. Na tomto riadku treba zrui % komentr (zmaza% znak #) a upravi% relnu cestu k intalcii MySQL. Ak sme ponechali intalciu na intala n program, a ten MySQL naintaloval do adresra c:\mysql, sbor my.cnf nepotrebujeme a vyie uveden pokyny nevykonme. Po intalcii je vhodn prida% do premennej PATH v sbore autoexec.bat adresr bin z intalcie MySQL, aby sme mohli tartova% a zastavova% server a takisto aj sp%a% klienta a ostatn obslun programy z prkazovho riadku v ktoromko$vek adresri. Treba ma% na pamti, e sa intalcia pod $a verzie li, napr. neumo&uje vybra% in adresr ako c:\mysql a podobne (verzie 3.21.xx). Predpokladm, e ste dostato ne erudovan a takto mal odlinosti vs nemu pomli%. Na zver premenujeme program mysqld-shareware na mysqld. Ak sme spene vykonali intalciu, meme server poprvkrt spusti%. Sp$anie a zastavovanie servera MySQL Spsob tartovania a zastavovania serveru sa li pod $a toho, i sme intalovali na Windows 95/98 alebo na platformu NT. Sp$anie a zastavovanie vo Windows 95/98 Server spustime z adresra mysql\bin (alebo priamo, ak sme upravili premenn PATH) prkazom: mysqld alebo: mysqld-shareware (niektor verzie). Server sa spust na pozad a je pripraven k innosti. Ak chceme server zastavi%, pouijeme prkaz : mysqladmin -u root shutdown Sp$anie a zastavovanie na Windows NT Sp%anie a zastavovanie na Windows NT meme vykona% dvojakm spsobom - a to bu # ako konzolov aplikciu, alebo ako slubu (service). Ak server sp%ame ako konzolov aplikciu, pouijeme prkaz:

mysqld standalone a zastavujeme u znmym: mysqladmin -u root shutdown . Ak chceme pouva% MySQL na NT ako slubu (service), pridme server medzi sluby prkazom: mysqld install a tartujeme a zastavujeme server prkazmi: net start mysql alebo net stop mysql A ete jedna perli ka. Ak spustme server prkazom: mysqld --language=slovak (v starch verzich je len vo$ba czech) bude s nami komunikova% v slovenskom jazyku. Odteraz dostaneme vetky chybov hlky v zrozumite$nejej forme. Vyskajte! Intalcia MySQL na Linuxe Pri intalcii na Linuxe mme na vber z troch monost: n uvatelia RedHatu a SuSE mu poui% binrku vo formte RPM n intalova% z vopred skompilovanej binrnej distribcie n poui% zdrojov texty a skompilova % si MySQL na vlastnej distribcii Linuxu Intalcie binrnej distribcie MySQL formtu RPM Ak v naom po ta i sdli Red Hat Linux, SuSE Linux alebo mme k dispozcii program rpm pre prcu s redhatovskmi balkmi, pouijeme pravdepodobne tento typ intalcie. Je najjednoduchia a najrchlejia. /o budeme potrebova %? Tak naprklad balk servera MySQL-3.22.27-1cs.i386.rpm a balk klienta MySQLclient-3.22.27-1cs.i386.rpm . Potom ns ak jednoduch krok. Pod X-Windows v naej ob$benej aplikcii pre sprvu rpm balkov (v GNOME je to GNOrpm, v KDE je to kpackage ) tieto balky naintalujeme. Druhou monos%ou je intalcia z prkazovho riadku. V adresri, kde mme uloen .rpm balky spustme prkaz: rpm -Uhv MySQL-*.rpm Takto sa naraz naintaluje server aj klient, vytvoria prslun databzy test a mysql. A naviac, server sa hne# spust a be na pozad. Zrove& sa nastavia tartovacie skripty tak, aby sa pri kadom spusten Linuxu spustil aj MySQL server. Intalcia binrnej distribcie MySQL formtu gz V prpade, e n Linux nevie pracova% s balkmi rpm a my chceme intalova% binrnu distribciu, musme si njs% prslun sbor. Ten m prponu tar.gz alebo tgz. Tieto prpony s ekvivalentn a znamenaj, e tento sbor bol vytvoren bal kova om tar a pakova om gzip. Najprv sa rozhodneme, kam chceme MySQL intalova%. Binrny sbor umiestnime o rove& vyie, teda ak chceme ma% MySQL v adresri /usr/local/mysql, umiestnime sbor do /usr/local. Uloen sbor rozbalme pomocou prkazu: tar zxvf meno sboru napr. tar zxvf mysql-3.22.27-pc-linux-gnu-i586.tar.gz . Tmto vznikne adresr mysql-3.22.27-pc-linux-gnu-i586 , ktor pre jednoduch prstup premenujeme na mysql, alebo prkazom: ln -s mysql-3.22.27-pc-linux-gnu-i586 mysql vytvorme symbolick linku mysql na dan adresr. Vojdeme do adresra /mysql/scripts a spustme prkaz: ./mysql_install_db ktor vytvor potrebn databzy mysql a test. Tm je intalcia hotov a server meme spusti% z adresra mysql/bin prkazom: ./safe_mysqld & Znak & (ampersand) zabezpe , e sa server spust na pozad. Intalcia zo zdrojovch textov Ak sa rozhodneme skompilova% MySQL sami, musme si zabezpe i% zdrojov texty programu. Upozor &ujem, e kompilcia a intalcia zo zdrojovch textov je pomerne nro n pre Linuxovho za iato nka. Na druhej strane,

10 len pri tomto type intalcie meme nastavi % parametre servera, ktor by sme inm spsobom nenastavili. Ako jeden z najdleitejch parametrov povaujem monos % eskho (teda skoro slovenskho - a na nieko$ko znakov) abecednho triedenia. To znamen, e takto skompilovan server doke rozpozna % diakritick znaky a triedi% pod$a eskej abecedy. Sbor so zdrojovmi textami si ulome do $ubovo$nho adresra a tento rozbalme pomocou znmeho prkazu: tar zxvf mysql-3.22.27.tar.gz. Po tomto kroku sa musme rozhodn%, kam chceme MySQL naintalova%. Defaultnm (tandardnm = prednastavenm) adresrom je usr/local, toto vak nemus kadmu vyhovova%. Takisto sa musme rozhodn%, i chceme nae databzy umiestni% do defaultnho adresra /usr/local/data alebo ich umiestnime inde. Teraz vstpime do adresra, kde sme rozbalili zdrojov texty a spustme prkaz: ./configure --prefix=[cesta_intalovania_mysql ] localstatedir=[ cesta_intalovania_databz] --withcharset=czech. configure je konfigura n prkaz, prefix a localstatedir nastavia cestu k serveru a databzam, with-charset nastav triedenie v eskom jazyku. Slovensk nie je k dispozcii. Ak sa vetko vykon ako m, teda bez chybovch hlsen, je naa intalcia pripraven ku kompilcii, ktor spustme prkazom: make K samotnej intalcii sta zada%: make install a MySQL mme v nami zadanom adresri. Odpor am prida% do premennej PATH cestu ku spustitelnym sborom, teda [cesta_intalovania_mysql]/bin . Samotn kompilcia je nro n nielen na nervy kompilujceho, ale hlavne na as. Na takom dnes u priemernom PC s procesorom Pentium 233 MMX so 64 MB RAM trv asi 30 mint, na slabch aj hodinu. Na silnejch po ta och je to len nieko$ko mint. Po samotnej kompilcii je potrebn ete vytvori % databzy test a mysql. O toto sa postar skript mysql_install_db, ktor sa nachdza v rozbalenej distribcii zdrojovch textov a v adresri scripts. Po dokon en skriptu mme k dispozcii MySQL server s uvate$om root bez hesla a riadkovho klienta mysqld. MySQL server spustme pomocou druhho skriptu safe_mysqld & . Prv spojenie Ak sme spene naintalovali server aj klienta v hociktorej platforme $ubovo$nm vyie spomnanm spsobom, meme spusti % server a vyska% prv spojenie s nm. /i v prkazovom riadku DOS-u alebo v textovej konzole Linuxu, odteraz bud prkazy pre prcu s MySQL serverom alebo riadkovm klientom rovnak. Zadme prkaz: mysql -u root test ktor ns pripoj k databzi test na serveri. Vsledok spojenia je na obrzku .1:

Ak vidme na monitore podobn obrzok, mme dkaz, e SQL server be. Klient mysql, nazvan aj MySQL monitor sa zobraz tzv. promptom mysql>, o zna , e o akva zadanie prkazu. Zoznam najzkladnejch prkazov zskame po zadan prkazu help.

11 Aby bolo jasn, e zadvame prkazy v prostred klienta mysql, budeme ich uvdza% tmto promptom mysql>, aby sme ich odlili od prkazov, zadvanch v opera nom systme. Ak chceme prcu s tmto riadkovm klientom ukon i%, zadme prkaz mysql> exit alebo mysql> quit. Root Ten, kto m v MySQL najvyie postavenie a teda m pln prva k spravovaniu servera, sa nazva root. Pozor, aj ke# je jeho meno toton s najvym sprvcom root na Linuxe, nejedn sa o t ist funkciu a nemus (ale me) to by% ani t ist osoba. Ak je na Linuxe administrtor root Janko Konpka s heslom Marienka, me by% v MySQL administrtorom root Ferko Mal s heslom 5bvD45. Ale samozrejme ni nebrni tomu, aby Janko Konpka bol zrove & rootom v MySQL, a heslo do Linuxu mal rovnak ako do SQL servera alebo plne in. Nastavenie hesla pre roota Zkladnm prvkom bezpe nosti je pouvanie hesiel pre uvate$ov. MySQL sa tandardne intaluje s vytvorenm uvate$om root bez hesla. Preto je potrebn heslo nastavi %. To dosiahneme pripojenm k databze mysql ako root prkazom: mysql -u root mysql Spust sa klient MySQL monitor a v prompte zadme prkaz: mysql> update user set password=password(heslo_pre_roota) where user=root; Za heslo_pre_roota si dosadme nae heslo, ktor chceme v spojen s rootom pouva%. V zsade by heslo malo by% tak, aby ho nikto nebol schopn uhdnu%. Nie je vhodn pouva% ako heslo men svojich blzkych, rznych vec a podobne. Naj %aie odhalite$n hesl s kombincie nhodnch znakov s slicami, naprklad fr45HC8a. Upozor&ujem, e MySQL tak ako Linux alebo Windows NT je case-sensitive, teda rozliuje mal a ve$k psmen. Teda heslo priklad_hesla nie je toton s heslom PrIkLaD_HeSlA. Hesl, tak ako vetky textov re%azce, sa zadvaj v apostrofoch (znak ,nie v dvojitch vodzovkch). Pozor na znak ; (bodko iarka) na konci prkazu! Tento nie je s as%ou SQL prkazu, ale ho vyaduje riadkov klient mysql a znamen nie o tak ako teraz vykonaj tento prkaz. Vetky prkazy, nielen SQL, zadvan v tomto klientovi sa musia ukon ova% znakom ;. Ak je prkaz, ktor zadvame ve $mi dlh, sta me klvesu Enter a klient vytvor nov riadok ozna en pkou ->. Tu meme pokra ova% a ke# zapeme cel prkaz, nezabudnime na bodko iarku. Stla me Enter a nami zadan prkaz sa vykon. Ak sme neurobili chybu, prkaz potvrd sprvnos% vykonania hlsenm Query OK, tak ako to je na obrzku .2.

Vznam jednotlivch intrukci vo vyie uvedenom prkaze si objasnme neskr. Teraz je potrebn ukon i% klienta prkazom exit (alebo quit) a v prkazovom riadku opera nho systmu spusti% prkaz: mysqladmin reload ktor spsob na tanie novch prstupovch prv. Ak sa chceme teraz pripoji % k serveru k databze test, musme poui% prepna -p: mysql -u root -p test alebo mysql -u root -pheslo_pre_roota (spolu s psmenom p- bez medzery!). Ak sme zadali prv tvar prkazu, systm sa spta na heslo hlkou Enter password:, ktor musme zada%z klvesnice. Pri zadvan sa z dvodu bezpe nosti heslo vypisuje hviezdi kami, to preto, keby sa niekto pozeral

12 cez rameno. Preto musme by% pozorn pri %ukan do klvesnice. Mm jednu dobr radu: nepouvajme heslo, v ktorom s znaky y az. To preto, e nevieme, i je nastaven klvesnica QWERTY alebo QWERTZ. Ak zadme nesprvne heslo, pokus o spojenie zlyh a server vyd chybov hlku. Ak sme zadali heslo sprvne, vype sa uvtanie, tak ako to je na obrzku .3

Zkladn programy pre prcu s MySQL Ak sa pozrieme do adresra, kde sme intalovali MySQL, zistme, e sa tu nachdzaj ete #a$ie programy. Teraz sa stru ne oboznmime s tmi, ktor budeme naj astejie pouva%: n mysqld - samotn SQL dmon - server n mysql - riadkov klient MySQL monitor n mysqladmin - administrtorsk utilita. Vytvra a mae databzy, na tava tabu$ky prv, vypisuje verziu, procesy a status servera. n mysqldump - exportuje (dumpuje) databzu do sboru n mysqlimport - nahrva dta z textovho sboru do prslunch tabuliek n mysqlshow - zobrazuje informcie o databzach, tabu $kch, st(pcoch a indexoch n mysqlmanager - grafick klient (len vo Windows XX) Zkladn databzy Ako sme si povedali, po spenej intalcii sa vytvoria v systme MySQL dve zkladn databzy test a mysql. Databza test je klasick databza, ktor systm pripravil pre nae cvi n pokusy. Databza mysql je databza, v ktorej s uloen administrtorsk tabu$ky prstupovch prv. Ako sme skr povedali, tu sa nastavuj uvatelia a ich prva pre prcu s rznymi databzami a tabu $kami v nich. Zatia$ o do databze test me pristupova% kad uvate$ MySQL, s databzou mysql me operova % iba root. Databza test je zatia$ przdna, teda neobsahuje iadne tabu$ky. V databze mysql sa nachdzaj tzv. grant tables, ktorch po et sa li v jednotlivch verzich programu. V starch verzich s tri najzkladnejie tabu$ky - user, db, host. Pod$a verzie sa okrem tchto tabuliek nachdzaj ete tabu$ky tables_priv a columns_priv alebo func. Ak chceme vedie%, ak tabu$ky mme, v mysql klientovi zadme skupinu prkazov: mysql> use mysql; ktor povie systmu, e budeme pracova % s databzou mysql. Prkazom mysql> show tables; vypeme vetky tabu$ky v databze mysql, tak ako to je na obrzku .4.

13

Vznam jednotlivch tabuliek si vysvetlme v #a$ej asti serilu. Nabudce si ukeme, ako sa tvoria, nap(&aj a prezeraj nae znme tabu$ky KNIHA a ZANER. Poznmka: T, ktor maj prstup k Internetu, mu njs% #a$ie informcie na www strnke www.cevaro.sk. Njdu tu linky na spomnan sbory, ako aj cvi n prklady, ktor budeme postupne vytvra %.

14

Mal ve k databzy 4.!as$


U vieme, ako naintalova%, spusti% a zastavi% MySQL server, ba vieme sa aj prihlsi% jako root a zmeni% si heslo, take nm u ni nebrni, aby sme s nm za ali pracova%. Ako sme si povedali, na komunikciu so serverom pouvane sadu SQL prkazov. Na zadvanie tchto prkazov meme poui % u znmeho klienta MySQL Monitor (program mysql) alebo sadu pomocnch programov. Ak sa chceme o monostiach toho-ktorho pomocnho programu dozvedie % viac, spustme ho s parametrom help alebo h. V stru nej npovede zistme zkladn parametre danho programu. Pre nzornos % budeme prkazy pre klienta mysql ozna ova% promptom mysql>, bez tohoto promptu uvaujeme pomocn programy v prostred prslunho opera nho systmu. Taktie budeme prkazy psa% malmi psmenami, lebo klient mysql akceptuje aj mal psmen. Zkladn prkazy SQL MySQL obsahuje mnoinu prkazov pod$a normy SQL92, my vak budene zatia$ vyuva% iba zkladn skupinu, ktor je popsan v tabu$ke .4-1. Prkaz create table drop table alter table insert into update delete select Popis vytvorenie tabu ky zmazanie tabu ky prava truktry tabu ky vloenie zznamu do tabu ky prava zznamu v tabu ke vymazanie zznamu v tabu ke vpis z tabu ky

Z tabu$ky je zrejm, e na zkladn innos% so serverom posta uje sedem prkazov. Azda najdleitejm prkazom je SELECT. Jednotliv prkazy a ich monosti si objasnme postupne, ako budeme vytvra % nau databzu. Naa prv databza Ako sme si povedali, budeme pracova % s databzou KNIZNICA a s tabu$kami v nej uloenmi. Vieme, e MySQL server po intalcii obsahuje dve zkladn databzy - MYSQL a TEST. Preto musme databzu KNIZNICA vytvori% sami. Na vytvorenie databze pouijeme program mysqladmin s vo$bou create meno_databze . Take zadme: mysqladmin create kniznica Aby sme sa presved ili, i naozaj vetko prebehlo v poriadku, pouijeme da$ pomocn program mysqlshow kde na obrazovke uvidme vpis jednotlivch databz, vytvorench na naom serveri. Meme poui % aj klienta mysql, v ktorom zadme prkaz pre klienta: mysql> show databases; Odpove# servera na tento prkaz by mala by% tak, ako na obr. . 4-1:

15

Tabu ky Teraz mme vytvoren databzu KNIZNICA. Zatia$ je przdna, ale vieme, e bude obsahova % (do asne iba dve) tabu$ky ZANER a KNIHA. Tabu$ka sa vytvor prkazom: create table meno_tabulky (poloka1 typ_poloky1, poloka2 typ_poloky2,...,polokan typ_polokyn ) kde meno_tabulky je konkrtne meno, napr. ZANER a v ztvorkch sa uvdza meno poloky a jej dan typ. Tabu$ka ZANER m iba dve poloky cis_odd, ktor je typu int a tematika, ktor je typu varchar o po te znakov do 20. Z kontruktvneho h$adiska je vhodn, aby prv poloka cis_odd bola zrove& primrnym k$ om a aby mala autoinkrementa n schopnos%. To znamen, aby sa vdy po pridan novho zznamu automaticky zv ila jej hodnota o 1. Aby sme vytvorili tabu$ku ZANER, spustme klienta mysql s parametrom kniznica, m sa automaticky nastavme do prostredia databzy KNIZNICA. Odteraz prkazy, ktor budeme zadva %, sa bud tka% databze KNIZNICA a tabuliek v nej. Vytvorenie samotnej tabu$ky vykonme prkazom: mysql > create table zaner (cis_odd int auto_increment primary key, tematika varchar(20)); Ak je riadok prkazu ve$mi dlh, stla me Enter a pokra ujeme na novom riadku za pkou. Spome&me si, e prkaz klienta sa vykon a po zadan bodko iarky a stla en Enter! Ak sme neurobili v zpise iadnu chybu, server potvrd vykonanie prkazu hlkou Query OK, tak ako je to na obrzku .4-2:

16 Podobnm spsobom si vytvorme aj tabu $ku KNIHA. Polia tabu$ky bud ma% tieto nzvy a typy, ako s popsan v tabu$ke Tab. 4-2: Nzov po a Typ po a id nazov autor vydavatel cis_odd cena poznamka int varchar(40) varchar(30) varchar(25) int decimal(7,2) varchar(25)

Zadanm prkazu: mysql > create table kniha ( -> id int auto_increment primary key, -> nazov varchar(40), -> autor varchar(30), -> vydavatel varchar(25), -> cis_odd int, -> cena decimal(7,2), -> poznamka varchar(25)); sme vytvorili druh tabu$ku s nzvom KNIHA. Typ id int auto_increment a varchar u poznme, typ decimal(7,2) znamen, e je to seln hodnota na sedem miest, z oho dve s za desatinnou iarkou (v po ta ovom prostred bodkou). Maximlna hodnota tohto vrazu je teda 99999.99, o je myslm na cenu knihy posta ujce. Aby sme sa presved ili, e sme skuto ne vytvorili tabu$ku KNIHA, spustme program: mysqlshow kniznica m zobrazme vetky tabu$ky v databzi KNIZNICA. Meme zada% prkaz pre klienta: mysql > describe kniha; Tak dostaneme truktru tabu$ky tak, ako je na obr. .4-3:

17

Takmto spsobom si meme overi %, i sme tabu$ku nadefinovali sprvne. Ak by sme z akhoko$vek dvodu potrebovali tabu $ku vymaza%, pouijeme prkaz: mysql > drop table meno_tabu)ky; Po pouit tohto prkazu je tabu $ka nenvratne straten, take ho pouvajme s rozvahou! Nap%(anie tabuliek Ak sme spene vytvorili tabu$ky, meme ich za a% nap(&a% vhodnmi informciami. Na nap(&anie tabuliek sa pouva prkaz INSERT INTO v takomto tvare: insert into meno_tabu)ky (meno_1_poloky, meno_2_poloky, meno_n_poloky) VALUES (hodnota_1_poloky, hodnota_2_poloky, ..., hodnota_n_poloky) Ak budeme dop(&a% poloky v presnom porad tak, ako s nadefinoval v tabu$ke, nemusme v zpise prkazu vypisova% nzvy jednotlivch poloiek pred slovom VALUES (=hodnoty). Tm si trochu zjednoduchme zpis. Zadme teda: mysql> insert into zaner values (0, poezia); Pre o sme na prv pozciu zadali nulu? Ke# sme tvorili tabu$ku ZANER, ur ili sme, e st(pec CIS_ODD bude ma% autoinkrementa n schopnos%. Preto nie je potrebn zada % do st(pca CIS_ODD prslun poradov slo, napr. 1,2,3.... Ak zadme v kadom pridan zznamu pomocou insert into nulu, server sm za ns prirad prv vo $n poradov slo. Ke# zadvame pridanie #a$ch zznamov, znova na prv pozciu zapeme nulu, teda: mysql> insert into zaner values (0, roman); Pripomnam, e re%azce sa zadvaj do apostrofov alebo do vodzoviek. Ke #e niektor opera n systmy neuznvaj v textoch vodzovky, my budeme pouva% univerzlnej apostrof. (Poznmka: Mono ns napadne, i meme zadva% textov re%azce s diakritikou. Odpove# je trochu komplikovan. Ak prostredie opera nho systmu umo&uje psa% a zobrazova % znaky s diakritikou na obrazovke, meme tto monos % vyui%. Ale ak nemme MySQL server preloen z podporou triedenia pod$a nrodnej abecedy, dostaneme v prkaze SELECT niekedy neiadcu odpove#. Ako mi je znme, preklad samotnho servera je mon iba v prostred Linux, zatia$ o binrne sbory pre Windows nie s skompilovan s nrodnou podporou. Nie je to nerieite $n, ale zatia$ v tchto cvi nch aplikcich budeme pouva% texty bez diakritickch znamienok.)

18

Ak sme nespravili iadnu chybu, SQL server potvrd vykonanie prkazu hlkou: Query OK, 1 row affected (0.22 sec) o znamen asi to$ko, e query - dopyt bol sprvny, bol ovplyvnen jeden riadok a ko $ko asu trvalo vykonanie tohoto query. Takto doplnme aj ostatn zznamy do tabu $ky ZANER: mysql> insert into zaner values (0, krimi); mysql> insert into zaner values (0, detska lit.); mysql> insert into zaner values (0, cestopis); mysql> insert into zaner values (0, lit. faktu); mysql> insert into zaner values (0, odborna lit.); Vimnime si, e sme nulu pouili aj v ostatnch zpisoch. Vyh advanie zznamov Ako sa presved me, ak dta mme uloen v tabu$ke? Na to pouijeme prkaz SELECT. Vieme, e lohou prkazu SELECT je vybra% z danej tabu$ky ur it informcie na zklade stanovench kritri. Je to jeden z najmocnejch prkazov v SQL truktre. Jeho mnohm parametrom sa budeme postupne venova %, zatia$ nm sta vedie% najjednoduch a zrove& najobecnej zpis: mysql> select * from meno_tabu)ky; Select znamen vber, * znamen vetko, from odkia$ a za meno_tabu !ky dosadme u konkrtne meno. V naom prpade prkaz select * from zaner znamen : vyber vetko z tabu$ky ZANER a vsledok bude vyzera% tak, ako na obrzku .4-4:

Mazanie zznamu Na vmaz konkrtneho zznamu v ur itej tabu$ke sa pouva prkaz: delete from meno_tabu)ky where podmienka Podmienka, nasledujca za slovom WHERE ur uje, ktor zznam bude zmazan. Ak ani jeden zznam nespl&uje podmienku, iadna zmena sa nevykon. Ak by sme teda chceli vymaza% tvrt riadok z tabu$ky ZANER, prkaz by vyzeral asi takto: mysql> delete from zaner where cis_odd = 4; V prpade, e by sme rozhodovali pod $a textovho po$a TEMATIKA, podmienka by vyzerala takto: mysql> delete from zaner where tematika = detska lit.; Zmena zznamu Na zmenu obsahu ur itho zznamu sa pouva prkaz UPDATE. Tento sme u raz pouili, a to na zmenu hesla pre roota v tabu$ke USER v databze MYSQL, spomnate si?

19

Syntaktick zpis prkazu update je: update meno_tabu)ky set poloka = nov_hodnota where podmienka Ak by sme chceli upravi% iesty zznam tabu$ky ZANER na faktografia namiesto lit. faktu, vykonali by sme to prkazom: mysql> update zaner set tematika = faktografia where cis_odd=6; alebo mysql> update zaner set tematika = faktografia where tematika=lit. faktu; Jeden aj druh zpis je sprvny, zle len na stanoven podmienky, ur ujcej, ktor zznam sa uprav. Ak podmienke vyhovie viac zznamov, djde k zmene u vetkch zznamov, ktor vyhoveli podmienke. Ak nevyhovie ani jeden zznam z tabu$ky, ostane tabu$ka bezo zmien. Pre nau #a$iu innos% si napl&te aj druh tabu$ku KNIHA aspo& nieko$kmi zznamami, aby sme sa nabudce mohli pohra% s mnohmi variantami prkazu SELECT. Tu uvidme silu SQL. Aby sme si precvi ili to, o sme si dnes vysvetlili, ale zrove& nepokodili nevhodnm zsahom pracne vytvoren databzov zklady budceho projektu kninice, vypracujeme si cvi ne domcu lohu! Domca loha: 1) Vytvorte si cvi n databzu SKUSKA 2) V nej vytvorte tabu$ku OSOBY, ktor bude obsahova % tieto st(pce a ich typy: por_cislo int auto_increment primary key meno varchar(30) 3) Napl&te tabu$ku vhodnmi dtami, (mete vyska% aj zadvanie a zobrazovanie znakov s diakritikou 4) Vypte obsah tabu$ky 5) Zmate nieko$ko zznamov pod$a vami stanovenej podmienky 6) Vlote jeden nov zznam (/o zaujmav ste zistili???) 7) Zme&te $ubovo$n zznam prkazom update a prezrite si vsledok 8) /o sa stane, ak zadte nepln prkaz: delete from osoby 9) Zrute tabu$ku OSOBY 10) Zrute databzu SKUSKA (mysqladmin drop.... ..)

20

Mal ve k databzy / 5.

as%

V vode si objasnme problmy, ktor vznikli pri domcej lohe z minulej asti. Pozrime sa bliie na 6.prklad z lohy: /o sa stane, ke# po zmazan niektorho zznamu znova vlome jeden nov zznam? Odpove# znie: Nov zznam sa nevlo na koniec ostatnch zznamov, ale server njde prv vo $n miesto po zmazanom zzname a vyuije ho. Ak u neexistuje vo$n miesto po zmazanch zznamoch, prid nov vkladan zznam na koniec vetkch zznamov. Toto je ve$mi dleit uvedomi% si pri opercich mazania a vkladania, inak by sme mohli dostva% neiadce vsledky. 8.prklad je ete nebezpe nej: Ak zadme : delete from meno_tabu)ky bez podmienky, zmae sa cel tabu ka! A ako u vieme, prkaz delete je detruk n a prdeme o vetky dta v prslunej tabu$ke. Take pozor na presn zadvanie prkazov! To$ko k domcej lohe. Teraz si spus%me klient-monitor mysql s parametrom kniznica, aby sme mohli operova % s naimi tabu$kami.

Prkaz SELECT
SQL, a teda aj MySQL ponka ve$a spsobov, ktor slia na manipulciu s dtami v databze. Zvyuj tak komfort obsluhy a kvalitu prce. Jednm z najznmejch, najuito nejch a najpouvanejch prkazov jazyka SQL je istotne prkaz SELECT (vber). Pomocou tohto prkazu meme vytiahnu % z databze kad dleit daj a vyriei% tak ve$a situcii v zskan tej sprvnej informcie. V zvere minulej asti sme si ukzali najzkladnej tvar prkazu SELECT na prezeranie dt v naich tabu$kch KNIHA a ZANER v databzi KNIZNICA: mysql> select * from zaner; Vsledkom tohto prkazu je vpis .5-1:

Prkaz SELECT toho vak doke podstatne viac. Popis vetkch funkci by obsiahol desiatky strn, preto sa zameriame iba na tie najpouvanejie. (Vetky monosti prkazu SELECT sa nachdzaj v prslunej dokumentcii k danmu SQL serveru.) Zkladn popis prkazu SELECT v MySQL je nsledovn: SELECT {zoznam vstupnch poloiek } FROM {zoznam tabuliek} //WHERE {podmienky}// //GROUP BY{zoznam poloiek}// //HAVING {skupinov podmienka }// //ORDER BY {meno poloky ako podmienka zotriedenia }// Zoznam vstupnch poloiek me by% mnoina nzvov jednotlivch st(pcov tabu$ky alebo aj tzv. agrega n funkcie. /o s agrega n funkcie si ukeme niie. Zoznam tabuliek s nzvy tabuliek v danej databzi. Parametre uveden v lomtkach nie s povinn. Sksme si aplikova% tieto podmienky prakticky na naej databze KNIZNICA.

Vypsanie niektorch poloiek


Ak chceme vypsa% zoznam vetkch poloiek (st(pcov) danej tabu$ky, pouijeme znak * - hviezdi ku. Hviezdi ka symbolizuje slovo vetko. Vsledok sme si ukzali vyie.

21 Ak chceme vypsap len niektor st(pce z danej tabu$ky, nahradme hviezdi ku vypsanm nzvov poadovanch poloiek v prkaze: SELECT poloka_1, poloka_2, ...poloka_n FROM meno_tabu)ky Ak zadme prkaz: mysql>select id, nazov, autor from kniha; dostaneme vsledok, kde s zobrazen iba st (pce id, nazov a autor , ostatn s ignorovan. Zobraz sa teda zredukovan tabu$ka ako je na vpise .5-2:

Agrega!n funkcie
Agrega n funkcie s typy dopytov, ktor spracovvaj hodnoty z celch st(pcov tabu$ky. Zadvame ich do zoznamu vstupnch poloiek za prkaz SELECT. V MySQL existuj tieto najpouvanejie agrega n funkcie: SUM( ) - s et numerickch hodnt v danom st(pci MIN( ) - njdenie minimlnej hodnoty v danom st(pci MAX( ) - njdenie maximlnej hodnoty v danom st(pci COUNT( ) - po et hodnt (zznamov) v danom st(pci AVG( ) - aritmetick priemer numerickch hodnt v danom st(pci Vyskajme si tieto funkcie.

SUM( )
Ak by sme chceli vedie%, ak je hodnota (hodnota = s et cien jednotlivch knh) naej kninice. Pre zjednoduenie predpokladajme, e mme iba po jednom kuse z kadej knihy. Pouijeme funkciu SUM(cena) takto: mysql> select sum(cena) from kniha; a dostaneme tento vpis .5-3:

e sa nm nep i nzov st(pca sum(cena)? Nevad, ak by naa tovn ka nepoznala tieto pojmy, meme pre &u upravi% prkaz select takto: mysql> select sum(cena) as Hodnota knih from kniha; Slovko as spsob, e premenuje stanoven funkciu (v tomto prpade sum(cena) ) na stanoven text, napr. Hodnota knih . Potom dostaneme vpis .5-4:

22

No a to u je zrozumite $nej vpis.

MIN( ), MAX( )
Ve$mi podobnm spsobom meme zisti % minimlnu alebo maximlnu cenu knh v naej kninici. Pouijeme na to funkcie MIN a MAX s vyuitm formulky AS konkrtny_text : mysql> select min(cena) as Najmensia cena, max(cena) as Najvacsia cena knih from kniha; Vsledok je na vpise .5-5:

Ak sa pozrieme do naej tabu $ky KNIHA, vidme, e tieto vyselektovan hodnoty s skuto ne sprvne.

AVG( )
Ak by ns zaujmala priemern cena knh v naej kninici, poijeme funkciu AVG( ) takto: mysql> select avg(cena) as Priemerna cena knih from kniha; a dostaneme vpis .5-6:

Count( )
Ak sa chceme dozvedie%, ko$ko e to mme teraz v kninici evidovanch knh, pouijeme funkciu COUNT( ), ktor zis%uje po et poloiek v danom st(pci. Zadajme prkaz: mysql> select count(*) as Pocet knih from kniha; a tu je vsledok (vpis . 5-7):

Po#me sa teraz pozrie % na druh koniec prkazu SELECT:

Formulcia podmienky WHERE

23

Formalciu podmienky WHERE u trocha poznme aj z inch prkazov SQL. Pouili sme ju pri mazan (delete) a upravovan (update) jednotlivch zznamov v minulej asti serilu. Aj pri prkaze SELECT sp(&a rovnak lohu - vyselektuj sa len tie zznamy, ktor podmienke vyhovuj, ostatn zznamy sa ignoruj. Obsahom podmienky mu by%: n opercie s textovm re%azcom (rovnos%, nerovnos%, podobnos %) n matematick opercie (rovnos %, nerovnos%, v ne, men ne) n logick opercie (AND, OR, NOT)

Opercie z textovm re$azcom


Pri vyh$advan s formulkou WHERE s textovm re%azcom pouijeme tento veobecn zpis: SELECT poloka_1, poloka_2, ...poloka_n FROM meno_tabu)ky WHERE nzov_filtra nho_st&pca OPERAND h)adan_re%azec Za nzov_filtra nho_st&pca dosadme nzov st(pca, pod $a ktorho stanovujeme podmienku. Ak chceme vyh$adva% pod$a nzvu knihy, pouijeme NAZOV, ak pod$a ceny, pouijeme CENA. Za OPERAND dosadme: = (rovn sa), ak sa m porovna% presn text podmienky, <> (nerovn sa), ak sa nem vber rovna% h$adanmu re%azcu LIKE (podobnos ), ak sa m h$adan re%azec podoba %. Za h)adan_re%azec dosadme stanoven text do apostrofov. Tu je nieko$ko prkladov:

= (rovn sa)
Ak by sme chceli vyh$ada% nzov, autora a cenu knh, ktorch VYDAVATEL je vydavate$stvo Computer Press, pouijeme prkaz: mysql> select nazov, autor, cena from kniha where vydavatel = Computer Press; Na vpise .5-8 vidme, e stanovenej podmienke vyhoveli dva zznamy:

<> (nerovn sa)


Naopak, ak by sme chceli vypsa% vetky zznamy o knihch, len nie tie, ktor s z vydavate$stva Computer Press, zapeme podmienku takto: mysql> select nazov, autor, cena from kniha where vydavatel <> Computer Press; Vsledkom bude vpis zvynch piatich zznamov, tak ako na vpise .5-9:

24

LIKE
Ak nevieme presne nzov knihy, nememe poui% operand = . Ak vieme, ak slovo alebo as% slova dan nzov obsahuje, poijeme LIKE a tzv. divok znaky , ktorm hovorievame aj olky (jokes). Tieto v textovch re%azcoch funguj podobne ako olky v kartch - nahrdzaj in znaky. Divok znaky s v SQL databzach dva : % - precento, ktor nahrdza $ubovo$n skupinu znakov _ - podtrtko (pod iarovnk), ktor nahrdza iba jeden znak. Predstavme si, e existuje aksi kniha o programovan, ale nevieme jej presn nzov. Vtedy pouijeme prkaz: mysql> select nazov, autor, vydavatel, cena from kniha where nazov like %program%; Vsledok je na vpise .5-10:

Treba si uvedomi%, e v tomto ilustra nom prklade, kde mme iba sedem zznamov, je vsledok tohto h $adania pomerne jednozna n. V praxi, kde s v tabu$kch miliny zznamov, je nutn o najpresnejie popsa% dan podmienku pre vyh$advanie, aby sme dostali o najkonkrtnejie vsledky, inak by vyie uvedenej podmienke mohli vyhovie% aj stovky kninch titulov. Preto sa asto pouva aj znak _ podtrtko, ktor nahrda iba jeden znak v podmienke.

Podmienka s matematickmi operciami


Prca s prkazom SELECT, kde je v podmienke matematick opercia sa neve $mi li od prce s textovm re%azcom. Je tu iba jedna zmena - seln hodnoty sa nezapisuj do apostrofov. Pri vyh$advan s formulkou WHERE s selnou hodnotou pouijeme tento veobecn zpis: SELECT poloka_1, poloka_2, ...poloka_n FROM meno_tabu)ky WHERE nzov_filtra nho_st&pca OPERAND seln_hodnota Za operand meme dosadi %: = (rovn sa) <> nerovn sa < men ne > v ne Tu je nieko$ko prkladov: Ak chceme vyh$ada% knihy, ktorch cena je rovn konkrtnemu slu, pouijeme zpis: mysql> select nazov, autor, cena from kniha where cena = 66; Vsledok je na vpise .5-11:

25

Znakom <> (nerovn sa) by sme analogicky vypsali vetky ostatn knihy, len nie tie, o stli 66 korn, tak ako je to na vpise . 5-12:

Taktie meme stanovi% podmienku > (v" ne) alebo < ( men ne). Knihy drahie ako 400 Sk s na vpise .5-13:

Knihy lacnejie ako 400 Sk s na vpise .5-14:

Podmienka s logiskmi operciami


Logick opercie v podmienkch prkazu SELECT s tesne zviazan s vyie uvedenmi matematickmi alebo textovmi operciami. Pomocou logickch operandov meme spja % nieko$ko podmienok do jednho prkazu. Obecn popis prkazu SELECT s vyuitm logickch operci vyzer takto: SELECT poloka_1, poloka_2, ...poloka_n FROM meno_tabu)ky WHERE podmienka_1 LOGICK_OPERAND podmienka_2 LOGICK_OPERAND podmienka_n Za logick operand meme poui %: AND - a zrove& OR - alebo NOT (!=) - negcia = zpor Zverom nieko$ko prkladov:

AND
Ak h$adme knihy, ktor patria do kategrie odbornej literatry a ZROVE* ich cena je v ia ako 450 Sk, zadme prkaz:

26

mysql> select nazov, autor, vydavatel from kniha where cis_odd = 7 AND cena > 450;

Vidme, e tejto zloenej podmienke vyhovuj dva zznamy.

OR
Ak h$adme knihy, ktor vydalo nakladate$stvo Computer Press ALEBO Grada, zadme prkaz: mysql> select nazov, autor, vydavatel from kniha where vydavatel = Computer Press OR vydavatel = Grada ;

Tentokrt vyhoveli podmienke tri zznamy.

!= (NOT)
Ak chceme njs% knihy, ktor NEVYDALO nakladate$stvo EAAP, zadme prkaz: mysql> select nazov, vydavatel, cena from kniha where vydavatel != EAAP; Vsledok je na vpise .5-17:

Isto ns napadne, e je mon tieto typy podmienok vzjomne kombinova %, aby sme mohli vytvori% aj ve$mi zloit podmienku.

Mal ve k databzy / 6.!as$


V tejto asti serilu budeme pokra ova% vo vysvet$ovan prkazu SELECT. Minule sme si hovorili o zkladnch agrega nch funkcich SUM, MIN, MAX, COUNT, AVG a formulovali sme podmienku WHERE v tej najzkladnejej forme.

27 Dnes si vysvetlme a na prkladoch ukeme #alie pokro ilejie parametre a prkazy. Bud to tieto k $ ov slov a klauzule: DISTINCT, BETWEEN, LIMIT, takzvan trieden vpisy a generovan vpisy . Aby sme vak mali prklady ilustrovanejie, doplnme si tabu$ku KNIHA o #alie zznamy pod$a priloenej tabu$ky Tab.6-1: (Samozrejme si mete doplni % vlastn daje)

id nazov 8 Z polovnickej kapsy 9 Plebejska kosela 10 Europou bez penazi

autor Moric, Rudo Mihalik, Vojtech Hlubucek, Petr, Ing.

vydavatel cis_odd cena Mlade leta 4 89 Slovensky spisovatel 1 15 Roman Kasan 5 34

Ak sme tak vykonali (pouitm prkazu INSERT INTO), pristpime teraz k novm parametrom a k$ ovm slovm prkazu SELECT:

DISTINCT
K$ ov slovo DISTINCT zamedzuje vypsaniu viacerch rovnakch hodnt. Ak nechceme, aby sa vypsali riadky, ktor bud ma % rovnak hodnoty pod$a stanovenej podmienky, pouijeme toto k$ ov slovo. Potom sa takto riadok vype iba raz. Predstavme si, e chceme vedie %, od akch vydavate$ov mme v naej kninici knihy. Meme poui% ben prkaz SELECT s redukovanm st(pcov na jeden, a to VYDAVATEL takto: mysql> select vydavatel from kniha; Dostaneme vsledok ako na vpise . 6-1:

Vidme, e prkaz SELECT vybral jeden st(pec , ale z celej tabu $ky, m vypsal aj tie riadky, ktor sa opakuj. Pri tchto pr riadkoch to nevad, ale o ke# budeme ma% tabu$ku o tiscich zznamoch? Kto by v tom listoval? A prve na toto sa ve$mi hod DISTINCT. Take pouijeme : mysql> select distinct vydavatel from kniha; Vidme, e vpis . 6-2 je preh$adnej, lebo zobrazil len sedem riadkov, o s vetci vydavatelia, OD ktorch knihy vlastnme.

28

BETWEEN
Parameter BETWEEN v podmienke WHERE ur uje interval jej platnosti. Obecn zpis je : SELECT meno_st&pca FROM meno_tabu)ky WHERE podmienka BETWEEN doln_hranica AND horn_hranica Ak chceme vyh$ada% knihy s minimlnou cenou napr. 200 Sk a maximlnou cenou 1000 Sk, urobme to takto: mysql> select id, nazov, autor, cena from kniha where cena BETWEEN 200 AND 1000; Na vpise .6-3 vidme, e tejto podmienke vyhoveli tri zznamy.

(Musme si uvedomi%, e tto podmienka sa porovnva v stanovenom intervale od 200 do 1000, vrtane obidvoch krajnch hodnt. To len tak na okraj, lebo v matematike sa v ur itch prpadoch krajn hodnoty intervalu neakceptuj.)

LIMIT
Ak sa domnievame, e prpadn vpis prkazu SELECT by bol ve $mi dlh a chceli by sme ho obmedzi % na prvch n - riadkov, pouijeme k$ ov slovo LIMIT na konci prkazu. Obecn zpis je : SELECT men_st&cov FROM meno_tabu)ky WHERE podmienka LIMIT n, m Ukme si to teraz na naej tabu$ke ZANER: mysql> select * from zaner LIMIT 5; Vidme prvch p% riadkov vsledku prkazu SELECT, tak ako je to na vpise . 6-4:

29

Ak chceme vypsa% #a$ie riadky z tabu$ky, pouijeme k$ ov slovo LIMIT s dvomi parametrami n a m. Parameter n je offset a zna , od ktorho nsledujceho riadku bude vpis pokra ova%, a parameter m zna maximum vypsanch riadkov. Take prkaz : mysql> select * from zaner LIMIT 5,10; vype #a$ch 10 riadkov od riadku, nsledujcom po 5. riadku, teda riadky 6 a 15. Ke #e naa tabu$ka nem to$ko riadkov, vpis sa ukon po poslednom riadku tabu $ky, tak ako je to na vpise .6-5:

Trieden vpisy
Vpisy prkazu SELECT meme formova% nielen pomocou k$ ovch slov a agrega nch funkci, ale meme vytvra% aj tzv. trieden vpisy. Trieden vpisy tvorme parametrami: ORDER BY ORDER BY DESC GROUP BY HAVING (zoradenie vzostupne) (zoradenie zostupne) (zoskupenie) (zoskupenie sp(&ajce podmienku)

ORDER BY
Prkazom ORDER BY zoradme vpis pod $a stanovenho st(pca vzostupne. Veobecn zpis je: SELECT nzvy_st&pcov FROM meno_tabu)ky ORDER BY nzvy_st&pcov Ak chceme zoradi% vpis z tabu$ky KNIHA pod$a abecedy v st(pci NAZOV, zadme prkaz: mysql> select id, nazov, autor from kniha order by nazov; tak ako je na vpise . 6-6:

30

Vidme, e st(pec NAZOV sa zoradil pod $a abecedy, take st(pec ID u nejde po porad. Poznmka: Musme spomen%, e prve tu vznikaj problmy s eskoslovenskm triedenm. Ak nie je server nastaven na triedenie pod$a eskej abecedy, tak znaky s diakritikou nezarad sprvne, teda A, , B, C, /, D, +... at#. ale na koniec sboru v zmysle ASCII tabu$ky. Ak chceme poui% triedenie pod $a viacerch st(pcov tabu$ky, zadme nzvy prslunch st(pcov za ORDER BY. Vzorovm prkladom by mohlo by % zoradenie pod $a nzvu, potom pod $a autorov a nakoniec pod $a vydavate$stva. Zoradenie sa vykon v tom porad, v akom zadme nzvy jednotlivch st (pcov.

ORDER BY DESC
Tento prkaz je ve$mi podobn predchdzajcemu, len slovko DESC znamen, e ur en st(pec sa zorad zostupne. Ak teda chceme zoradi % vpis tabu$ky KNIHA zostupne pod$a st(pca AUTOR, zadme prkaz:

mysql> select id, nazov, autor from kniha order by autor desc; Vsledok vidme na vpise . 6-7:

GROUP BY
Parametrom GROUP BY zoskupme vsledok prkazu SELECT k stanovenmu st(pcu. Obecn zpis je: SELECT nzvy_st&pcov, agrega n_funkcia FROM meno_tabu)ky GROUP BY nzov_st&pca_pre zoskupenie Predstavme si, e chceme spo ta% sumu cien knh po jednotlivch kninch oddelenia, napr. v oddelen .1 je suma xy korn, v oddelen .2 je suma yz korn a podobne. Sta , ak spo tame sumu cien a tto zoskupme po oddeleniach. Zadme:

31

mysql> select cis_odd, sum(cena) as Celkom from kniha group by cis_odd;

Na vpise .6-8 vidme sumy cien knh po jednotlivch oddeleniach kninice. Zrove& sme vyuili znalosti premenovania st(pca agrega nej funkcie SUM na st(pec Celkom pomocou AS.

HAVING
Ak chceme vyie uveden prklad obmedzi% ur itou podmienkou, pouijeme klauzulu HAVING. Obecn zpis je: SELECT nzvy_st&pcov, agrega n_funkcia FROM meno_tabu)ky GROUP BY nzov_st&pca HAVING podmienka HAVING obmedz rozsah vpisu tabu$ky tm, e z agregovanch riadkov vyrad tie, ktor nevyhovuj uvedenej podmienke. Ak chceme vpis cien knh po jednotlivch oddeleniach z predchdzajceho prkladu obmedzi % iba na tie riadky, kde suma je v ia ako 100 (korn), zadme prkaz: mysql> select cis_odd, sum(cena) as Celkom from kniha group by cis_odd having sum(cena)>100 ; Na vpise .6-9 vidme, e je to redukovan vpis .6-8 a riadky 1,3,4 a 5 so sumou menou ako 100 boli ignorovan.

Generovan vpisy
Niekedy je ve$mi potrebn uloi% obsah niektorej tabu$ky (alebo aj celej databze) do sboru a prpadn optovn na tanie uloench dt do servera. Meme tak kona% z rznych dvodov. Pravideln archivcia dt je jeden z najdleitejch . Taktie meme prenies% tieto dta na in po ta . (Ve# kto by znova zadval daje z klvesnice!).V takom prpade vyuijeme tzv. generovan vpisy. S to tak vpisy, kde prslun prkazy SQL servera vygeneruj obsah stanovench databz a ich tabuliek do sboru, ktor je mon v prpade potreby sptne zo sboru na ta% do servera. Pomocnch programov alebo prkazov je nieko $ko, my sa nau me pouva% tyri, rozdelen do tchto dvoch skupn: a) prkazy, generujce len obsah (dta) tabuliek:

32

select .... into outfile load data infile

- vygeneruje dta z tabu$ky do sboru - na ta dta zo sboru do tabu $ky

b) prkazy, generujce obsah aj formu (dta aj truktru) tabuliek (alebo databz): mysqldump source (\.) programu mysql - vygeneruje truktru aj dta z tabu$ky do sboru - vykon SQL skript = na ta truktru aj dta do SQL servera

SELECT ... INTO OUTFILE


Ak chceme uloi% iba dta z $ubovolnej tabu$ky do sboru, pouijeme tento prkaz v monitore MySQL. Obecn tvar je : SELECT * FROM meno_tabu)ky INTO OUTFILE meno_sboru FIELDS TERMINATED BY znak FIELDS TERMINATED BY znamen polia ukon "en (znakom), tzv. oddelova om. Parameter znak je typ oddelova a jednotlivch st(pcov. Spravidla to bva "iarka (,) alebo pipe = rra (|). Predstavme si, e chceme uloi% dta z tabu$ky KNIHA do sboru kniha.dat , kde oddelova om st(pcov bude pipe. Nzov sboru nie je zvzn, prpona je $ubovo$n, ale .dat symbolizuje, e bude obsahova % dta. Vtedy zadme: mysql> select * from kniha into outfile kniha.dat fields terminated by |; Ke#e v naich dtach (v st(pci AUTOR) u pouvame iarku na oddelenie mena od priezviska, ako oddelova pouijeme in znak, najvhodnejie pipe, aby nedolo k chybe. Vpis . 6-10 potvrdzuje, e vetko prebehlo v poriadku a bolo uloench 10 riadkov:

Vzh$adom na relatvnu cestu sa sbor kniha.dat nachdza v adresri MYSQL\DATA\KNIZNICA. Teraz sa meme pozrie %, ak je obsah sboru (vpis .6-11) : 1|Angelika a kral|Golon, Anne a Serge|Slovensky spisovatel|2|56.00| 2|KGB|Gordijevsky, Oleg|EAAP|6|239.00| 3|Bratia Ricovci|Simenon, Georges|Smena|3|18.00| 4|Vtaky v trni|McCulloughova, Collen|Slovensky spisovatel|2|66.00| 5|Linux - prakticky pruvodce|Sobell, Mark G.|Computer Press|7|1073.00| 6|Naucte se programovat v Delphi|Binzinger, Thomas|Grada|7|439.00| 7|Pouzivame linux|Welsh, M., Kaufman, L.|Computer Press|7|494.00| 8|Z polovnickej kapsy|Moric, Rudo|Mlade leta|4|89.00| 9|Plebejska kosela|Mihalik, Vojtech|Slovensky spisovatel|1|15.00| 10|Europou bez penazi|Hlubucek, Petr, Ing.|Roman Kasan|5|34.00| Je zrejm, e oddelova pipe (|) odde$uje jednotliv st(pce tabu$ky. Teraz si meme tento sbor odloi % na bezpe n miesto, aby sme ho pouili, ke# to bude potrebn.

LOAD DATA INFILE


Predstavme si situciu, e z ur itho dvodu je zrazu tabu $ka KNIHA przdna. To sa me sta % pri nechcenom vmaze (vyprzdnen) celej tabu$ky (delete from kniha - spomnate si?), alebo je nekorektn, chbaju jej niektor zznamy a tak sme ju vyprzdnili. Ak mme odloen aktulny! sbor kniha.dat, nemusme by% mrzut. Sta , ak pouijeme prkaz LOAD DATA INFILE. Jeho obecn tvar je: LOAD DATA INFILE meno_sboru INTO TABLE meno_tabu)ky FIELDS TERMINATED BY znak

33

Take v naom prpade skoprujeme sbor do prslunho adresra (s nzvom databze) a zadme prkaz: mysql> load data infile kniha.dat into table kniha fields terminated by |; Znak, ktorm s oddelen jednotliv st(pce, zistme nahliadnutm do sboru. Vpis .6-12 potvrdzuje, e bolo nahratch desa % riadkov do tabu$ky:

Obsah sboru kniha.dat meme nahra% aj do przdnej tabu $ky s inm nzvom ako je KNIHA. Podmienkou je, e tto przdna tabu $ka mus existova% a mus ma% presne t ist truktru ako tabu$ka KNIHA!

MySQLDump
Ak chceme uloi% do sboru nielen dta, ale aj truktru ur itej tabu$ky alebo aj celej databze, je lepie poui % program MySQLDump. Pozor! Nie je to prkaz monitoru MySQL, ale je to samostatn pomocn program MySQL servera. Preto sa spust v prkazovom riadku prslunho opera nho systmu. Obecn zpis je: mysqldump meno_databze meno_tabu )ky > meno_sboru Zob ik > znamen, e vstup programu mysqldump sa presmeruje do sboru meno_sboru. Ak by sme ho nezadali, vstup programu by sa smeroval tandardne na obrazovku. Ak by sme zadali za zob ikom namiesto mena sboru slovko prn, vstup by sa presmeroval na pripojen tla iare&. Pozrime sa bliie na obsah sboru zaner.sql (vpis . 6-13): # MySQL dump 8.2 # # Host: localhost Database: kniznica #-------------------------------------------------------# Server version 3.22.34-shareware-debug # # Table structure for table 'zaner' # CREATE TABLE zaner ( cis_odd int(11) DEFAULT '0' NOT NULL auto_increment, tematika varchar(20), PRIMARY KEY (cis_odd) ); # # Dumping data for table 'zaner' # INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO zaner zaner zaner zaner zaner zaner zaner VALUES VALUES VALUES VALUES VALUES VALUES VALUES (1,'poezia'); (2,'roman'); (3,'krimi'); (4,'detska lit.'); (5,'cestopis'); (6,'lit. faktu'); (7,'odborna lit.');

Z vpisu vidme, e sbor zaner.sql obsahuje SQL prkazy pre server. Na za iatku s SQL prkazy pre vytvorenie tabu$ky ZANER (create table), nsleduj SQL prkazy pre naplnenie tabu$ky prslunmi dtami (insert into). Takto vygenerovan vpis je ve$mi uito n. Je zrejm, e ho prpadne meme upravi %, doplni% dta alebo prepracova% truktru tabu$ky. A hlavne ho meme poui% aj tam, kde nie je nadefinovan prslun tabu$ka.

34 Takto generovan vpis je ve$mi vhodn na prenanie celch databz na in po ta so serverom MySQL. A teraz u chpete, pre o som mu dal prponu .sql, aj ke# som ho mohol pomenova% $ubovo$ne.

Source (\.) programu MySQL


Meme poveda %, e sbor zaner.sql je aksi dvkov sbor SQL prkazov. Hovorme mu aj SQL skript (z angl. script). No dobre, ale ako najjednoduchie tieto prkazy vykona % bez toho, aby sme ich pracne pre %ukvali zo sboru do klvesnice? No predsa jednoduchm spustenm tohto skriptu. N star znmy monitor MySQL m jeden parameter, ktor umo &uje vykona% sbor s SQL skriptom automaticky tak, ako keby boli jednotliv prkazy zadvan z klvesnice. Tento parameter sa nazva source (zdroj), a ozna uje sa aj skrtene \. (pozri help). Ak teda zadme: mysql> source zaner.sql; dostaneme poadovan vsledok. Vpis .6-14 ukazuje, e boli vykonan jednotliv prkazy zo sboru zaner.sql:

e sa tak skuto ne stalo, meme sa presved i% u znmym prkazom select * from zaner. Nabudce si vysvetlme vzjomn spojovanie tabuliek a manipulciu s asovmi dajmi SQL servera.

35

Mal ve k databzy / 7.!as$


V minulej asti serilu sme si ukzali, ako vytvorme sbor zaner.sql. Vieme, e tento sbor obsahuje SQL prkazy pre vytvorenie a zrove & naplnenie poadovanej tabu$ky. Source (\.) programu MySQL Meme poveda %, e sbor zaner.sql je aksi dvkov sbor SQL prkazov. Hovorme mu aj SQL skript (z angl. script). No dobre, ale ako najjednoduchie tieto prkazy vykona % bez toho, aby sme ich pracne pre %ukvali zo sboru do klvesnice? No predsa jednoduchm spustenm tohto skriptu. N star znmy monitor MySQL m jeden parameter, ktor umo &uje vykona% sbor s SQL skriptom automaticky tak, ako keby boli jednotliv prkazy zadvan z klvesnice. Tento parameter sa nazva source (zdroj), a ozna uje sa aj skrtene \. (pozri help). Ak teda zadme: mysql> source zaner.sql; dostaneme poadovan vsledok. Vpis .6-14 ukazuje, e boli vykonan jednotliv prkazy zo sboru zaner.sql:

Ve$mi asto potrebujeme v databzach okrem textovch a selnch hodnt uchovva% aj daje o ase a dtume. Tieto zaznamenvaj rzne udalosti v konkrtnom okamihu. Asi najdleitejm dajom bva dtum. Ako prklad me posli% prklad, ke# sa v kadej kninici zaznamenva dtum zpoi ky a dtum vrtenia knh. Aj o kadom radnom kone sa zaznamenva dtum jeho vykonania. Preto si dnes povieme nie o o uchovvan dtumu a asu a ukeme si aj opercie s tmito dajmi. Vetko to, o sa tka dtumu a asu meme v MySQL rozdeli% do dvoch skupn: - dtumov a "asov typy - dtumov a "asov funkcie Najdleitejie dtov typy u poznme. S to bu # seln typy (napr. INT, ....), alebo textov typy (CHAR, VARCHAR, ...). Teraz k nim pridme dtumov a asov typy.

Dtumov a !asov typy


MySQL podporuje tieto asov a dtumov typy: TIME - uloenie asovch dajov DATE - uloenie dtumu DATETIME - zdruen daje dtumu a asu YEAR - uloenie roku TIMESTAMP - tzv. asov raztko Formt jednotlivch typov sa li, preto si teraz tieto typy preberieme:

DATETIME
Tento typ sa pouva, ke# potrebujeme hodnotu, ktor obsahuje obidve informcie - dtumov aj asov.

36

Formt: RRRR-MM-DD HH:MM:SS Podporovan rozsah: od 1000-01-01 00:00:00 do 9999-12-31 23:59:59 Vidme, e podporovan rozsah je ve $mi ve$k, ktor vyhovie aj ve$mi nro nm aplikcim.

DATE
Tento typ pouijeme, ke# potrebujeme iba dtumov informciu, bez asovej asti. Formt: RRRR-MM-DD Podporovan rozsah: od 1000-01-01 do 9999-12-31

TIMESTAMP
Tento typ je ve$mi zvltny. Pomenujeme si ho aj asov raztko. Skuto ne, ak mme v tabu$ke nadefinovan ur it st(pec typu TIMESTAMP, vdy a automaticky sa pri opercii INSERT alebo UPDATE na stanovenom riadku zrove& do tejto poloky ulo aktulny asov daj v stanovenom formte. Formt: RRRRMMDDHHMMSS Podporovan rozsah: od 19700101000000 do 20371231235959 Vimnime si podporovan rozsah. Za na po iatkom roku 1970 a kon poslednou sekundou v roku 2037. Ale, myslm, e aj tento rozsah posta uje naej prci. Tento typ me ma% aj zmenen rozsah. Sta , ak pri jeho definovan stanovme parametrom prslun ve$kos% zaznamenvanho po$a tak, ako je to v tab. .7-1: Parameter TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(10) TIMESTAMP(8) TIMESTAMP(6) TIMESTAMP(4) TIMESTAMP(2) Zobrazovan formt RRRRMMDDHHMMSS RRMMDDHHMMSS RRMMDDHHMM RRRRMMDD RRMMDD RRMM RR

Ak si pozorne prezrieme tto tabu $ku, zkladn formt sa neskracuje zprava, ale men sa formt zobrazovania roku zo tvorcifernho na dvojcifern. Treba pripomen %, e ak zadme typ TIMESTAMP bez parametra, defaultne (tandardne) sa uvauje pln 14-miestny formt. Poznmka: Aj ke# s DATE, DATETIME a TIMESTAMP ve$mi prbuzn, nemaj rovnak rozsah platnosti. Zatia$ o dtum 20-11-1963 me by % uloen v DATE alebo DATETIME, pre TIMESTAMP je neplatn a bude konvertovan na nuly. Ako by sme mohli tto zaujmav funkciu vyui%? To si ukeme niie.

TIME
Tento typ je zobrazovan vo formte HH:MM:SS, (alebo HHH:MM:SS pre rozren hodnotu) a me dosahova% rozsah hodnt od -838:59:59 do 838:59:59. Nie, nie je to preklep, v tomto type meme uklada % aj asov daj v ako 24 hodn, alebo dokonca me nadobda % zporn hodnoty. TIME hodnoty meme zadva% v tchto formtoch: a) ako re%azec v HH:MM:SS formte S mon aj prbuzn syntaxie, teda 10:24:56 je rovnak ako 10.24.56 b) ako re%azec bez dvojbodiek, teda vo formte HHMMSS Teda 101112 je chpan ako 10:11:12. Ale zpis 109745 je neplatn, lebo 97 mint neexistuje c) ako slo vo HHMMSS formte (teda bez apostrofov) /slom 101112 sa rozumie as 10:11:12 d) ako vsledok funkcie, ktor vrti hodnotu, akceptovate$n TIME kontextom, napr. Current_Time

37 Pre TIME hodnoty, prezentovan ako re %azec, nie je nutn pouva% dvoch cifier v prezentcii hodn, mint a seknd, ktor s menie ako slo 10. Teda zpis 8:3:2 je to ist ako 08:03:02. Pozor! Bu#me opatrn pri zadvan neplnch dajov! MySQL po ta slice zprava. Predpoklad, e dve prav slice reprezentuj sekundy. Take zpis 11:12, 1112 a 1112 (spome &me si, e v apostrofoch s re%azce strings, bez apostrofov sla - numeric) reprezentuje 00:11:12, teda 11 mint a 12 seknd, a nie 11 hodn a 12 mint! Jednoducho - 12 prezentuje 12 seknd. Ak by sme chceli zada% daj va ako povolen rozsah, napr. 850:00:00, bude aproximovan na maximlny rozsah, teda 838:59:59. Neplatn asov daje s konvertovan na 00:00:00, take je ve $mi %ak rozhodn%, i sa do programu uloil as polnoci, alebo niekto zadal zl asov daj, ktor bol na tento konvertovan.

YEAR
YEAR je jednobajtov typ, ktor reprezentuje roky. MySQL vracia a zobrazuje YEAR hodnoty vo formte YYYY. Rozsah je od 1901 2155. YEAR hodnoty meme zadva % v tchto formtoch: a) ako 4-miestny re%azec v rozsahu od 1901 do 2155 b) ako 4-miestne slo v rozsahu od 1901 do 2155 c) ako 2-miestny re%azec v rozsahu od 00 do 99. Hodnoty v rozsahu 00 a 69 s konvertovan na hodnoty od 2000 do 2069, hodnoty v rozsahu 70 a 99 s konvertovan na hodnoty od 1970 do 1999 d) ako 2-miestne slo v rozsahu 1 a 99. Hodnoty v rozsahu 1 a 69 s konvertovan na hodnoty od 2001 do 2069, hodnoty v rozsahu 70 a 99 s konvertovan na hodnoty od 1970 do 1999. Vimnume si, e v tomto prpade nememe zadefinova % ten magick rok 2000! Preto doporu ujem pouva% rok v re%azcovom formte. e) ako vsledok funkcie, ktor vracia hodnoty akceptovate$n v YEAR kontexte, napr. NOW(). Uvedomme si, e nekorektn hodnoty YEAR s konvertovan na hodnotu 0000 .

Dtumov a !asov funkcie


Zatia$ o dtumov a asov typy ur ovali truktru - formt, v akej s ukladan dan hodnoty, dtumov a asov funkcie vracaj prve tie hodnoty. Tak ako ozajstn funcie, aj tieto spravidla obsahuj parameter, na zklade ktorho vracaj poadovan hodnotu. Teraz si ukeme najdleitejie funkcie, ktor asi naj astejie pouijeme v naich projektoch. A ako vyzskame tieto hodnoty? No predsa pomocou nm u ve $mi znmeho prkazu SQL - SELECT. Nzvy jednotlivch funkci s odveden od ich innost v anglickom jazyku. Pre lepiu itate$nos% ich budeme uvdza% s ve$kmi prvmi psmenami. Zadva% ich vak meme rzne. Presn pouitie pri jednotlivch ukkach je zrejm z prslunch vpisov:

DayOfWeek(dtum)
Vracia index d&a v tdni v zadanom dtume. Index d &a je slen hodnota, kde 1 = Sunday, 2 = Monday, ...., 7 = Saturday. Na vpis .7-1 vidme, e 20.janura tohto roku bola naozaj sobota.

WeekDay(dtum)
Je ve$mi podobn ako DayOfWeek. Vracia index d&a v tdni, ale index nadobda tieto hodnoty: 0 = Monday, 1 = Tuesday, .... , 6 = Sunday. Vimnime si, e zatia $ o v prvom prpade sme dtum zadali ako re %azec (string), v tomto prpade sme pouili numerick zpis. To potvrdzuje vyie spomenut formty ukladania asovch a dtumovch typov.

38

DayOfMonth(dtum)
Ak chceme z dtumu vyselektova% slo d&a v danom mesiaci, pouijeme DayOfMonth, tak ako na vpise 7-3. Aj tu sme pouili jeden z monch variantov zpisu dtumu:

DayOfYear(dtum)
Ko$ke to bude de& od za iatku roku, ten 3.mj 2001? No predsa stodvadsiatytret, tak ako na vpise .7-4:

DayName(dtum)
Ak nm nevyhovuje, e funkcie DayOfWeek alebo WeekDay vracaj index d&a v tdni a my by sme radej prijali nzov d&a (bohuia$ len v angli tine), pouijeme funkciu DayName tak, ako na vpise .7-5:

MonthName(dtum)
Obdobnm spsobom meme zska % nzov mesiaca z dtumu. Pouijeme funkciu MonthName tak, ako na vpise .7-6:

Year(dtum)
Tak, ako sme selektovali den v mesiaci, je mon selektova% aj rok. Prklad je na vpise .7-7:

39

Vimnime si, e sme rok zadali len v dvojmiestnom tvare, ale SQL server ho reprezentuje v plnom tvormiestnom vpise. Pozor! Nem$me si meno funkcie z nzvom dtovho typu!

Hour( as)
Touto funkciou vyselektujeme hodinu zo zadanho asovho daju (vpis .7-8):

Minute( as)
Aj minty meme vyselektova% zo zadanho asu (vpis .7-9):

Vimnime si formt zadvania asu (vpis .7-10) ako aj v "#a$ch prkladoch:

Second( as)
Obdobne je to so sekundami, ale teraz zadme as ako slo (vpis .7-11):

Predstavme si, e nedopatrenm zadme nevhodn formt asu, napr. 12 hodn 25 mint a 79 seknd. /o sa stane? Odpove# je na vpise .7-12:

Je to przdna hodnota. (Pozor! Nie nulov!)

To_Days(dtum)
Tto funkcia vrti po et dn od roku 0 (nula). Prklad je na vpise .7-13:

40

no, je to presne 730870 dn od po iatku letopo tu.

From_Days(n)
Naopak, ak vieme, ko$ko dn od po iatku letopo tu to bolo a my chceme vedie % presn dtum, pouijeme tto funkciu tak, ako na vpise .7-14:

Nie, nepo tal som to, len som predchdzajci prklad zv il o jeden de&. A funguje to!

Date_Format(dtum, formt)
Niektor vyie spomenut selek n funkcie s integrovan v tejto ve$mi zaujmavej funkcii. Pomocou nej sme schopn vytvori% rozmanit vpisy. Tto funkcia obsahuje dva parametre: dtum a formt. Parameter formt ur uje, ako bude formulovan vsledn vpis. Prklady naj astejie pouvanch formtov s v Tab. .7-2:

Formt %M %W %Y %y %a %b %d %e %m %c %j %H %k %h %l %i %S %r %T

Popis meno mesiaca napr. January, ...December de* v tydni napr. Sunday ...Saturday rok, na 4 $slice rok, na 2 $slice skrten de* v tdni napr. Sun ...Sat skrten meno mesiaca napr. Jan...Dec de* v mesiaci, $selne 00...31 de* v mesiaci, $selne 0...31 mesiac, $selne 01...12 mesiac, $selne 1...12 de* v roku 001...366 hodiny 00...23 hodiny 0...23 hodiny 01...12 hodiny 1...12 minty 00...59 sekundy 00...59 $as 12-hodinov formt hh:mm:ss AM/PM $as 24-hodinov formt hh:mm:ss

Ak chceme zo zadanho dtumu a asu vyformtova% zpis, kde bude nzov d &a, nzov mesiaca a rok, pouijeme parametre %W, %M a %Y tak, ako na vpise .7-15:

41

Efektn, vak?!?

Time_Format( as, formt)


Toto je obdoba predchdzajcej funkcie, ale so zameranm na asov zloku. Preto meme pouva% len tie parametre, ktor sa tkaj asu. Ostatn bud poskytova% hodnotu NULL alebo 0 (nula).

CurDate(), Current_Date()
Tto funkcia bez parametrov vrti aktulny dtum v opera nom systme. Prklad je na vpise .7-16:

Ak by sme potrebovali dosta % vsledok v numerickom tvare, sta ak v prkaze SELECT pripo tame nulu, tak ako je to na vpise .7-17:

CurTime(), Current_Time()
Tto funkcia bez parametrov vrti aktulny as v opera nom systme. Prklad je na vpise .7-18:

Ak by sme potrebovali dosta % vsledok v numerickom tvare, sta ak v prkaze SELECT pripo tame nulu, tak ako je to na vpise .7-19:

Now(), SysDate(), Current_TimeStamp()


Tak tto funkciu mm najradej. Pouvam ju ve$mi asto. Pre o? Lebo spja obidve predchdzajce funkcie. Vpis .7-20 ukazuje, o je hodnotou tejto funkcie:

42 Aj tento vsledok meme pri tanm nuly previes% na numerick tvar (vpis .7-21):

Napadlo vs, ako by sa efektne dala tto fukcia vyui%? No predsa meme tto funkciu poui% ako parameter dtum alebo as vo vyie uvedench parametrickch funkcich! Takisto meme poui% vetky bezparametrick funkcie. Presved me sa jednm prkladom na vpise .7-22:

Jednoduch, nie? Tto funkciu asto vyuijeme pri zadvan asovho raztka, tak ako si ukeme neskr.

Sec_To_Time(sekundy)
Tto funkcia prevedie zadan po et seknd na as vo formte HH:MM:SS, tak ako na vpise .7-23:

Ak neverte, prepo tajte si to za domcu lohu.

Time_To_Sec( as)
Tto funkcia je opakom predchdzajcej. Zo zadanho asu vypo ta d(ku trvania v sekundch. Prklad je na vpise .7-24:

Aj v tomto prklade sme as nezadali ako re%azec, ale sme vyuili bezparametrov funkciu curtime() ako parameter parametrickej funkcie time_to_sec.

Pouitie
Vidme, e MySQL m mnoho funkci na prcu s asom a dtumom. Ich vyuitie je ve$mi irok. Asi najviac vyuijeme funkcie na zskanie tchto dajov v zkladnom formte. Ale ke# budeme potrebova % vypo ta% rozdiel asov alebo dtumov, pouijeme funkcie na prevod na po et dn, tie potom odpo tame a vsledok prevedieme sp% na konkrtny dtum. Cvi enie Aby sme si ujasnili, ako pracuj tieto funkcie pri vkladan do tabu$ky, vytvorme si cvi n tabu$ku s nzvom CASOMIERA s tmito st(pcami:

43

Poloka cas datum datcas rok razitko

Typ poloky TIME DATE DATETIME YEAR TIMESTAMP

Teraz vlome pomocou prkazu INSERT INTO postupne tieto hodnoty: mysql> insert into casomiera values (curtime(), curdate(), now(), year(now()), null); mysql> insert into casomiera values (,,,,); mysql> insert into casomiera values (null, null, null, null, null); mysql> insert into casomiera(cas) values (curtime()); Takto sme naplnili tabu$ku CASOMIERA, v ktorej s tyri zznamy. Teraz vykonme prkaz : mysql> select * from casomiera; a dostamene vsledok ako na vpise .7-25:

Pozrime sa bliie na jednotliv zznamy. Vieme, e jednotliv riadky tabu $ky CASOMIERA zodpovedaj postupnmu zadvaniu vyie uvedenho prkazu INSERT. Vimnime si tieto dleit skuto nosti: - Aj ke# sme v 1. riadku zadali hodnotu null pre poloku RAZITKO, predsa sa uloil aktulny dtum a as opera nho systmu. Ako keby SQL server oraztkoval (dtumom a asom) to, e vykonal tento prkaz. Porovnajme, e sa obsah st(pca RAZITKO zhoduje s dajmi v st(pcoch CAS, DATUM a DATCAS. - Ak sme prkazom INSERT vkladali do vetkch poloiek przdne re %azce (), SQL server zkonvertoval tieto poloky na sam nuly, vrtane asovho raztka TIMESTAMP. - Ak sme vloili hodnotu null ( o nie je nula, ani przdny retazec, ale aksi przdno), vetky poloky nadobudli hodnotu null, okrem asovho raztka. Takto zase server orazil vykonanie tohoto prkazu. - Nakoniec sme vloili iba hodnotu aktulneho asu systmu (curtime()) do poloky CAS. Ako vidme, tto sa zapsala, ostatn poloky nadobudli hodnotu null. A znova server orazil vykonanie tohoto prkazu. Je zrejm, e z dajov asovho raztka sme schopn vy ta%, kedy bol dan zznam uloen do tabu $ky. Pripomnam, e sa TIMESTAMP, teda raztko men nielen pri prkaze INSERT, ale aj pri prkaze UPDATE. Ostatn SQL prkazy nemaj na asov raztko iadny vplyv. Vyskajte! Tk, tmto sme prebrali najdleitejie SQL prkazy a parametre prkazu SELECT. Ich po et je podstatne rozsiahlej, ale pre nau prcu bude sta i% tento v et. Dnes sa mi nevyiel priestor, aby sme si ukzali jednu z najdleitejch innost SQL servera - spjanie tabuliek. Take nabudce.

44

Mal ve ke databzy /8.!as$


Predchdzajce asti sme sa pri vysvet$ovan prkazu SELECT zaoberali iba jednou tabu $kou. Toto sa vak v praxi pouva zriedka. Ve$mi asto sa vstupn zostavy skladaj zo spojenia dvoch alebo aj viacerch tabuliek. Spoji% tabu$ky potrebujeme vtedy, ak v jednej tabu$ke nie s vetky nami poadovan informcie. A tak sa dnes budeme venova% spojovaniu tabuliek, ktormu sa anglicky hovor JOIN.

Vytvorenie cvi!nch tabuliek


Aby sme si vysvetlili tto tmatiku, vytvorme si dve pomocn tabu$ky, na ktorch budeme spojovanie tabuliek cvi i%. Prv tabu$ka sa nazva CITATEL, v ktorej s uloen cvi n men jednotlivch itatelov a identifika n slo vypoi anej literatry. Druh tabu$ka nesie nzov LITERATURA a obsahuje identifika n slo a nzov literatry, ktor si mu jednotliv itatelia vypoi a%. Z minula vieme, e nie je ve$mi vhodn dva% do jednej tabu$ky meno itate$a a pln nzov knihy, ktor si poi al, napr. Hrbat, Teria relativity. Ve # kto by stle vypisoval cel nzvy u vetkch itate$ov, ke# je podstatne jednoduchie zapsa % iba identifika n slo prslunej literatry. (Pozn. Okrem toho by takto zostaven databza odporovala zsadm nvrhu pod $a tzv. normlnych foriem, o sme si ete nevysvet$ovali. Aj naa doteraz pouvan tabu $ka KNIHA iasto ne odporuje tmto princpom, a preto ju budeme neskr upravova %. Zatia$ ale na vysvetlenie zkladov SQL plne vyhovuje.) Tab. .8-1: CITATEL meno Novak Hrbaty Janik Bartak Horakova id_lit 1 2 NULL 4 1

Tab. .8-2: LITERATURA id_lit NULL 1 2 3 nazov Sipkova Ruzenka Amaterske radio Teoria relativity Cestovny poriadok ZSR

Vimnime si, e v prvej tabu$ke je pri mene Janik przdna hodnota (null). To znamen, e pn Jank nem v tomto okamiku vypoi an iadnu knihu. Podobne, v druhej tabu$ke je zaznamenan, e kniha o pkovej Ruenke nem ete pridelen vpoi kov slo, napr. z dvodu, e len teraz bola zakpen a nestihla jej vedca kninice priradi% prslun slo. My sme u dostato ne sksen databzisti, take tu teraz nebudem uvdza% dobre znmy postup, ako tieto tabu$ky vytvori%.

Typy spojen
Vzby medzi tabu$kami pouvaj rzne typy spojen. V ina z nich vychdza z normy SQL92, ale kad databzov stroj prina uvate$ovi niektor viac i menej prjemn zlepenia. Typy spojenia v SQL sa rozde$uj do dvoch hlavnch skupn: - vntorn spojenia - vonkajie spojenia

Vntorn spojenia
Trivilne spojenie (Trivial Join)

45 Tento typ spojenia sa tak trochu vymyk z rmca definci. Ale ke#e sa asto v literatre spomna, aj my si ho objasnme. Jedn sa o spojenie jednej tabu $ky so sama sebou. Take sa nejedn o ni in, ako jednoduch select danej tabu$ky, napr.: > select * from citatel;

Jednoduch spojenie cez jeden st &pec Pozrime sa znovu na tabu$ku CITATEL. Vidme, e je v nej uveden len aksi slo prslunej literatry, ktor si ten-ktor itate$ vypoi al. A ke#e z tejto tabu$ky nevieme, o ak literatru sa jedn, tak chceme, aby sa vypsal zoznam itate$ov a nzov literatry, ktor si poi ali. Tu u musme poui% informcie z oboch tabuliek: Pouijeme prkaz : > select * from citatel, literatura where citatel.id_lit = literatura.id_lit; ktor hovor, aby sa vypsali vetky st(pce z obidvoch tabuliek CITATEL aj LITERATURA, ktor spl&uj podmienku, e slo v st(pci id_lit v tabu$ke CITATEL sa zhoduje s slom id_lit v tabu$ke LITERATURA. Ak sa znova pozrieme do vyie uvedench tabuliek, vidme, e vpis . 8-2 je pravdiv, lebo sa obidva st (pce id_lit zhoduj:

/o je to za zvltny zpis citatel.id_lit ? Ak m st(pec niektorej tabu$ky rovnak nzov ako in st(pec v inej tabu$ke, musme pecifikova%, z ktorej tabu$ky uvaovan st(pec vlastne je. Na to sa pouva tzv. bodkov zpis (dobre znmy z objektovho programovania). Jeho obecn tvar je: nzov_tabu)ky.nzov_st&pca napr.: citatel.meno

V prpade, e by sme chceli spja % tabu$ky z rznych databz (no, aj to je niekedy iadce), pouijeme ete konkrtnej zpis: nzov_databze. nzov_tabu )ky.nzov_st&pca napr.: kniznica.citatel.meno

Ak vak pouvame tabu$ky len v rmci jednej databzy, vysta me s menej jednozna nm zpisom. Vyie spomenut vpis prkazu SELECT meme upravi% s pouitm slova JOIN takto:

46

>select meno, nazov from citatel JOIN literatura where citatel.id_lit = literatura.id_lit; /o tto veta znamen? Vo$ne by sme ju mohli preloi% asi takto: Vyp st(pce MENO a NAZOV z tabu$ky CITATEL spojenej z tabu$kou LITERATURA, kde slo v st(pci id_lit v tabu$ke CITATEL sa zhoduje s slom id_lit v tabu$ke LITERATURA. Na vpise .8-3 je nami poadovan informcia:

Z vyie uvedench prkladov je zrejm, e kontrukcie s JOIN alebo iarkou (,) s plne identick. Ur enie podmienky pre spojenie tabuliek Podmienka citatel.id_lit = literatura.id_lit zais%uje, e vo vsledku bude u kadho itate$a uveden iba ten riadok tabu$ky LITERATURA, ktor obsahuje nzov literatry s rovnakm slom, ako si vypoi al itate$. Keby sme tto podmienku neuviedli, vykonal by sa kartzsky s!in oboch tabuliek. To by znamenalo, e ku kadmu riadku tabu$ky CITATEL by sa vyh$adali vetky riadky tabu$ky LITERATURA. Vsledok takhoto dopytu bude ma% po et riadkov rovn po"tu "itate!ov krt po"et literatry (5x4=20): > select * from citatel join literatura;

Z vpisu .8-4 vidme, e nedva zmysel. Pn Novk si predsa poi al iba Amatrske rdio, ostatn literatru nechcel. Nadbyto n riadky meme njs% aj u ostatnch itate$ov. Sprvne s iba tie riadky, kde s v oboch selnch st(pcoch rovnak hodnoty, teda 6., 10., a 12. riadok vpisu. Preto zadvame pri spojovan tabuliek podmienku, ktor omedz riadky na tie, ktor chceme dosta % do vpisu. Zadvan podmienka nemus by% vdy na rovnos% st(pcov. /asto sa pouva podmienka prslunosti do ur itho intervalu.

47

Pouitie spojenia tabuliek bez podmienky kartzskeho s inu Existuj prpady, kedy chceme zmerne vyui% vlastnosti kartzskeho s inu - vytvorenie vetkch kombinci riadkov z oboch tabuliek (metda kad s kadm). Ako u vieme, v tomto prpade nebudeme zadva % iadnu podmienku pre spojenie oboch tabuliek.

Vonkajie spojenie
Doteraz sme pracovali s tzv.vntornm spojenm tabuliek, ktormu sa anglicky hovor INNER JOIN. Do vslednho vpisu boli zahrnut iba tie riadky z oboch tabuliek, pre ktor bola njden odpovedajca hodnota v druhej tabu$ke. Pozrime sa op % na vpis . 8-3. Vidme, e do vsledku neboli zahrnut t itatelia, ktor nemaj zadan slo literatry (Jank), alebo ich vypoi an literatra neexistuje (Bartk). Naviac vo vsledku nie je ani literatra, ktor si nikto nepoi al (Cestovn poriadok SR), alebo ete nema pridelen slo (pkov Ruenka). (POZOR! Podmienka citatel.id_lit = literatura.id_lit nie je splnen ani v prpade, kedy citatel.id_lit = NULL (Janik) a literatura.id_lit =NULL (Sipkova Ruzenka) v 3.riadku vpisu .8-4. Vsledkom porovnania je toti zase NULL, nie hodnota TRUE (no) potrebn pre potvrdenie podmienky rovnosti.) *av vonkajie spojenie Existuje spsob spojenia, ktor umo &uje zaradi% do vsledku aj tie riadky, pre ktor nebola njden odpovedajca hodnota v druhej tabu$ke. Takto meme vypsa% zoznam knh a im odpovedajcich itate$ov, v ktorom bude uveden aj literatra, ktor si nik nepoi al. Alebo naopak, vypeme zoznam vetkch itate$ov, ktor si nepoi ali iadnu literatru. Takmuto spojeniu sa hovor vonkajie spojenie. Tieto vonkajie spojenia mu by% dvojakho druhu - av (LEFT) a prav (RIGHT). MySQL server podporuje iba av vonkajie spojenie. (A my si ukeme, ako dosiahn% prav spojenie). ,av vonkajie spojenie vytvorme kontrukciou LEFT JOIN. Pouitm tohto spojenia dosiahneme vo vslednom vpise zahrnutie vetkch riadkov z $avej (teda z prvej) tabu$ky. Ak nebol njden odpovedajci riadok v pravej tabu$ke, bud vo vsledku hodnoty NULL vo vetkch st(pcoch pouitch z druhej tabu$ky. Pouit kontrukcia je zrejm z vpisu .8-5:

Vidme, e pni Jank a Bartak maj v pravom st(pci hodnotu NULL. Jank si ni nepoi al a Bartk m slo pi ky, ktor neexistuje. Pred chv$ou sme si povedali, e ak mme rovnak nzvy st(pcov v jednotlivch tabu$kch, pre jednozna nos% musme poui% bodkov zpis. V prpade $avho spojenia si vak zpis meme zjednodui% kontrukciou USING (meno_porovnvanho_st &pca) tak, ako je to na vpise .8-6:

48

LEFT OUTER JOIN Je ekvivalent prkazu LEFT JOIN. Pouva sa pre kompitibilitu s drivermi ODBC. Prav vonkajie spojenie Pouitm tohto spojenia dosiahneme vo vslednom vpise zahrnutie vetkch riadkov z pravej (teda z druhej) tabu$ky. Ak nebol njden odpovedajci riadok v $avej tabu$ke, bud vo vsledku hodnoty NULL vo vetkch st(pcoch pouitch z prvej tabu$ky. Ako vieme, MySQL nepodporuje prav spojenie. My ho vak vieme vytvori% z $avho spojenia jednoduchm prehodenm poradia spjanch tabuliek okolo prkazu LEFT JOIN. Pouit kontrukcia je zrejm z vpisu .8-7:

Tu vidme, e pkov Ruenka a Cestovn poriadok SR obsahuj v $avom st(pci, kde sa nachdza meno itate$a, hodnotu NULL, lebo t prv ete nem pridelen slo a cestovn poriadok si nik nepoi al. V praxi sa ve$mi asto pouva prve $av (LEFT JOIN) spojenie. Technick detaily spojovania tabuliek Spojovanie tabuliek je ve$mi asovo nro n innos%. Preto je ve$mi vhodn zamyslie% sa nad spsobom, ktorm s tabu$ky spojovan a nsledne sa poksi% vhodnm zadanm prkazu SELECT zrchli% jeho spracovanie. Pri spojovan tabuliek sa jedn obecne o kartzsky s in dvoch relci. Vsledn po et zznamov bude rs% exponencilne s po tom riadkov vo vstupujcich tabu$kch. Nam zkladnm cielom by preto malo by % o najviac omedzi% po et riadkov v tabu$kch ete pred vlastnm spojovanm. Napr. ak chceme zisti % informcie o kniniciach v Tren ianskom kraji, obmedzme najprv tabu $ku kninc iba na kninice v tomto regine a a potom vsledok budeme spojova% s tabu$kami knh, autorov a in. +alej je ve$mi dleit, aby sme vdy pouili obmedzenia pre spojovan st (pce (v JOIN alebo WHERE), a tm o najviac znili po et riadkov vo vslednom vpise. Na%astie, dnen databzov stroje maj zabudovan ve $mi rchle spojovacie mechanizmy, ktor mnoh optimalizcie vykonvaj automaticky bez nho zsahu. Nae spojenie Vr%me sa vak k naej databze KNIZNICA a tabu$km KNIHA a ZANER. Vieme, e tabu$ka KNIHA obsahuje st(pec CIS_ODD, ktorm sa odvolva na podobn st (pec v tabu$ke ZANER. Pouijeme u znmu kontrukciu LEFT JOIN USING.

49 Na vpise .8-8 vidme u podstatne prijate $nej vpis, ak sme pouvali v minulch astiach serilu. Na dnes by sta ilo, a nabudce sa za neme zaobera% jednou z najdleitejch innost SQL serveru - jeho administrciou.

50

Mal ve k databzy

9. as%

Dnes si spolu prejdeme skuto ne najdleitejiu vec v kadom SQL serveri, teda MySQL nevynmajc. S to prstupov prva. Prve tie robia SQL server tm spo $ahlivm systmom. Bez nich by iadny SQL systm ani nemal zmysel. Pevne verm, e to dnes spolu zvldneme. Poznmka k prci s touto lekciou: Nedajte sa odradi %, ak nie omu neporozumiete hne#. Preberte si jednotliv odstavce postupne a pomaly a snate si uvedomi% zkladn pojmy a vznamy. Pozor na to, kedy hovorme o tabu $ke USER, DB a HOST a kedy o poloke user, db a host v tchto tabu$kch. (Mj ve$k obdiv Montymu autorovi MySQL - je troi ku zakalen preto, e pod $a mjho nzoru nevhodne zvolil nzvy jednotlivch tabuliek a poloiek v nich. No uznajte, mysql je nzov SQL systm, ale aj databze grant tabuliek a zrove & nzov klienta, user je tabu$ka aj poloka v nej a pod.). Pre nzornos% budem nzvy tabuliek uvdza% VE,KMI a nzvy poloiek v jednotlivch tabu$kch malmi psmenami. Pri tan kapitol sa stle pozerajte do grant tabuliek, aby ste si uvedomili, o ktorej poloke alebo privilgiu je re . Na ksok papiera si zna te ceruzkou vzby medzi jednotlivmi tabu$kami a polokami. Aj ja som mal pri tdiu okolo seba sam tabu $ky a papiere s poznmkami a priznvam, dos % dlho som v tom leal. Vyskajte si vzorov prklady, nastavte prva, reloadnite tabu $ky a skajte sa potom konektova% na server. Dopredu si predstavte, ak vsledky by ste mali dosta % a potom ich skontrolujte so zskanmi. Ak shlasia, tak ste pokro ili, ak nie, vr%te sa na za iatok. Ska%, ska%, ska%. (A i u i% sa, u i% sa, u i% sa ?!?) Trocha terie Prstupov prva U sme si raz spomnali, e nie je iadce, aby v databzovom systme mohol robi % kad vetko. Pozrime sa na to op% z poh$adu naej imaginrnej kninice. Vieme, e napr. vedca kninice potrebuje do centrlnej databze pridva% novo zakpen knihy alebo rui% knihy u ve$mi opotrebovan. Z titulu funkcie to me urobi% ona a len ona. Zato ale referentka kninice, ktor vedie vpoi ku knh, potrebuje pridva% men novch zkaznkov, zaznamenva%, ak knihy m kto zapoi an a samozrejme aj po vrten knh ich odpisova % z evidencie. Naproti tomu oby ajn itate$ me len prezera %, ak knihy s v kninici k dostaniu a ktor s prve vo$n a kde sa nachdzaj. No, a aby sme to mali kompletn, pn riadite $ ten me samozrejme vetko. Teda skoro. Aby sme mohli v naom systme zadefinova% tieto pravidl, musme ich obecne definova % v akchsi tabu kch prstupovch prv. Tabu ky prstupovch prv Aj MySQL m tak tabu$ky prstupovch prv. Hovor sa im aj grant tabu ky grant tables . Nachdzaj sa v databze s nzvom mysql. Do tejto databze sa prepneme v monitore mysql prkazom use mysql (poui mysql databzu), a server hlkou Database changed (Databza zmenen) potvrd vykonan zmenu. Zadme prkaz show tables a uvidme 5 tabuliek s tmito nzvami: - USER - DB - HOST - TABLES_Priv - COLUMNS_Priv Prv tri tabu$ky USER, DB a HOST s zkladn, ostatn dve s doplnkov tabu$ky prv. Dnes sa budeme zaobera% iba zkladnou skupinou, ktor vo va ine projektov plne posta uje. Doplnkov tabu$ky si preberieme, ke# zvldneme zkladn tmatiku. Keby sme na kad tabu$ku pouili nm u znmy prkaz describe table, napr. describe USER, dostaneme popis jednotlivch tabuliek. Stru n preh$ad poloiek v jednotlivch databzach je v tab. .9-1:

Tab. .9 - 1: Tabu ka Autentifikcia

truktra tabuliek USER, DB a HOST USER Host User DB Host Db HOST Host Db

51

Password Databzov a Select_Priv tabu kov privilgi Insert_Priv Update_Priv Delete_Priv Create_Priv Drop_Priv Administrtorsk privilgi Reload_Priv Shutdown_Priv Process_Priv File_Priv Grant_Priv References_Priv Index_Priv Alter_Priv

User Select_Priv Insert_Priv Update_Priv Delete_Priv Create_Priv Drop_Priv Select_Priv Insert_Priv Update_Priv Delete_Priv Create_Priv Drop_Priv

Grant_Priv References_Priv Index_Priv Alter_Priv

Grant_Priv References_Priv Index_Priv Alter_Priv

Musm upozorni%, e kad verzia MySQL me ma % in truktru jednotlivch tabuliek. Preto je NUTN poui% prkaz describe, aby sme zistili poadovan poloky. Ja pouvam verziu 3.23-27-beta, a preto tieto prkazy bud it na tto verziu. V inch verzich rdu 3.22 sa po ty parametrov mu li% (a spravidla sa aj lia. A aby to nebolo ete vetko, tak sa verziu od verzie men aj poradie parametrov v asti privilgi.). V priebehu dnenej kapitoly a samozrejme vdy pri prci s prvami sa budeme do tchto tabuliek pozera % ve$mi, ve$mi asto. Preto je vhodn si ich uloi% niekde poruke. Autentifikcia U aj z inch bezpe nch systmov vieme, e sa kad uvate$ pri vstupe do systmu mus autentifikova%. To sa vykonva spravidla zadanm mena a hesla. Na zklade tejto autentifikcie sa kadmu prihlsenmu uvate$ovi pridelia prslun prstupov prva. Tu si musme uvedomi% jednu vec. Meno a heslo uvate$a v MySQL nie je toton s uvate$om v danom opera nom systme, pod ktorm SQL server be. Dokonca tento uvate $ vbec nemus by% v opera nom systme vbec definovan. Tto vhoda sa uplatn prve v tch systmoch, kde sa za kadho licencovanho uvate$a opera nho systmu tvrdo plat, napr. SCO Unix alebo Windows NT. To znamen, e aj ke# mme licenciu len na 15 uvate$ov SCO, v MySQL meme ma% nadefinovan stovky uvate$ov databzovej aplikcie. Men a hesl uvate$ov s uloen v tabu$ke USER v poloke user a password. Hesl sa neukladaj v otvorenom tvare, ale kryptovan funkciou password(). Pri autentifikcii sa zadan heslo zakryptuje a porovn s heslom v tabu$ke. Kad z grant tabuliek si meme rozdeli% na tri asti: Prv as% je autentifika n, kde sa definuje kto (user), pod akm heslom (password), zkadia $ (host) a kde (db) me prstpi% v SQL serveri. Druh as% tvoria privilgia k databzam a tabu $km, ktor ur uj, o me pripojen a u autentifikovan uvate$ vykonva% v danej databze a tabu $kch. Tretiu as% tvoria administrtorsk privilgi. Tieto ur uj, o me pripojen uvate $ kona% so samotnm SQL serverom. Vznam a popis jednotlivch privilgi je v tab. .9-2:

Tab. .9 - 2 : Privilgium: Select_Priv Insert_Priv Update_Priv Delete_Priv

Privilgi Umo!uje: prezeranie tabu ky vkladanie do tabu ky zmeny v tabu ke vyprzd*ovanie - mazenie v tabu ke

52

Create_Priv Drop_Priv Reload_Priv Shutdown_Priv Process_Priv File_Priv Grant_Priv References_Priv Index_Priv Alter_Priv

vytvorenie databz a tabuliek zmazanie databz a tabuliek znovuna$tanie grant tabuliek ukon$enie $innosti servera vpis procesov $tanie a zpis do sboru schopnos' odovzda' svoje prva inm nevyuit tvori' alebo maza' indexy meni' truktru tabuliek

Obsah poloiek V autentifika nej asti kadej tabu$ky sa mu nachdza% rzne znaky. V polokch user, host a db sa nachdza spravidla text, vyjadrujci konkrtnu hodnotu, napr: user = balu, db =kniznica a host=server.niekde.sk , o zna , e uivate$ s menom balu zo servera server.niekde.sk sa me pripoji % do databze kninica. Heslo je tie typu char, avak je kryptovan funkciou password a pri benom selekte sa jav ako skupina hexadecimlnych siel. Okrem benho textovho re%azca sa v tchto polokch mu nachdza% ete pecilne znaky, o si povieme neskr. Pozor! Hodnoty v polokch user, password, db s case sensitive, teda rozliuj ve$k a mal psmen. Hodnoty v poloke host s case insensitive, teda nerozliuj ve$kos% psmen. Toto bva astou chybou, kedy si uvate$ mysl, e zadal vetko sprvne, ale aj tak sa nepripojil. A ono to bolo prve v malch a ve$kch psmench. V privilega nej asti sa pouvaj iba dva znaky Y a N ako yes a no, teda i m konkrtny uvate$ dan privilgium alebo nie. Prstup na server Prstup na SQL server a k jednotlivm databzam prebieha v dvoch krokoch: - verifikcia spojenia - verifikcia poiadaviek Verifikcia spojenia Verifikcia overenie spojenia vychdza z kontroly identity uvate$a. Identita uvate$a je definovan v tchto informcich v tabu$ke USER: - nzov po ta a, z ktorho uvate$ pristupuje poloka host - meno a heslo uvate$a poloky user a password

Pri pokuse o spojenie server najprv vykon overenie totonosti v tchto polokch. Ak shlasia, spojenie sa vykon, ak nie, spojenie sa odoprie. Jednotliv poloky tabu$ky USER mu nadobda% tieto hodnoty: host poloka: - Host hodnota me by% meno alebo IP adresa po ta a - klienta, z ktorho sa uskuto &uje spojenie. Tie to me by% re%azec localhost, ktor indikuje loklny miestny po ta . Localhost je tak host, kde na danom opera nom systme pracuje SQL server aj klient zrove&. - meme poui% aj tzv. olky (a to znak % - percento a _ podtrtko) a przdny znak . V tomto prpade hodnota % znamen $ubovo$n po %a - klient. Przdny znak, teda przdne pol ko st(pca host, je ekvivalent %. Uvedomme si, o toto znamen: Kad klient - po ta me vykona% spojenie na n server! user poloka: - olky nememe poui% v poloke user, pretoe % zna uvate$a s menom % - meme poui% przdny znak, o indikuje !ubovo!n (kad) uvate!.

53 Hovor sa mu aj anonymn uvate) (anonymous). To znamen, e meme zada % $ubovo$n meno. V praxi nie je vhodn definova% anonymnho uvate$a, a ak no, tak len s ve$mi obmedzenmi prvami. Svis to s bezpe nostnou politikou, ktor si teraz nebudeme prebera %. password poloka: - heslo me by% kryptovan alebo przdne. Przdne heslo neznamen, e je mon zada % $ubovo$n heslo, ale zna , e uvate$ sa konektuje bez zadania hesla. Tabu$ka .9-3 obsahuje prklady niektorch kombinci hodnt host a user tabu$ky USER: Tab. .9 -3: Prklady poloiek host a user Poloka host "doma.niekde.sk" "doma.niekde.sk" "%" "%" "%.niekde.sk" "192.168.10.153" "192.168.10.%" user "mior" "" "mior" "" "mior" "mior" "mior" Popis uvate mior z po$ta$a doma.niekde.sk ubovo n uvate z po$ta$a doma.niekde.sk uvate mior z ubovo nho po$ta$a ubovo n uvate z ubovo nho po$ta$a uvate mior z ubovo nho po$ta$a v domne niekde.sk uvate mior z po$ta$a s IP adresou 192.168.10.153 uvate mior z ubovo nho po$ta$a v podsieti 192.168.10.xx

Ako to funguje? MySQL server si pre ta tabu$ky prstupovch prv vtedy, ke# tartuje. Preto je potrebn pri kadej zmene tchto tabuliek vykona% ich nov na tanie. Nemusme preto server zastavova% a znova tartova%, sta , ak vykonme tzv. reload grant tabuliek. To meme vykona% priamo z mysql monitora prkazom: mysql> flush privileges; alebo v opera nom systme zadanm prkazu: mysqladmin reload Pozor! Na vykonanie takejto opercie musme ma % dovolen privilgium reload_priv. Zatia$ predpokladajme, e sme uvate$ root, ktormu je vetko dovolen. Ke# sa pozrieme do tab. . 9 4, vidme, e pn riadite $ sa me pripja % k MySQL serveru z troch pozci bu # zo svojho po ta a v kancelrii alebo z loklnej konzoly servera alebo z $ubovo$nho po ta a v sieti. Ale ktor prva teda bude ma %? Tab. .9 - 4: Prstup uvate a riaditel References_Pr iv Index_Priv N N N Y N N N Y Shutdown_Pri v Process_Priv

Update_Priv

Reload_Priv

Create_Priv

Delete_Priv

Insert_Priv

Grant_Priv

Drop_Priv

"%" "%" "pracovna" "localhost"

" riaditel " "" "riaditel" "riaditel"

Y Y Y Y

Select_Priv

host

user

Y N Y Y

N N Y Y

N N Y Y

N N Y Y

N N Y Y

N N N Y

N N N Y

N N N Y

N N N Y

N N N Y

N N N Y

Alter_Priv

File_Priv

54

SQL server pri tarte alebo reloade (znovuna tan tabuliek prv) nielen e tabu$ky na ta, ale si ich aj vntorne striedi od najkonkrtnejieho k najveobecnejiemu zpisu pod$a tohto princpu: - ako prv usporiada zznamy, kde host neobsahuje olky - nasleduj zznamy v poloke host , kde sv texte olky, napr. %.niekde.sk - na konci s zznamy s % alebo przdne zznamy. (U vieme, e przdny zznam je identick s %). - ak s zznamy v host identick, poloka user s konkrtnym menom m prednos% pred przdnou polokou Take tabu$ku .9-4 server usporiada tak, ako je to v tabu$ke .9-5: Tab. .9 - 5: Prstup uvate a riaditel potrieden References_Pr iv Index_Priv Y N N N Y N N N Shutdown_Pri v Process_Priv

Update_Priv

Reload_Priv

Create_Priv

Delete_Priv

Insert_Priv

Grant_Priv

Drop_Priv

"localhost" "pracovna" "%" "%"

"riaditel" "riaditel" "riaditel" ""

Y Y Y Y

Select_Priv

host

user

Y Y Y N

Y Y N N

Y Y N N

Y Y N N

Y Y N N

Y N N N

Y N N N

Y N N N

Y N N N

Y N N N

Y N N N

Server potom ta od vrcholu tabu$ky, a ke# naraz na identitu, ktor patr danmu uvate$ovi, prirad mu aj zodpovedajce prva, definovan pri tejto identite. Ostatn identity toho istho uvate $a, ktor s v tabu$ke definovan niie, u ignoruje. Take, poh$adom do tab. .9-5 vidme, e pn riadite $, ak bude pracova % na loklnej konzole potamo klvesnici po ta a, kde be MySQL server aj klient, bude ma % vetky prva (1.riadok tab. .9-5), ale ak bude pracova % za svojm po ta om v kancelrii, bud u jeho prva iasto ne obmedzen (2.riadok tab. .9-5). Ke# si vak sadne za po ta v itrni kninice, bude si mc% iba jednotliv tabu$ky prezera% (Select_priv = Y) a vklada % do nich prslun zznamy (Insert_priv = Y), ale veci spojen s administrciou tabuliek u neme vykona% (3.riadok tab. .9-5). Ak si za tento po ta sadne $ubovo$n itate$ kninice, zad svoje meno, ktor nie je definovan v tabu$ke alebo ho vbec nevypln (teda User = ), je povaovan za anonymnho uvate$a a bude mc% zznamy iba prezera % (4.riadok tab. .9-5). Verifikcia poiadaviek Ak je u raz spojenie etablovan, pristpi server k verifikcii poiadaviek. Teda over, i na t operciu, ktor sa uvate$ zrovna chyst vykona%, m privilgium. Napr., ak chce uvate$ selektova% nejak tabu$ku, server najprv skontroluje, i m tento uvate$ nastaven privilgium Select_priv. Toto privilgium me by% nastaven v niektorej z tabuliek USER, DB alebo HOST. Pri verifikcii poiadaviek server prezer nastaven privilgia na tomto princpe: Ve$mi zle na porad tabuliek. SQL server filtruje tabu$ky v tomto porad: - USER tabu$ku - DB tabu$ku - HOST tabu$ku Teda ako prv sa server pozrie na privilgi do grant tabu $ky USER. USER tabu$ka prisudzuje privilgi v globlnom mertku na cel SQL server. Napr. ak m ur it uvate$ nastaven privilgium Delete_priv (teda Delete_priv =Y) v tejto grant tabu$ke, me maza% zznamy vo vetkch databzach na MySQL serveri! Inmi slovami privilgi v USER tabu$ke s superuvate)sk privilgi. Preto tieto privilgi pride $ujme len superuvate$om, ako je serverov alebo databzov administrtor. Takmu superuvate $ovi sa v MySQL hovor root. Samozrejme, ten me tieto prva prenies % aj na inho dveryhodnho uvate$a, ktor ho bude v neprtomnosti zastupova%. Avak nemusia to by% pln prva, to vak svis s u spomnanou bezpe nostnou

Alter_Priv

File_Priv

55 politikou. (Tak teda len na okraj: kad dobr projekt mus ma % vypracovan bezpe nostn politiku. T definuje, kto, o, kedy, ako, skadia$, pre o ..., a samozrejme aj spsob archivcie dt, obnovu dt po krachu servera, ako aj ochranu proti hackerom a in. /ert NIKDY nesp! Ale o tom mono inokedy. ) Ostatnm uvate$om nechme v tabu$ke USER nenastaven globlne privilgi (teda N) a na definovanie ich loklnych prstupovch prv k jednotlivm databzam a tabu $km pouijeme tabu$ky DB a HOST. Tabu ky DB a HOST Tabu$ky DB a HOST poskytuj privilgi pecifick ku konkrtnym databzam. Hodnoty v jednotlivch autentifika nch poliach mu by% pecifikovan takto: - olky (% a _) mu by% definovan v host a db poliach obidvoch tabuliek - % v poloke host v tabu$ke DB znamen $ubovo$n klientsk po ta - przdny znak v poloke host v tabu$ke DB, (teda je przdna), znamen : Pozri sa do tabu $ky HOST pre #a$ie informcie. - % alebo przdny znak v poloke host v tabu$ke HOST znamen $ubovo$n klientsk po ta - % alebo przdny znak v poloke db v obidvoch tabu$kch DB a HOST znamen $ubovo$n databza. - przdny znak v poloke user v obidvoch tabu$kch zna anonymnho uvate$a Obidve tabu$ky DB aj HOST s tan a trieden vtedy, ke# server tartuje, teda v ten ist as, ke# USER tabu$ka. DB tabu$ka je trieden pod $a host, db a user poloiek, HOST tabu$ka je trieden pod $a host a db poloiek. Tak ako USER tabu$ka, aj tieto s trieden princpom od najkonkrtnejieho po najobecnej zznam. Samozrejme, plat prv njden a zodpovedajci trieden zznam. Pre administratvne poiadavky (shutdown, reload a pod.) SQL server skontroluje len tabu $ku USER, pretoe sa inde tieto privilgi nenachdzaj. Napr. ak uvate$ chce vykona% prkaz mysqladmin shutdown, ale v USER tabu$ke nem nastaven Shutdown_priv, prkaz sa odoprie. Ak sa poaduj opercie s databzou alebo tabu $kou (select, insert, update a pod.), server najprv pozrie do tabu$ky USER na globlne superuvate$sk prva. Ak privilgium v USER tabu$ke umo&uje poadovan operciu, tak sa prstup zabezpe . Ak s privilgia v USER tabu$ke nedostato n, server sa pozrie do tabuliek DB a prpadne HOST, kde sa pod $a nastavench loklnych prv rozhodne o umonen alebo zamietnut prstupu. Najprv sa pozrie do tabu $ky DB a rozhoduje sa takto: - pozrie na poloky host, db a user. Poloka db obsahuje nzov databze, kde chce uvate $ pristpi%. Ak nie je iadny zodpovedajci zznam v poloke host a user alebo db, prstup sa odmietne. - ak existuje zodpovedajci zznam v poloke user (teda meno uvate$a plat) a host nie je przdny, ale konkrtny a sprvny, tak sa priznaj stanoven loklne privilgi. - ak existuje zodpovedajci zznam v poloke user a poloka host je przdna, server sa pozrie do tabu $ky HOST a preh$ad tam poloky host a db v tejto tabu$ke. Ak v nich nie s zodpovedajce zznamy, prstup sa odmietne. Ak sa tu nachdzaj zodpovedajce zznamy, privilgi sa po taj v intersekcii s privilgiami v DB a HOST tabu$ke. Teda obidve privilgi musia by% Y. Zloit, vak. A na o je to dobr? My toti meme priradi % veobecn loklne (pozor! nie administrtorsk!!!) privilgi v DB tabu$ke a potom ich obmedzova % pre jednotlivch klientov v tabu$ke HOST. Vyjadren logicky, uvate$ov privilgi s kalkulovan takto: privilgi v USER tabu$ke ALEBO privilgi v DB tabu$ke A ZROVE% privilgi v HOST tabu$ke, alebo matematicky USER OR (DB AND HOST). Po zmene nastaven nesmieme zabudn% tabu$ky reloadn%.

A trocha prkladov
Nastal as, aby sme si vyie uveden teriu objasnili v praxi. A ako sa vlastne s grant tabu$kami narba? No predsa presne tak, ako s $ubovo$nou tabu$kou , teda pouijeme nm dobre znme prkazy select, insert, update, delete a in. Tak ideme na to!

56 Za neme tm, e si vyprzdnime vetky grant tabu$ky v databze mysql. Uvate$ root je od intalcie MySQL nastaven ako superuser, teda m vetky globlne prva na vetky databzy a ich tabu $ky. Ak sme si v prvch lekcich zmenili jeho heslo, spustme mysql monitor s parametrom mysql, aby sme sa vnorili do databze mysql takto: mysql u root p heslo_pre_roota mysql alebo ak nemme nadefinovan heslo pre roota, tak iba: mysql u root mysql Sme pripojen na server a sme nastaven v databze mysql. Teraz vyprzdnime tabu$ku USER prkazom: mysql> delete from USER; Potom vlome prvho uvate$a root s prslunm heslom a vetkmi globlnymi prvami: mysql> insert into USER values(localhost,root,password(heslo), Y,Y,Y, Y,Y,Y, Y,Y,Y, Y,Y,Y, Y,Y); Za heslo si doplnme kad to svoje heslo! Skontrolujeme pomocou: mysql> select * from USER; i s prva nastaven tak, ako sme chceli. Podobne vymaeme tabu$ky DB, HOST a aj zatia$ nepreberan tabu$ky TABLES_Priv a COLUMNS_Priv (to aby ns nemlili). Ke# sme tak u inili, zadme: mysql> flush privileges; m znova na tame grant tabu$ky. Ukon me mysql monitor prkazom exit alebo quit a poksime sa znova konektova% na server. Sksime to najprv bez mena alebo s pouitm inho, $ubovo$nho mena, napr. monty: mysql (bez parametrov) alebo mysql u monty Server sa pozrie do tabu $ky USER, a ke#e tam nie je definovan monty ani in anonymous , prstup odoprie pozri obr. .9-1:

Teraz zadme sprvne parametre, ie: mysql u root p stanoven_heslo a sme tam (obr. .9-2):

57

Nastavme sa do databze mysql pouitm mysql> use mysql; (Mohli sme to urobi% aj ako parameter prkazu mysql priamo na prkazovom riadku opera nho systmu, teda mysql u root pstanoven_heslo mysql ). Vlome novch uvate$ov takto: mysql> insert into USER values(localhost,riaditel,password(direktor), N,N,N, N,N,N, N,N,N, N,N,N, N,N); Ke#e vieme, e v privilgich s defaultne nastaven hodnoty N, nemusme zadva% vetkch trns% N, ale sta , ak zpis zjednodume mysql> insert into USER (host, user, password) values(localhost,riaditel,password(direktor);
[ (Kto m monos% prce na sieti, me si sksi% pripojenie z rznych po ta ov, len si zmen meno po ta a v poloke host pod$a potreby: mysql> insert into USER values(pracovna,riaditel,password(direktor), N,N,N, N,N,N, N,N,N, N,N,N, N,N); mysql> insert into USER values(citaren,riaditel,password(direktor), N,N,N, N,N,N, N,N,N, N,N,N, N,N);

Takto sme definovali pna riadite$a, ktor me pristpi % k SQL serveru z troch rznych po ta ov, tak ako sme si to prezentovali v teoretickej asti. Vimnime si, e aj ke# to je pn riadite $, neudelili sme mu globlne, teda superusersk prva. Avak jeho najvyie postavenie v kninici budeme definova % prve v tabu$ke DB. V ina ale nem monos% prce na sieti, teda my budeme pokra ova% skanm na lokle. ]

Vlome #a$ch troch uvate$ov, veduca, referent a anonymous : mysql> insert into USER values(localhost,veduca,password(sefka), N,N,N, N,N,N, N,N,N, N,N,N, N,N); mysql> insert into USER values(localhost,referent,password(pracant), N,N,N, N,N,N, N,N,N, N,N,N, N,N);

mysql> insert into USER values(localhost,,), N,N,N, N,N,N, N,N,N, N,N,N, N,N); Ani tmto dmam a knihomo$ovi - anonymousovi sme nepridelili superusersk prva. Vykonme flush privileges a ukon me mysql monitor. Znova vyskame spojenie k SQL serveru, trebrs ako pn riadite $ takto:

58

mysql u riaditel pdirektor /o sa stane? Server skontroluje, i v tabu$ke USER existuje uvate$ riaditel s heslom direktor. Ke#e no, spojenie uskuto n. Ale: Sksme teraz meni% nejak databzu, napr.: mysql> use mysql; a vidme, e server odmietol tto poiadavku, tak ako je to vidie % na vpise .9-3:

A je to sprvne, pretoe pn riadite $ nem iadne globlne ani loklne prva, teda zatia $. Vyskajme zmeni% aj in databzy, napr. kniznica. Vsledok je rovnak. Podobn vsledky dostaneme, ak sa bude konektova % uvate$ veduca , referent i citatel. No, globlne prva sme zakzali, ale teraz musme nastavi % loklne prva. Ako sme si v terii povedali, loklne prva nastavujeme v datbze DB a HOST. Znovu sa pripojme k databzi mysql ako root prkazom: mysql u root pstanoven_heslo a prkazom : mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, riaditel, Y,Y,Y, Y,Y,Y, Y,Y,Y,Y); definujeme, e pn riadite$ me z loklneho po ta a pristupova% k databazi kniznica a m pln (loklne) databzov privilgi. Znova fluneme privilgi a ukon me mysql monitor. Optovne sa pripojme k serveru, teraz ako uvate$ riaditel. Ide to. Sksime poui% databzu, napr. mysql. Server odmietne a my u vieme, pre o. Ale teraz pouijeme databzu kniznica. /o sa stane? Server skontroluje identitu v tabu$ke USER. Zist, e pripojovan uvate$ je definovan, meno a heslo je platn. Ke#e nem stanoven iadne globlne privilgi, nazrie do databze DB, i tam nie je uvate$ s menom riaditel definovan pre databzu kniznica. Zist, e no a e sa me pripojova % z loklu. Vzh$adom k tomu, e aj toto je splnen, server umon uvate $ovi pracova% v tejto databze s definovanmi loklnymi privilgiami. Riadite$ovi boli definovan pln loklne prva k databzi KNIZNICA (a ku vetkm tabu$km v nej). Take server prkaz use kniznica vykon. Vyskame $ubovo$n prkaz v tejto databzi, napr. mysql> select * from zaner; a dostaneme o akvan vsledok, ktor je vidie% na obr. .9-4:

59

Presved me sa, e uvate$ riaditel me vykonva% ten SQL prkaz, ktor je definovan v privilgich, me teda vytvra% a maza% tabu$ky, nap(&a% alebo vyprzd &ova% a pod. Vyskajme! Obdobnm spsobom zadefinujeme aj pani vedcu, sle nu referentku a itate$a. Ale kadmu nastavme in prva, tak ako s definovan v tab. .9-6: Tab. .9 - 6: Prstup ostatnch uvate ov References_Pr iv Index_Priv N N N N N N Shutdown_Pri v Process_Priv

Update_Priv

Reload_Priv

Create_Priv

Delete_Priv

Insert_Priv

Grant_Priv

Drop_Priv

"localhost" "veduca" Y "localhost" "referent" Y "localhost" "" Y

Select_Priv

host

user

Y Y N

Y N N

Y N N

N N N

N N N

N N N

N N N

N N N

N N N

N N N

N N N

Zase sa konektneme ako root (lebo len root me pridva% uvate$ov!) a zadme: mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, veduca, Y,Y,Y, Y,N,N, N,N,N,N); mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, referent, Y,Y,N, N,N,N, N,N,N,N); mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, , Y,N,N, N,N,N, N,N,N,N);

Alter_Priv

File_Priv

60 U azda nemusm pripomna% potrebu fluu. Na skuku sa pripojme ako anonymous. Ako? No predsa prkazom bez parametrov. Taktie si meme zvoli % $ubovo$n meno, napr. mysql -u billy Po konektovan pouijeme databzu kniznica. Ke#e aj anonymous je definovan v tabu$ke DB, zmenu databze umon. Zadme prkaz select, a aj ten sa vykon. Ale teraz sksime prida% zznam do tabu$ky ZANER. /o sa stane? V tabu$ke DB je pri userovi (anonymous) prvo na zpis do tabu $ky (Insert_Priv=N) zakzan! Take server tto poiadavku odmietne, o potvrdzuje aj obr. .9-5:

Podobne si meme overi % prva uvate$ov veduca a referent. Ich monosti s prene definovan v tab. .9-6. Kontrola privilgi Ako jednoducho overi%, kto m ak privilgi? No administrtori pod Linuxom dostali do vienka ve $mi uito n utilitku - mysqlaccess. Je to perlovsk skript a bohuia $, neexistuje na platforme WinXX. Silu tohoto skriptu si ukeme inokedy. Tajomstvo Tk, kone ne sme sa prehrzli skuto ne naj%aou as%ou administrcie MySQL serveru. Bez plnho pochopenia innosti grant tabuliek sa ned serizne pokra ova% v tvorbe aplikci, postavench na SQL serveri. Po dlhch hodinch, o sme si skali rzne varianty prv, prezradm sladk tajomstvo - d sa to aj jednoduchie! A to pomocou SQL prkazu GRANT a REVOKE. Ale aby sme ich mohli skuto ne efektvne pouva%, musme dokonale porozumie % innosti grant tabuliek. No a to v#aka dnenej kapitole u vieme! Nabudce si ukeme prkazy GRANT a REVOKE. Tm administrtorsk as% serilu skon a pustme sa do omnoho prjemnejej innosti - tvorbe aplikci. Krsnych, oknoidnch, nad ktormi aj srdce oby ajnho uvate$a zaples rados %ou. No, ve# skste donti% vau tovn ku pracova% v prkazovom riadku! Aprop, o vm hovoria pojmy Apache, PHP, ODBC?

61

Mal ve k databzy /10.!as$


V minulej asti sme si vysvetlili, ako sa definuj globlne a loklne prstupov prva. S$bil som, e si dnes ukeme omnoho jednoduch a efektvnej spsob. Asi sa teraz ptate, pre o som vm to neukzal hne#, ale som vs nechal trpi% sa s nejakmi grant tabu$kami. No, aby sme rozumeli, o vlastne konme, bola prepotrebn predchdzajca teria. A bez nej by sme neboli schopn analyzova %, o ktor uvate$ me alebo nie. (A takto analza sa rob v$mi asto! Ve# uvidte!) Ostatn dvody akosi vyznej v dnenej asti.

Trocha terie
Vieme, e ak chceme definova% globlne prva k celmu SQL serveru, upravujeme tabu$ku USER. Ak definujeme loklne prva k niektorej databze, upravujeme tabu $ku DB (my dokeme dokonca definova % prva k jednotlivej tabu$ke alebo st(pcu tabu$ky, vtedy upravujeme tabu$ky Tables_Priv a Columns_Priv. Ako sme si vak povedali, toto si vysvetlme inokedy, zatia$ sta ten zklad - tabu$ky USER, DB a HOST). Ak chceme definova% prva ete podrobnejie, upravujeme aj tabu $ku HOST. Po potrebnej prave musme grant tabu$ky reflun%. Od verzie 3.23.xx je mon na definciu prstupovch prv poui % prkazy GRANT a REVOKE. Tieto obdobnm spsobom upravia grant tabu$ky v databze mysql, ako sme to my robili ru ne v predchdzajcej asti serilu. GRANT Prkaz GRANT umo&uje pridvanie novch uvate$ov a definovanie prstupovch prv novch uvate$ov alebo u existujcich uvate$ov. Syntaktick zpis prkazu GRANT je takto: GRANT privilgi ON !o TO uvate IDENTIFIED BY heslo [WITH GRANT OPTION] Pozrime sa na jednotliv parametre prkazu: Privilgi Tu definujeme privilgi, ktor chceme danmu uvate$ovi prideli%. Me to by% len jedno privilgium, alebo dve - tri a viac alebo vetky privilgi. Jednotliv privilgi odde $ujeme iarkou. V tabu$ke . 10-1 s popsan jednotliv privilgi a ich vznam, o umo&uj. Isto sa vm budu zda% mnoh z nich ve$mi podobn privilgim, ktor s definovan v grant tabu$kch. Tab. . 10-1: Defincie privilgi v prkazoch GRANT a REVOKE Privilgium ALTER CREATE DELETE DROP INDEX INSERT REFERENCES SELECT UPDATE FILE PROCESS RELOAD SHUTDOWN ALL USAGE Umo(uje Pozmenenie tabu$ky alebo indexy Vytvorenie databzy alebo tabu $ky Vymazanie existujceho zznamu z tabu$ky Odstrnenie databzy alebo tabu $ky Vytvorenie alebo zmazanie indexu Vloenie novho zznamu do tabu$ky nepouit Vybratie existujcich zznamov z tabu$ky pravu existujcich zznamov /tanie a zpis sborov na server Prezretie informci o serveri Znovuna tanie grant tabuliek a cache tabuliek Zastavenie servera Vetky prva Iba definova% uvate$a bez prv

Vidme, e prv skupina parametrov sli k manipulcii s databzami a tabu $kami. Druh skupina je skupina administrtorskch prv k SQL serveru. Trietia skupina je pecifick - ALL znamen vetky vyie popisovan prva a USAGE sli na vytvorenie novho uvate$a bez vetkch prv.

62

!o definuje, k omu bud stanoven privilgi definovan, teda ku ktorej databze alebo tabu $ke k nej. V tomto prpade sa vyuva nm u znmy bodkov zpis - databza.tabu !ka. Napr.: kniznica.kniha zna , e konkrtne privilgi bud nastaven k tabu$ke kniha v databze kniznica. Existuj aj pecifick olkov zpisy: - *.* - zna vetky tabu$ky vetkch databz, teda vade - globlne privilgi - kniznica.* - zna vetky tabu$ky v databze kniznica. uvate zna , ktormu uvate$ovi bud konkrtne privilgi nastaven. Jednotliv uvate$ sa definuje menom a klientom, z ktorho sa me konektova% na server. Takto teda meme definova % uvate$a pod rovnakm menom pristupujceho z rznych po ta ov. Zpis je ve$mi podobn emailovej adrese typu meno@nzov_po "ta"a, napr.: - mior@localhost zna uvate$a mior pristupujceho z loklnej konzoly - mior@192.168.10.152 zna uvate$a mior z IP adresy 192.168.10.152 - mior@doma zna uvate$a mior z po ta a z nzvom doma. Ak zadme iba meno, ale nedefinujeme klienta, z ktorho sa me hlsi%, znamen to, ako keby sme definovali % - teda $ubovo$n klient, napr. : - mior - mior@ - mior@% Ak by MySQL server protestoval, vlome meno aj klienta do vodzoviek alebo apostrofov, kadho zvl %, napr. mior@doma. Ak nezadme meno, ale len klienta, napr. @localhost, zna to, e definujeme $ubovo$nho uvate$a znmeho ako anonymous .

heslo je heslo, ktorm sa bude dan uvate$ autentifikova%. Heslo uvdzame vdy v vodovkch alebo v apostrofoch. WITH GRANT OPTION Tento volite$n parameter znamen, e takto definovan uvate$ me svoje stanoven prva ku konkrtnej databze alebo tabu $ke prenies% na inho uvate$a. Ke#e je tto vlastnos% pomerne nebezpe n, pouvajme ju len v najnutnech prpadoch. Ako by sme si teda predstavili vyie uveden zpis? Zvo$me si prklad: GRANT SELECT, INSERT ON kniznica.zaner TO mior@doma IDENTIFIED BY newpass Sksme si to preloi% ako: Pride$ prva na selekt a vkladanie k tabu$ke ZANER v databze KNIZNICA pre uvate$a mior z klientskho po ta a s nzvom doma, ktor sa bude autorizova % nielen svojim menom mior ale aj heslom newpass. Zloit? Ale ani nie. Ak nie je ete uvate$ mior z klientskho po ta a doma definovan v grant tabu$kch, tak sa automaticky vytvor. V prpade, e u existuje, tak sa iba vykonaj prslun zmeny privilgi. V takom prpade u nie je potrebn definova% heslo, a tak cel sekciu IDENTIFIED BY vynechme. Samozrejme, predtm definovan heslo sa zachovva. Ak chceme prida% uvate$a, ale mu nechceme (zatia$) definova% iadne prva, pouijeme privilgium USAGE takto:

63

GRANT USAGE ON *.* to citatel IDENTIFIED BY heshes Poznmka: Na rozdiel od ru nej manipulcie s grant tabu$kami NIE JE POTREBN tabu$ky refluova%! Toto zabezpe prkaz GRAND (aj REVOKE) sm. REVOKE Ak chceme nejakmu uvate$ovi niektor (alebo aj vetky) privilgi odobra %, pouijeme prkaz REVOKE. Jeho syntaktick zpis je: REVOKE privilgi ON o FROM uvate) Zpis je ve$mi podobn prkazu GRANT, akurt sa privilgi nepridvaj k niekomu (TO), ale odoberaj od niekoho (FROM). Prkaz REVOKE nie je schopn uvate$a z grant tabu$ky vymaza%, iba mu vie odobra % prva. Preto ak chceme niektorho uvate$a z grant tabuliek vymaza%, musme poui% klasick spsob, napr.: mysql> DELETE from USER where user = meno_uzivatela AND host = meno_pocitaca; mysql> FLUSH PRIVILEGES; Tento prkaz je nm u dobre znmy a tak si ho nebudeme vysvet $ova%. V tomto prpade vak nesmieme zabudn% grant tabu$ky reflun%! Vysvetlili sme si zkladn teriu, ale po#me si to teraz ukza% na prkladoch!

Trochu praxe
Aby sme si mohli precvi i% prkazy GRANT a REVOKE, nadefinujeme si #a$ch inovnkov v naej imaginrnej kninici. Bud to akoby dvoji ky k u definovanm uvate$om, ktorm budeme definova% rovnak prva ako ich vzorom. Ve # zastupite$nos% alebo duplicita je stle aktulna v ttnej sprve. Rovnak prva nadefinujeme preto, aby sme si mohli poh $adom do grant tabuliek porovna %, e definovanie prv pomocou GRANT/REVOKE je identick s klasickm zadvanm. (Teda skoro, o tom niie). Take pn riadite$ bude ma% svojho nmestnka (kto nevie, o to znamen, nech sa spta svojich rodi ov), pani vedcu bude zastupova% pani tovate$ka a sle nu referentku star pani kuchrka. A itate$ov bude zastupova% pn Karafit. A do kninice sa prihlsil aj mladk menom Chytr, ale ete nezaplatil lensk. Aha, ete nm tu chba jeden ve$mi dleit lovek. Bude to administrtor, pomenujme si ho admin. A prisdime mu najvyie sprvcovsk prva. To preto, aby aj root mohol s % spokojne na dovolenku... Aby sme mohli overi% ich prva, budeme predpoklada %, e vetci pracuj na lokle. Spome&me si, ak prstupov prva maj nadefinovan pn riadite $, pani vedca, sle na referentka a $ubovo$n itate$. Teraz prkazom GRANT vytvorme pna administrtora ako aj jednotlivch zstupcov a zrove & im priradme zodpovedajce privilgi. Vieme, e administrtor admin s heslom super dostane superuvate$sk, teda globlne prva. Preto ich definujeme ako *.*. Potom prkaz GRANT vyzer takto: mysql> GRANT ALL ON *.* TO admin@localhost IDENTIFIED BY super; /o vlastne tento prkaz vykon? Popme si ho manulnym klasickm spsobom. mysql> insert into USER (host, user, password, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,admin,password(super), Y,Y,Y, Y,Y,Y, Y,Y,Y, Y,Y,Y, Y,Y); A aby sa aktivovali zmeny, musme zada%:

64

mysql> Flush Privileges; Teraz zadefinujeme pna nmestnka, ktor sa bude hlsi% heslom zastup. Tento vak u nem globlne prva, ale len loklne prva ku vetkm tabu$km v databze KNIZNICA: mysql> GRANT ALL ON kniznica.* TO namestnik@localhost IDENTIFIED BY zastup; Ako by sme to urobili ru ne, keby neexistoval prkaz GRANT? Naprv by sme ho mali zadefinova% v tabu$ke USER, ale nepridelili by sme mu iadne globlne prva: mysql> insert into USER (host, user, password, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,namestnik,password(zastup), N,N,N, N,N,N, N,N,N, N,N,N, N,N); Teraz v zmysle minulej asti by sme museli definova% loklne prva , a to v tabu$ke DB: mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, riaditel, Y,Y,Y, Y,Y,Y, Y,Y,Y,Y); Nesmieme zabudn% na: mysql> Flush Privileges; Vidme, ko$ko prce nm uetr prkaz GRANT! Podobnm spsobom definujeme pani tovate$ku ucto s heslom financ: mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON kniznica.* TO ucto@localhost IDENTIFIED BY financ; a ve$mi obdobne by to v manulnom zadvan vyzeralo takto: mysql> insert into USER (host, user, password, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,ucto,password(financ), N,N,N, N,N,N, N,N,N, N,N,N, N,N); mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, ucto, Y,Y,Y, Y,N,N, N,N,N,N); mysql> Flush Privileges;

Teraz vytvorme pani kuchrku, ktor si zvolila priliehav heslo varecha: mysql> GRANT SELECT, INSERT ON kniznica.* TO kucharka@localhost IDENTIFIED BY 'varecha';

Teraz u tute, e tento prkaz v skuto nosti vykon tto trojicu prkazov:

65

mysql> insert into USER (host, user, password, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kuchrka,password(varecha), N,N,N, N,N,N, N,N,N, N,N,N, N,N); mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, kucharka, Y,Y,N, N,N,N, N,N,N,N); mysql> Flush Privileges; Nesmieme zabudn% na pna Karafita s heslom klincek, ktor me, tak ako anonymous iba prezera % zznamy (select): mysql> GRANT SELECT ON kniznica.* TO karafiat@localhost IDENTIFIED BY 'klincek';

A o sa v skuto nosti vykon? No predsa: mysql> insert into USER (host, user, password, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,karafiat,password(klincek), N,N,N, N,N,N, N,N,N, N,N,N, N,N); mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, karafiat, Y,N,N, N,N,N, N,N,N,N); mysql> Flush Privileges; A nakoniec definujeme mladka Chytrho. Ke#e ani po opakovanej vzve nezaplatil lensk prspevky, nepridelme mu zatia$ iadne privilgium a ani heslo:

mysql> GRANT USAGE ON kniznica.* TO chytry@localhost; Aj u neho by to bolo ru ne pracn: mysql> insert into USER (host, user, password, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, Reload_priv, shutdown_priv, process_priv, file_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,chytry,password(), N,N,N, N,N,N, N,N,N, N,N,N, N,N); mysql> insert into DB (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) VALUES (localhost,kniznica, chytry, N,N,N, N,N,N, N,N,N,N); mysql> Flush Privileges; (Asi vs napadne jedna vec: Ak prde pn Chytr a prihlsi sa ako chytry, nebude mc% vykona% ni , okrem spojenia. Ale ke#e je chytr, prihlsi sa ako anonymous , teda vymysl si $ubovo$n meno, ktor v kninici

66 definovan nie je, bude mc% aspo& selektova% ! Tu vidme zdrny prklad bezpe nostnej diery! Alebo s to tzv. zadn dvierka ?). Porovnanie Teraz si porovnme pridelen globlne prstupov prva, ktor sme pridelili prkazom GRANT s tmi, ktor sme pridelili klasickm spsobom v minulej asti. Na obr. .10-1 je vpis tabu$ky USER. (Tabu$ky s opticky upraven, aby neboli ve$mi rozsiahle. Jednotliv st(pce zodpovedaj konkrtnym prvam):

Porovnajme vytvoren dvojice: - riaditel - namestnik - veduca - ucto - referent - kucharka - (anonymous) - karafiat V tomto prpade vidme, e nemaj pridelen iadne globlne prva. Pozrime sa teraz na dvojicu root - admin . Obidvaja maj nastaven globlne prva. S skoro rovnak, a na jedno prvo - Grant_Privileges. Root ho m povolen, admin nie. To preto, e pri jeho defincii sme nepouili parameter WITH GRANT OPTION. V takom prpade admin neme odovzda % svoje prva niekomu inmu. Ako sa vlastne odovzdvaj tak prva? No predsa tak, e ten, kto m tto monos % povolen, pouije prkaz GRANT. Tak prenesie prva na in osobu. Mu to by % vetky, alebo len niektor prva. Ako vidme, pn Chtr nem pru. A ani on nem pridelen iadne globlne prva. Na obr. .10-2 je vpis tabu$ky DB, kde s definovan loklne prva:

Porovnajme nae dvojice:

67

Vidme, e riaditel a namestnik maj rovnak prva a na Grant_Privileges. To preto, lebo sme ani v tomto prpade nepouili parameter WITH GRANT OPRION. Veduca a ucto maj tie rovnak prva a plne zodpovedaj nam poiadavkm. Tak isto aj referent a kucharka alebo anonymous a karafiat. Len pn chytry nem povolen iadne prvo, pokm nezaplat lensk poplatok. V tejto tabu$ke nie je ani zmienka o rootovi a adminovi. My u vieme, pre o je to tak. Ak m niekto definovan globlne prva (v tabu$ke USER), u nepotrebuje loklne prva (v tabu$ke DB). Globlne prva s nadraden loklnym prvam. Ak sme dvali pozor, vimli sme si, e prkazy GRANT a REVOKE neovplyv&uj tabu$ku HOST, ktor sli na jemnejie definovanie prstupovch prv. Preto ak potrebujeme takto lenenie, musme poui% klasick definovanie prv v tejto tabu$ke. Avak v mnohch prpadoch si vysta me s vyie pouitmi postupmi. Za domcu lohu si vyskajte konektnutie ako jednotliv pracovnci kninice a skajte, o vetko je vm v databze kninica dovolen. Tm by sme prv diel serilu doviedli do konca. Nabudce sa za neme venova% trochu efektvnejej prci tvorbe klientskho, uvate$sky prjemnejieho prostredia.

Miroslav Oravec

You might also like