Hlavní navigace

Úvod do SQL

Petr Hodan

Operační systém Linux neustále šlape na paty renomovaným společnostem s jejich servery, ať už webovými (Apache běží na více jak polovině serverů) tak i databázovými. Při spojení obou serverů vznikne velmi výkonný systém v podstatě za "babku".

Účelem tohoto seriálu by mělo být základní osvětlení problematiky SQL dotazů, pochopení struktury databází a jejich relačních vztahů. Nebudeme se zabývat složitými dotazy, ale spíš aplikacemi na praktické použití zvláště s přihlédnutím k tvorbě internetových stránek.

SQL serverů existuje řada. Jmenujme alespoň Informix a Oracle pro high-end prostředí s velkými nároky na výkon, PostgreSQL a MySQL z řady volně šiřitelných a přesto výkonných, a MiniSQL z řady low-end serverů. Na platformě Linuxu si v poslední době probíjí své místo na slunci MySQL server, zvláště proto, že implementuje spoustu funkcí „velkých“ serverů s dostatečnou rychlostí. Jedinou jeho nevýhodou je to, že nepodporuje transakce (transakce je jeden či více SQL příkazů provedených jedním uživatelem, které končí úspěšnou změnou v databázi nebo uvedením zpět do výchozího stavu, přičemž pro ostatní uživatele musí být tato změna patrná až po úspěšném vykonání celého sledu instrukcí). To ale většinou nevadí, protože MySQL je velmi často nasazován jako databázový server k webovému, které jsou spojeny pomocí skriptů (PHP, CGI, ASP, Perl).

SQL je anglická zkratka pro System Query Languague, což je vlastně programovací jazyk, jímž se pomocí klienta ptáme SQL serveru a ten následně při správně položeném dotazu odpoví. Odpověď je formulována většinou do tabulky o jednom, více či dokonce žádném řádku (to pokud dotazu nevyhoví ani jedna položka). Z tabulky pak můžeme pomocí skriptů „vytahat“ potřebná data a dále je používat.

Jak jste si už asi všimli, základem databáze je tabulka, která má sloupce a řádky. Berme nyní sloupce jako vlastnosti jednotlivé položky a řádky jako vlastnosti příslušející jedné položce. Budeme-li toto aplikovat třeba na auta, vznikne následující tabulka:

Tabulka 1:
+----------+----------+------------+----------+--------+
| typ      | motor    | maximalka  | spotreba | barva  |
+----------+----------+------------+----------+--------+
| Škoda MB | 998 cm3  | 135        | 7.2      | bílá   |
| Porsche  | 2500 cm3 | 250        | 12.7     | zelená |
+----------+----------+------------+----------+--------+

Z tabulky se dozvíme, že Škoda MB má spotřebu 7.2 litru benzínu na 100 km a že její barva je bílá. Každou položku (auto) lze popsat spoustou vlastností. Čím více podrobnější tyto vlastnosti budou, tím více informací nám je schopná databáze poskytnout.

Tabulka 2:
+----------+----------+-----------+----------+--------+
| typ      | motor    | maximalka | spotreba | barva  |
+----------+----------+-----------+----------+--------+
| Skoda MB | 998 cm3  | 135       | 7.2      | bílá   |
| Porsche  | 2500 cm3 | 250       | 12.7     | zelená |
+----------+----------+-----------+----------+--------+

-----------+------------+------------+
 spz       |  cis_motoru| cis_karos  |
-----------+------------+------------+
 AE-15-98  |WN89-BN77845|45ER-5445h  |
 HKL-89-56 |XFUW72-22323|ER3x2E5-5564|
-----------+------------+------------+

Z této poněkud rozšířené tabulky je vidět, že váha jednotlivých vlastností nemusí být stejná. Prakticky nás bude jistě zajímat číslo karosérie více než barva vozu. A každý řidič asi ví, že jeho auto se dá jednoznačně identifikovat jednak podle SPZ, tak i podle výrobních čísel karosérie a motoru. A je většinou pravda to, že kombinace čísla karosérie a čísla motoru je jedinečná, kdežto SPZ se časem může měnit (z důvodu prodeje atd.). Dále si také můžete být jisti, že nejsou na světě dvě auta se stejným číslem motoru ani karosérie (pokud tomu nepomůžeme).

Nyní tedy můžeme každé unikátní kombinaci čísla motoru a čísla karosérie přiřadit jednotlivý typ vozu, barvu, SPZ, motor a další vlastnosti a to i údaje o majiteli. Při hlubším zamyšlení zjistíme, že jeden výrobce aut má jistý systém v číslování motorů a karosérií.

Vytvoříme tedy tabulku, kde bude číslo karosérie a číslo motoru a údaje o majiteli. V dalších dvou tabulkách bude v závislosti na číslu karosérie (resp. číslu motoru) popis vlastností karosérie (resp. motoru). Výsledek by mohl vypadat asi takto:

Tabulka 3:
+-------------+-------------+------------+--------------+
| cis_motoru  |   cis_kar   |    SPZ     |     rc       |
+-------------+-------------+------------+--------------+
|WN89-BN7784  | 45ER-5445h  | AE-15-98   | 345204/2421  |
|XFUW72-22323 |ER32E5-55644 | HKL-89-56  | 220222/04534 |
+-------------+-------------+------------+--------------+

Tabulka 4:
+-------------+---------+-----------+------------+-------------+----------+
| cis_motoru  | vyrobce | zdvih_obj | max_otacky | pocet_valcu | spotreba |
+-------------+---------+-----------+------------+-------------+----------+
|WN89-BN7784  | Škoda   | 998       | 6000       | 4           | 7.2      |
|XFUW72-22323 |Porsche  | 2500      | 7500       | 6           | 12.7     |
+-------------+---------+-----------+------------+-------------+----------+

Tabulka 5:
+----------------+---------+-------+-----------+--------+------------+
| cis_karoserie  | vyrobce | barva | poc_dveri | uprava | stres_okno |
+----------------+---------+-------+-----------+--------+------------+
|  45ER-5445h    | Škoda   |červená| 2         |rapid   | ano        |
| ER32E5-55644   | Porsche |zelená | 2         |kabrio  | ne         |
+----------------+---------+-------+-----------+--------+------------+

Tabulka 6:
+-------------+-------------+------------+--------------+----------+
|     rc      |   prijmeni  |   jmeno    | ulice        |  mesto   |
+-------------+-------------+------------+--------------+----------+
|345204/2421  | Ocásek      | Karel      | Křížíkova 88 |Praha 88  |
|220222/04534 | Vonásek     | Lojza      | Dlouhá 8     |Krátko 8  |
+-------------+-------------+------------+--------------+----------+

Z těchto čtyř tabulek je již možno vyčíst spoustu věcí. Z první snadno dle SPZ, čísla karoserie nebo čísla motoru určíme majitele. Z dalších dvou tabulek zjistíme jednotlivé údaje o karosérii či motoru. Možná se zeptáte proč v první tabulce není jméno majitele a jeho data. Nejsou tam z toho důvodu, protože při prodeji se mění majitel, ale už ne SPZ. Jednoduše se udělá další tabulka podle rodných čísel s vlastnostmi jejich nositelů. Při změně majitele vozu se jen přepíše rodné číslo, pokud se majitel přestěhuje, není potřeba zasahovat do databáze s čísly motoru a karoserie.

Dotaz na SQL server, pokud bychom znali SPZ, bude znít asi takto:
vyber prijmeni, jmeno, ulice, mesto z tabulky6 kde rc=(vyber rc z tabulky3 kde SPZ=„AE-15–98“)

Stejně bychom se mohli ptát i podle čísla karoserie nebo čísla motoru, případně pomocí všech třech identifikačních znaků. Stejně tak není problém vytáhnout z databáze majitele všech škodovek s červenou barvou.

Vyber jmeno, prijmeni, ulice, mesto z tabulky6 kde rc=(vyber rc z tabulky3 kde cis_kar=(vyber cis_karoserie z tabulky5 kde (vyrobce=„Škoda“ and barva=„červená“)))

Smyslem prvního dílu bylo vysvětlit, že není účelné jednu tabulku naplnit co nejvíce vlastnostmi a údaji. Tím pak vznikne jakýsi gigant, ve kterém se bude těžko někdo orientovat. Je účelnější dělat menší tabulky s návaznostmi mezi sebou. Hodně věcí se tím zjednoduší a ušetříme si spoustu práce.

Na závěr by se ještě hodilo říci, že než se pustíte do vytváření tabulek, je dobré mít alespoň nějakou představu o tom, co jak a kde bude s čím spjato. Ve stádiu raného návrhu je stále nejúčinnějším pomocníkem tužka a papír.

Našli jste v článku chybu?