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?

9. 3. 2000 15:46

Petr Cizmar (neregistrovaný)

S ti souhglasim, taky bych celkem ocenil neco navodnejsiho.

8. 3. 2000 20:18

noname2 (neregistrovaný)

zkus na zacatek tvyho PHP3 napsat:
dl('mysql.so');

:)


Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: „Black Friday 2016“: závěrečné zhodnocení

„Black Friday 2016“: závěrečné zhodnocení

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Podnikatel.cz: Snížení DPH na 15 % se netýká všech

Snížení DPH na 15 % se netýká všech

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?