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 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ů.

Obr. 1: Spolupráce aplikace se SŘBD
Spolupráce aplikace se SŘBD

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 test
Nyní si pomocí příkazu help můžeme prohlédnout příkazy, které máme k dispozici (viz obr. 2).

Obr. 2: Prostředí řádkového klienta MySQL
Prostředí řádkového klienta MySQL

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.

Tab. 1: Vybrané datové typy MySQL
TypPopis
intcelé číslo
floatčíslo s pohyblivou řádovou čárkou
varchar(n)textový řetězec o maximální délce n
datedatum 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ý -- dobrá motivace pro vytvoření snadno ovladatelného WWW rozhraní k tabulce.

Obr. 3: Vytvoření tabulky a přidání záznamu
Vytvoření tabulky a přidání záznamu

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 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ů.

© Jiří Kosek 1999