Hlavní navigace

SQL ve vztahu klient - server

10. 3. 2000
Doba čtení: 6 minut

Sdílet

Databáze standardu SQL jsou založeny na komunikaci server-klient. Jako server vystupuje počítač (místní či vzdálený), na němž je spuštěna služba naslouchající na portu určeném konfigurací. Je připraven naslouchat a dávat odpovědi na smysluplné dotazy. Klient je většinou www server, který se ptá. Ale pokud databázi upravujete, používáte klienta jiného.

Ještě než začnu s popisem klientů, bylo by vhodné zmínit letmo strukturu SQL serveru. Ta je postavena na databázích. Databází může na serveru být hodně, záleží jen na jeho výkonu. Databáze se skládá z tabulek. Počet tabulek v databázi není omezen, každá tabulka má unikátní jméno. A tabulka se jak už víme skládá z řádků a sloupců. Převedeno do náhledu z pohledu souborů to zní asi takto (pro MySQL): Na serveru v jistém adresáři (třeba /usr/local/var) je několik podadresářů, které se jmenují jako jednotlivé databáze. V těchto podadresářích jsou soubory jednotlivých tabulek. Je jich více, pokud si je prohlédnete pomocí midnight commanderu, moudří z toho nebudete.

Klienta můžete používat buďto přímo z balíku serveru (například u MySQL serveru lze zkompilovat jen klienta či jen server), nebo klienta třetí strany. Klienti od serverů jsou jednoduché, většinou se obsluhují na příkazové řádce pomocí jazyka DDL (zkratka pro Data Definition Languague). Mají tu výhodu, že jste nuceni znát příkazy, které pak použijete spolu se spojením s nějakým skriptovacím jazykem (PHP, ASPI, CGI) při tvorbě stránek.

Klienti třetích stran jsou většinou grafické, používají X-Windows spolu s nějakým z toolkitů (Qt, Gtk, …). Na toolkitu GNOME je založen Gnome Transcript (gtranscript, poslední verze je 0.1.5). Jeho vlastnosti jsou poněkud omezené, neumí serveru posílat dotazy, pouze umožňuje vytvářet tabulky, editovat a mazat je. Do styku s DDL přijdete jen při zakládáni tabulky, a to ještě omezeně při volbě typu proměnné a její nulovosti a unikátnosti.

Druhý mnou používaný klient je postaven na toolkitu Gtk, čímž je ovlivněn jeho vzhled. Jmenuje se myGDE a jeho poslední verze má (zatím) číslo 0.1. Nižší číslo ovšem neznamená horší vlastnosti, ba dokonce si troufám tvrdit že je propracovanější než Gnome Transcript. Nemá sice ovládání pomocí ikonek, to bych od klienta k SQL serveru nepožadoval. Umí vytvářet tabulky, rozšiřovat je, dělat z nich výběry a hlavně, umožňuje pracovat se všemi databázemi na serveru pokud do nich máte přístup. Výhodou je že myGDE nabízí „interaktivní tvorbu SQL příkazů“. Základní menu je tvořené šesti tlačítky (Connect, Status, Query Gen, Table Gen, Quick Select a Quit). Hlavní okno programu sestává ze třech sloupců. V prvním je seznam všech databází, ve druhém seznam všech tabulek ve vybrané databázi a ve třetím popis tabulky z hlediska typu proměnných a podmínek na ně kladené.
Okno Query Generatoru se otevře po stisku tlačítka Query Gen. Je koncipováno stejně jako okno hlavního programu. Nabízí volbu příkazu, tabulky, sloupce, podmínky a operátorů.

MyGDE

Základy jazyka DDL

Dotazy na SQL server jsou tvořeny pomocí jazyka DDL. Pro angličtináře zajisté nebude problém si ho osvojit. I formulace dotazů je velmi podobná anglickému slovosledu. Nejdůležitějšími příkazy jsou CREATE, SELECT a ALTER.

Každý příkaz se v SQL ukončuje pomocí středníku. Pokud tak neučiníte klient bude po Enteru čekat na další data, teprve po vložení středníku příkaz provede. Tímto se také dostáváme k typům proměnných, jež lze v jednotlivých sloupcích používat. Jejich názvy jsou standardizovány a jsou podobné typům z jiných jazyků (třeba C, C++). Mezi základní patří INT, FLOAT, DATE, TIME, CHAR a TEXT. INT a FLOAT jsou číselné proměnné, CHAR a TEXT znakové. Existují ještě jisté odnože těchto proměnných, ale o nich se vždy zmíníme až u konkrétního příkladu.

Vytvořme nyní tabulku, která bude obsahovat naše kontakty na spolupracovníky, jejich adresy a telefonní čísla. Tabulka bude mít sloupce prijmeni, jmeno, titul, firma, telefon_pevna, telefon_mobil a email. Celkem tedy 7 sloupců.

CREATE TABLE kontakty (prijmeni char(30), jmeno char(30), titul char(30), firma char(60), telefon_pevna char(30), telefon_mobil char(30), email char(40));

Všechny proměnné jsou typu CHAR. To proto, že i v telefoních číslech se může vyskytnout závorka, lomítko nebo pomlčka či dokonce znak. Znáte přece reklamu „0800–1POMOC“, ne? Každému číslu na mobilu odpovídají 3 písmena. Btw: nebylo by fajn mít číslo třeba „0603THALEZU“ ? Tak daleko ale naštěstí ještě nejsme. Existuje variace proměnné CHAR, má název VARCHAR a liší se v tom, že natvrdo nealokuje celých 30 znaků v případě příjmení, ale jen tolik, kolik je potřeba, avšak maximálně právě těch 30.

Tabulku máme připravenou, můžeme začít vkládat údaje. K tomu slouží příkaz INSERT.

INSERT INTO kontakty VALUES („Vonásek“, „Josef“, „ing.“, „První tunelářská a.s.“, „0202–88889999“, „0607–895656“,„vona­sek@tunel.cz“);

INSERT INTO znamená VLOŽ DO, VALUES jsou HODNOTY. Znakové proměnné musíme uzavírat do uvozovek, a to jak dvojitých tak jednoduchých. Druhá možnost se používá při psaní třeba PHP skriptů. Důsledek je stejný. Nyní přidejme ještě několik osob:

INSERT INTO kontakty VALUES (‚Kachličková‘, ‚Alžběta‘, ‚MuDr.‘, '', ‚02–895588‘, ‚0607–777888‘, ‚kachlicka@dok­tori.cz‘);

Pokud nechceme uvést nějaký údaj, můžeme napsat v případě znakové proměnné dvoje uvozovky, nebo NULL pro všechny typy proměnných. NULL znamená neurčeno, nedefinováno. Aplikujme toto na Františka Dobrotu, který ještě nemá mobila a nemá ani žádný titul:

INSERT INTO kontakty VALUES (‚Dobrota‘, ‚František‘, NULL, ‚První Traktorská‘, ‚069–8888874‘, NULL, ‚frantisek.do­brota@buty.cz‘);

Nyní se podívejme, jak námi vytvořená tabulka vypadá. K tomu použijeme příkaz SELECT.

SELECT * FROM kontakty;

+-------------+-----------+-------+-----------------------+
| prijmeni    | jmeno     | titul | firma                 |
+-------------+-----------+-------+-----------------------+
| Vonásek     | Josef     | ing.  | První tunelářská a.s. |
| Kachličková | Alžběta   | MuDr. |                       |
| Dobrota     | František | NULL  | První Traktorská      |
+-------------+-----------+-------+-----------------------+

---------------+---------------+---------------------------+
 telefon_pevna | telefon_mobil | email                     |
---------------+---------------+---------------------------+
 0202-88889999 | 0607-895656   | vonasek@tunel.cz          |
 02-895588     | 0607-777888   | kachlicka@doktori.cz      |
 069-8888874   | NULL          | frantisek.dobrota@buty.cz |
---------------+---------------+---------------------------+

Jak je vidět, vybrány byly všechny sloupce a všechny řádky tabulky. Co kdybychom ale chtěli jen seznam příjmení a jmen a k nim číslo mobila? Místo hvězdičky uvedeme seznam sloupců, které chceme zobrazit:SELECT prijmeni,jmeno,te­lefon_mobil FROM kontakty;

+-------------+-----------+---------------+
| prijmeni    | jmeno     | telefon_mobil |
+-------------+-----------+---------------+
| Vonásek     | Josef     | 0607-895656   |
| Kachličková | Alžběta   | 0607-777888   |
| Dobrota     | František | NULL          |
+-------------+-----------+---------------+

Vypadne nám tabulka právě s těmi třemi sloupci. Tomuto se říká projekce. Projekce tedy znamená zobrazení jen nějakých sloupců. A co když budeme chtít zobrazit jen lidi, kteří mají mobila? Vyřešíme to logickou podmínkou:

SELECT prijmeni,jmeno,te­lefon_mobil FROM kontakty WHERE telefon_mobil!=„NUL­L“;

+-------------+---------+---------------+
| prijmeni    | jmeno   | telefon_mobil |
+-------------+---------+---------------+
| Vonásek     | Josef   | 0607-895656   |
| Kachličková | Alžběta | 0607-777888   |
+-------------+---------+---------------+

Podmínka je vyjádřena pomocí WHERE (KDE) a „!=“ znamená „nerovná se“. Slovní interpretace by byla asi takováto: Vyber příjmení, jméno a číslo mobilu z tabulky kontaktů, kde je uvedeno něco v položce telefon_mobil. Možná pro začátek složitý příklad. Přidejme tedy do tabulky ještě Josefa Huhňala, který má e-mail: huhnal@post.cz, mobila 0607–897888 a domů 0545–8888888, pracuje v Polední důlní a.s. Budeme chtít vybrat všechny Pepy, protože svátek Josefa už se blíží a tak chystáme překvápko. Budeme chtít vědět příjmení, jméno a telefon na pevnou:

SELECT prijmeni,jmeno,te­lefon_pevna FROM kontakty WHERE jmeno=„Josef“;

+----------+-------+---------------+
| prijmeni | jmeno | telefon_pevna |
+----------+-------+---------------+
| Vonásek  | Josef | 0202-88889999 |
| Huhňal   | Josef | 0545-8888888  |
+----------+-------+---------------+

A máme všechny Pepy pohromadě. Tomuto se říká projekce s restrikcí. Restrikce znamená ve světě SQL omezení počtu řádků položením podmínky vztahující se k nějakému sloupci tabulky.

skoleni

Tolik o projekci a restrikci. Tabulku lze samozřejmě i upravovat, ale o tom příště společně s několika slovy o klíčích a zakázání duplicitních záznamů v databázi.

Odkazy:
gtranscript: http://gtranscrip­t.sourceforge­.net
myGDE: http://www.gdi­web.com
MySQL: http://www.mys­ql.cz