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 WWW-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 a 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ém 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 mimo jiné patří Oracle, Sybase, Solid, MySQL a PostgreSQL.
Zanechme však teoretických úvah a pusťme se do seznamování s jazykem 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 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 testNyní 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.
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.
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ý -- dobrá motivace pro vytvoření snadno ovladatelného WWW rozhraní k tabulce.
SELECT
.
Pokud chceme vypsat obsah celé tabulky, zadáme příkaz:
SELECT * FROM jméno_tabulkyObsah 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 10000 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ž 6000 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ž 15000 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ů.