V dnešním pokračování seriálu se podíváme na typy systémů, kde můžete SQL najít a začneme s příkazem Select.
V
minulém díle jsme se seznámili se stručnou historií SQL, pojďme se dnes spolu podívat, v jakých typech systémů se s tímto jazykem můžeme setkat, a hlavně nakousněme jeden jeho nejdůležitějších příkazů - příkaz SELECT.
Nejčastěji se s jazykem SQL můžeme setkat u celé řady relačních databázových serverů postavených na architektuře client/server. Zjednodušeně řečeno, v případě implementace na straně serveru (nemusí tomu tak být vždy, jak si ukážeme za chvíli u tzv. desktopových databází) jde o jakýsi nezbytně nutný základ. Prvků jazyka se pak využívá prostřednictvím klientských aplikací (případně uložených procedur a triggerů na serveru), které požadovanou operaci transformují do SQL a pošlou jej k provedení serveru. Následně aplikace obdrží odpověď, kterou zobrazí. S každým databázovým serverem je dodáván "jednoduchý" dotazovací klient. Pomocí tohoto nástroje uživatel může interaktivně zadávat jednotlivé SQL příkazy, případně celé SQL dávky. Dotazovací klient žádným způsobem vlastní SQL příkaz neprovádí, jeho zpracování je úlohou pouze serveru.
Minule jsme si jazyk SQL charakterizovali jako neprocedurální. To mimo jiné znamená neexistenci celé řady konstruktů známých z vyšších programovacích jazyků, jako je cyklus nebo větvení. Většina implementací SQL disponuje tzv. procedurálním rozšířením (například PL/SQL od společnosti Oracle). Nové vlastnosti doplňují sílu čistého SQL právě o zmiňované možnosti.
Desktopové databáze, které nepracují v architektuře client/server, mají také zabudovány (až na několik málo výjimek, například systém REDAP) některé prvky jazyka SQL, často mírně odlišné od norem. Rozdíl oproti předchozímu případu je zejména ten, že příkazy jsou vykonávány přímo na klientovi. Pro běh klientské aplikace vytvořené v systému této kategorie je zpravidla nutná přítomnost samotného vývojového prostředí, případně runtime modulů.
Konstrukty SQL je také možné použít jako součást vyššího programovacího jazyka (např. C/C++). Příkazy se pak stávají součástí zdrojového kódu aplikace, způsob jejich vykonávání je však závislý na konkrétním vývojovém nástroji - může být ve zdrojovém tvaru zaslán k vykonání serveru či proveden na straně klienta. Hovoříme o tzv. hostitelském přístupu. Pro některé vývojové nástroje, zejména pak vizuální (např. DELPHI), zůstává jazyk SQL pro vývojáře v pozadí - požadovaná operace, která je zapsána vlastními příkazy vývojového nástroje, je do SQL transformována. Důležité je, že bez zásahu vývojáře - ten mnohdy nemusí mít o SQL ani ponětí.
Tak, a nyní, když víme, kde se SQL používá, můžeme se vrhnout na první příkaz tohoto jazyka. Je jím SELECT, který má za úkol realizovat uživatelské dotazy nad daty. Zjednodušená syntaxe tohoto příkazu má následující podobu:
SELECT [DISTINCT] položky FROM jméno_tabulky [WHERE podmínka_výběru] [GROUP BY položky, [HAVING podmínka_agregace]] [ORDER BY položky]
Pro bližší vysvětlení významu jednotlivých možností tohoto příkazu uvažujme následující jednoduchou tabulku osoby:
Jméno |
příjmení |
rodné_číslo |
datum |
Karel |
Smolný |
580815/8777 |
3.12.1992 |
Marek |
Jurda |
650404/8956 |
2.11.1992 |
Martin |
Pavlásek |
720303/5511 |
28.3.1990 |
Pavel |
Jirásek |
551212/7877 |
26.3.1989 |
Pavla |
Nováková |
785308/4569 |
28.6.1997 |
Pavla |
Nováková |
555111/3042 |
28.5.1990 |
Romana |
Bourková |
745226/8820 |
3.5.1995 |
Pod položkami (atributy) si můžeme zjednodušeně představit sloupce tabulky, případně funkce. Tedy v případě naší tabulky jde o položky jméno, příjmení, rodné_číslo a datum (nástupu do zaměstnání). Poznamenejme, že na pořadí jednotlivých položek v tabulce nezáleží. DISTINCT zařídí, že stejné řádky vybereme pouze jednou. Klíčové slovo FROM nám říká, nad jakou tabulkou má být dotaz proveden, "odkud" budou data čerpána. Klauzule WHERE nám umožňuje omezit výběr řádků podle požadované podmínky. O GROUP BY a HAVING se zatím zmíníme pouze ve smyslu, že se používají pro agregační funkce a blíže se této problematice budeme věnovat v příštím díle. Konečně, pomocí ORDER BY můžeme určit setřídění výsledku dotazu. Názornější snad budou následující jednoduché příklady.
SELECT jméno,příjmení,rodné_číslo,datum FROM osoby
dává výsledek ve tvaru (formátování výstupu je závislé na použitém nástroji):
jméno |
příjmení |
rodné_číslo |
datum |
Karel |
Smolný |
580815/8777 |
3.12.1992 |
Marek |
Jurda |
650404/8956 |
2.11.1992 |
Martin |
Pavlásek |
720303/5511 |
28.3.1990 |
Pavel |
Jirásek |
551212/7877 |
26.3.1989 |
Pavla |
Nováková |
785308/4569 |
28.6.1997 |
Pavla |
Nováková |
555111/3042 |
28.5.1990 |
Romana |
Bourková |
745226/8820 |
3.5.1995 |
SELECT jméno,příjmení FROM osoby
dává výsledek:
jméno |
příjmení |
Karel |
Smolný |
Marek |
Jurda |
Martin |
Pavlásek |
Pavel |
Jirásek |
Pavla |
Nováková |
Pavla |
Nováková |
Romana |
Bourková |
SELECT DISTINCT jméno,příjmení FROM osoby
dává výsledek (všimněte si, že Pavla Nováková je zobrazena pouze jednou):
jméno |
příjmení |
Karel |
Smolný |
Marek |
Jurda |
Martin |
Pavlásek |
Pavel |
Jirásek |
Pavla |
Nováková |
Romana |
Bourková |
SELECT jméno,příjmení,rodné_číslo,datum FROM osoby WHERE datum>31.11.1992
dává výsledek ve tvaru (jsou tedy zobrazeny pouze záznamy odpovídající podmínce):
jméno |
příjmení |
rodné_číslo |
datum |
Karel |
Smolný |
580815/8777 |
3.12.1992 |
Romana |
Bourková |
745226/8820 |
3.5.1995 |
SELECT jméno,příjmení FROM osoby ORDER BY příjmení
dává setříděný výsledek (podle příjmení):
jméno |
příjmení |
Romana |
Bourková |
Pavel |
Jirásek |
Marek |
Jurda |
Pavla |
Nováková |
Pavla |
Nováková |
Martin |
Pavlásek |
Karel |
Smolný |
Na několika málo jednoduchých příkladech nelze pochopitelně ukázat (a ani to není cílem tohoto seriálu) všechny možnosti příkazu SELECT, k některým z nich se však vrátíme v příštích dílech. Především pak v souvislosti s konkrétními problémy pro existující systémy. Příště se podrobněji podíváme na agregační funkce. Zmíníme se také o tom, jak můžeme provést dotaz nad více tabulkami, stranou tedy nezůstanou ani pojmy UNION a JOIN.
Související články:
Víte, co je SQL? Ne? Nevadí - dnes začínáme!