Jak pracujφ databßze na Webu
Lehk² ·vod do SQL
Ji°φ Kosek ml.
V minulΘm dφle jsme se seznßmili se zp∙sobem, jak²m se do databßzφ uklßdajφ ·daje ve form∞ tabulek. Dnes si ukß₧eme, jak m∙₧eme s tabulkami a s ·daji v nich obsa₧en²mi manipulovat.
Vφme, ₧e p°φstup k ·daj∙m ulo₧en²m v databßzi obstarßvß S╪BD. Aby mohly b²t ·daje z databßze p°φstupnΘ ostatnφm aplikacφm, musφ S╪BD nabφzet rozhranφ, pomocφ kterΘho s nφm mohou spolupracovat ostatnφ programy.
Zp∙sob komunikace se S╪BD je velice obdobn² komunikaci s webov²m serverem. Dnes je S╪BD nejΦast∞ji nep°etr₧it∞ spuÜt∞n jako dΘmon (na Unixu) nebo jako slu₧ba (ve Windows NT) a na urΦitΘm socketu oΦekßvß po₧adavky klient∙ (ostatnφch aplikacφ). Na tyto po₧adavky pak odpovφdß. Vidφme tedy, ₧e i zde funguje osv∞dΦen² model klient/server. V roli serveru je nynφ S╪BD a n∞kdy se mu proto takΘ °φkß databßzov² server.
Pro zßpis po₧adavk∙ na databßzov² server se nejΦast∞ji pou₧φvß jazyk SQL (Structured Query Language). Tento jazyk proÜel dlouh²m v²vojem a v r∙znΘ mφ°e jej dnes podporujφ tΘm∞° vÜechny b∞₧n∞ pou₧φvanΘ databßzovΘ servery. N∞kdy se proto databßzov²m server∙m °φkß zjednoduÜen∞ SQL servery. Jazyk SQL nabφzφ vÜe pot°ebnΘ pro vytvß°enφ, modifikovßnφ a ruÜenφ tabulek a pro prßci s ·daji v tabulce -- vyhledßvßnφ, p°idßvßnφ, modifikovßnφ a mazßnφ ·daj∙.
Jak to vÜe souvisφ s naÜφ tvorbou webov²ch aplikacφ? V roli klienta pro SQL server m∙₧e samoz°ejm∞ vystupovat i skript zapsan² v PHP Φi ASP. To znamenß, ₧e naÜe skripty mohou obsahovat p°φkazy zapsanΘ v jazyce SQL a zpracovßvat jejich v²sledky po provedenφ na SQL serveru. Nic ji₧ tedy nebrßnφ tomu, aby byl p°es Web zp°φstupn∞n obsah n∞jakΘ databßze.
V praxi je vÜe samoz°ejm∞ o n∞co slo₧it∞jÜφ. Ka₧d² SQL server mß sv∙j vlastnφ protokol, kter²m s nφm m∙₧e klient komunikovat. Pokud mß klient um∞t komunikovat s vφce r∙zn²mi servery, musφ podporovat vφce protokol∙. To nenφ zrovna nejÜ¥astn∞jÜφ °eÜenφ a proto na platform∞ Windows vzniklo rozhranφ ODBC. To slou₧φ jako prost°ednφk mezi klientskou aplikacφ a databßzov²m serverem. Rozhranφ ODBC se volß jednotn∞ a ODBC ovladaΦ pak po₧adavek p°edß databßzovΘmu serveru pomocφ sprßvnΘho protokolu.
V PHP i ASP m∙₧e k p°ipojenφ k SQL serveru pou₧φvat rozhranφ ODBC. PHP navφc nabφzφ pro n∞kterΘ servery p°φmou podporu -- p°φstup k dat∙m je pak obvykle rychlejÜφ. Mezi p°φmo podporovanΘ databßze pat°φ mimo jinΘ Oracle, Sybase, Solid, MySQL a PostgreSQL.
Pracujeme s MySQL
Zanechme vÜak teoretick²ch ·vah a pus¥me se do jazyka SQL.
Abychom si mohli SQL vyzkouÜet, budeme pot°ebovat n∞jak² SQL server. To m∙₧e b²t trochu problΘm, proto₧e cena komerΦnφch server∙ je dnes p°φmo astronomickß. My proto sßhneme po serveru MySQL, jeho₧ unixovß verze je k dispozici zdarma a verze pro Windows za cenu, kterß je v porovnßnφ s komerΦnφmi servery sm∞Ünß. Domovskou strßnku MySQL naleznete na adrese http://www.tcx.se/. Pro stahovßnφ programu vÜak pou₧ijte zrcadlo umφst∞nΘ v ╚echßch na adrese http://mirror.opf.slu.cz/mysql/.
Po nainstalovßnφ MySQL musφme spustit jeho serverovou Φßst pomocφ p°φkazu mysqld. V Unixu a Windows NT se nßm asi vyplatφ spustit MySQL jako dΘmona/slu₧bu. Nynφ se ji₧ m∙₧eme k serveru p°ipojit pomocφ jednoduchΘho °ßdkovΘho klienta mysql (ve Windows verzi nalezneme spustitelnΘ soubory v adresß°i \mysql\bin). Jako parametr je nutno uvΘst jmΘno databßze, ke kterΘ se chceme p°ipojit. P°i instalaci se standardn∞ vytvo°φ databßze test, do kterΘ majφ vÜichni u₧ivatelΘ p°φstup -- v²born∞ se tedy hodφ pro naÜe ·Φely seznamovßnφ s jazykem SQL. MySQL spustφme pomocφ p°φkazu:
mysql test
Nynφ si pomocφ p°φkazu help m∙₧eme prohlΘdnout p°φkazy, kterΘ mßme k dispozici (viz obr. 2).
Pro nßs je d∙le₧it² p°φkaz quit, kter²m ukonΦφme prßci s klientem. Krom∞ zobrazen²ch p°φkaz∙ m∙₧eme zadat libovoln² p°φkaz v jazyce SQL. Poj∩me se s nimi tedy postupn∞ seznßmit.
Vytvo°enφ tabulky
K vytvo°enφ novΘ tabulky v databßzi slou₧φ SQL p°φkaz CREATE TABLE. Jeho syntaxe je nßsledujφcφ:
CREATE TABLE jmΘno_tabulky (jmΘno_polo₧ky typ_polo₧ky, ... )
P°ehled nejpou₧φvan∞jÜφch datov²ch typ∙ si m∙₧eme prohlΘdnout v tabulce 1.
Typ | Popis |
int | celΘ Φφslo |
float | Φφslo s pohyblivou °ßdovou Φßrkou |
varchar(n) | textov² °et∞zec o maximßlnφ dΘlce n |
date | datum ve tvaru RRRR-MM-DD |
time | Φas ve tvaru HH:MM:SS |
Pro vytvo°enφ tabulky Zam∞stnanci z p°edchozφho dφlu serißlu m∙₧eme pou₧φt nßsledujφcφ SQL p°φkaz:
CREATE TABLE Zamestnanci (
OsobniCislo int NOT NULL,
Jmeno varchar(40),
RC varchar(11),
Adresa varchar(60),
Plat float,
PRIMARY KEY (OsobniCislo)
);
Nßzvy vÜech tabulek a polo₧ek je lepÜφ zadßvat bez diakritick²ch znamΘnek, proto₧e ne vÜechny servery si zde s ΦeÜtinou poradφ. Za definicφ typu osobnφho Φφsla musφme uvΘst direktivu NOT NULL, kterß °φkß, ₧e atribut nem∙₧e obsahovat prßzdnou hodnotu. Tato podmφnka musφ platit pro vÜechny primßrnφ klφΦe. P°edposlednφ °ßdka p°φkazu definuje atribut OsobniCislo jako primßrnφ klφΦ tabulky.
P°i zadßvßnφ p°φkaz∙ v programu mysql nesmφme zapomenout za ka₧d²m p°φkazem zadat st°ednφk. P°φkaz je odeslßn na server a₧ po zadßnφ st°ednφku a nßslednΘm stisknutφ klßvesy Enter.
P°idßnφ novΘho zßznamu
P°φmo z prost°edφ mysql m∙₧eme do tabulky p°idßvat i novΘ zßznamy. K p°idßnφ novΘho zßznamu do tabulky s N atributy slou₧φ v SQL p°φkaz INSERT INTO:
INSERT INTO jmΘno_tabulky
VALUES (hodnota1, ..., hodnotaN)
My do tabulky p°idßme informace o panu Novßkovi:
INSERT INTO Zamestnanci VALUES (
1023, 'Novßk Jan', '561220/0235',
'Levß 13, Praha 4', 12000);
TextovΘ °et∞zce musφme uzavφrat do apostrof∙ nebo do uvozovek. Na obrßzku 3 si m∙₧eme prohlΘdnout, jak na p°idßnφ zßznamu zareaguje mysql. Dozvφme se, ₧e dotaz byl v po°ßdku, ovlivnil jednu °ßdku a provedl se za 8 setin sekundy.
Obdobn²m zp∙sobem m∙₧eme p°idat i dalÜφ zßznamy. Vidφme, ₧e tento zp∙sob nenφ zrovna dvakrßt u₧ivatelsky p°φjemn² -- co₧ je dobrß motivace pro vytvo°enφ snadno ovladatelnΘho webovΘho rozhranφ k tabulce.
V²b∞r a prohlφ₧enφ zßznam∙
K v²b∞ru a vypsßnφ zßznam∙ z tabulky slou₧φ p°φkaz SELECT. Pokud chceme vypsat obsah celΘ tabulky, zadßme p°φkaz:
SELECT * FROM jmΘno_tabulky
Obsah naÜφ tabulky si tedy m∙₧eme ov∞°it pomocφ:
SELECT * FROM Zamestnanci;
Na obrßzku 3 vidφme, ₧e obsah tabulky je ·hledn∞ zformßtovßn a navφc se dozvφme, kolik zßznam∙ dotazu vyhovuje.
Informace lze vybφrat i selektivn∞. Podmφnka, kterß musφ pro vybranΘ zßznamy platit, se uvßdφ za klφΦovΘ slovo WHERE. P°φklady selektivnφch dotaz∙:
SELECT * FROM Zamestnanci
WHERE Jmeno LIKE 'Novßk Jan';
Vybere vÜechny zam∞stnance, jejich₧ jmΘno je 'Novßk Jan'.
SELECT * FROM Zamestnanci
WHERE Jmeno LIKE 'Nov%';
Znak '%' mß ve vyhledßvacφm °et∞zci za operßtorem LIKE specißlnφ v²znam -- nahrazuje libovolnou sekvenci znak∙. Dotaz tedy vybere vÜechny zam∞stnance, jejich₧ jmΘno zaΦφnß na Nov.
SELECT * FROM Zamestnanci
WHERE OsobniCislo = 1230;
Vybere zam∞stnance s osobnφm Φφslem 1230. A koneΦn∞
SELECT * FROM Zamestnanci
WHERE Plat > 10000;
vybere vÜechny, jejich₧ plat p°evyÜuje 10 000 KΦ.
V podmφnkßch m∙₧eme pou₧φvat i logickΘ spojky AND a OR. Pokud nßs zajφmajφ vÜichni Novßci, jejich₧ plat je menÜφ ne₧ 6 000 KΦ, m∙₧eme pou₧φt dotaz:
SELECT * FROM Zamestnanci
WHERE Jmeno LIKE 'Novßk %'
AND
Plat < 6000;
Za p°φkazem SELECT nemusφme uvßd∞t jen hv∞zdiΦku. Mφsto nφ m∙₧eme pou₧φt seznam atribut∙, kterΘ chceme mφt ve v²sledku zobrazeny. Hv∞zdiΦka mß specißlnφ v²znam a zastupuje vÜechny atributy.
Zajφmajφ-li nßs jmΘna a platy zam∞stnanc∙, kte°φ majφ plat v∞tÜφ ne₧ 15 000 KΦ, m∙₧eme pou₧φt nßsledujφcφ dotaz:
SELECT Jmeno, Plat
FROM Zamestnanci
WHERE Plat > 15000
P°φÜt∞ se podφvßme na dalÜφ SQL p°φkazy, kterΘ nßm umo₧≥ujφ mazßnφ a modifikaci zßznam∙ v tabulce. Pak si ji₧ koneΦn∞ ukß₧eme, jak zaΦlenit SQL p°φkazy do naÜich skript∙.