SQL – jak na dotazy 1.
Po několika dílech se dostávám k vyhledávání informací v databázi. Pro získávání jakýchkoliv informací slouží jediný příkaz SELECT, který je ze všech příkazů jazyka SQL nejsložitější, má nejbohatší strukturu a nejvíce možností. V souvislosti s tímto příkazem rozšířím naše vědomosti o další základní pojmy, které se v relačních databázích používají. Těmito pojmy budou dnes projekce a restrikce. Příkazu SELECT pro jeho bohaté využití se budeme věnovat několik dílů, v nichž se budu snažit pojmout všechny možnosti použití. V dnešním si povíme základní vlastnosti a nejjednodušší použití.
Základní databázové schéma
Pro potřebu příkladů, které budu dále uvádět si zadefinujme novou databázi. Již nebudu používat model „naší“ firmy, o který jsem se opíral v příkladech v předchozích článcích, ale zavedu model evidence knihovny. Následuje přehled a popis jednotlivých tabulek pro náš model (pozn.: v databázovém světě se pro pořadové číslo velmi často používá označení ‚id‘ – jako identifikátor). Budeme evidovat informace o knihách a jejich výtiscích, nakladatelstvích a autorech. Náš celý systém se bude skládat z pěti tabulek:
Tabulka: Kniha
|
Tabulka KNIHA bude obsahovat jenom názvy knih. Každá kniha (ve smyslu dílo) bude mít své ID.
Tabulka: Autoři
|
U každého autora budeme evidovat jeho jméno a příjmení, dále titul a případně prostřední jméno.
Tabulka: Napsané_knihy
|
Tato tabulka zprostředkovává vazbu mezi tabulkami KNIHA a AUTOŘI, typu M:N (jeden autor může napsat více knih, jedna kniha může být napsána více autory).
Tabulka: Nakladatelství
|
O každém nakladatelství si budeme uchovávat jeho název, plnou adresu, telefon, kontaktní e-mail a webovou stránku.
Tabulka: Výtisk
|
Tato tabulka popisuje konkrétní výtisk jednoho díla. Zároveň reprezentuje vazbu mezi tabulkami KNIHA a NAKLADATELSTVÍ, opět typu M:N (jedno dílo může být vydáno různými nakladatelstvími, jedno nakladatelství může vydat více knih).
Na tyto tabulky se budu v následujících příkladech, pokud neuvedu jinak, odkazovat.
Syntaxe příkazu SELECT
Jak už jsem uvedl v úvodu, příkaz SELECT je velmi rozmanitý a skýtá obecně velmi mnoho možností použití. Kompletní syntaxe vypadá následovně:
|
Uvedená definice je rekurzivní z toho důvodu, že pomocí klíčových slov UNION, INTERSECT a MINUS, můžeme dělat sjednocení vrácených sloupců z uvedených dotazů, nebo průnik či doplněk. V dnešním díle se budeme o příkazu SELECT bavit na zjednodušené úrovni, jejiž syntaxe by mohla vypadat takto:
|
SELECT seznam sloupců
Nejprve si řekneme, co znamená pojem projekce. Projekci si lze představit jako zobrazení konkrétní položky (sloupce). Jednotlivé řádky tabulky nám mohou vystupovat jako n-tice hodnot, např. v tabulce AUTOŘI jeden řádek je pětice různých hodnot (id, jméno, příjmení, titul, prostřední). Kdybychom se v tabulce zajímali pouze o tituly, udělali bychom projekci na složku titul, zapisujeme P[titul]. Kdyby nás zajímalo jméno a příjmení, udělali bychom projekci P[jméno, příjmení].
Jako seznam sloupců uvedeme právě projektované sloupce, tj. sloupce, jejichž hodnoty nás zajímají. Obecně zde můžeme uvést výčet sloupců z více tabulek. Pokud by se některé názvy sloupců v různých tabulkách opakovaly, pak je potřeba název sloupce uvést ve tvaru jméno_tabulky.jméno_sloupce. Jména sloupců oddělujeme čárkou.
FROM seznam tabulek
V této části uvedeme tabulky, ze kterých chceme data získávat. Všechny sloupce, zadané za klíčovým slovem SELECT, musí patřit do zde uvedených tabulek. Názvy tabulek oddělujeme také čárkou. Zatím budeme pracovat s jednou tabulkou.
Jednoduchý výpis tabulky
Pro výpis obsahu tabulky použijeme příkaz SELECT v jeho nejjednodušší podobě. Následující příklady provedou výpis základních údajů z tabulek:
|
První SELECT zobrazí obsah celé tabulky KNIHA. Druhý příkaz zobrazí obsah celé tabulky AUTOŘI. Znak hvězdička nahrazuje názvy všech sloupců v tabulce a to ve stejném pořadí, jak jsou sloupce v tabulce vytvořeny. Třetí SELECT zobrazí jen některé vybrané sloupce z tabulky NAKLADATELSTVÍ.
Restrikce
S tímto pojmem jsme se již několikrát setkali v předchozím díle, kdy jsem mluvil o aktualizaci dat v tabulkách. Jistě si vzpomenete, že v příkazech UPDATE a DELETE jsme uváděli část WHERE s podmínkami, které nám říkaly, na které řádky se má příkaz aplikovat. Právě ono omezování řádků pomocí podmínek se nazývá restrikce.
WHERE restrikce
Podmínka se skládá z kombinace logických výrazů a logických spojek AND, OR a NOT a kulatých závorek. Logické výrazy můžeme sestavovat z názvů sloupců, z relačních operátorů a speciálních klíčových slov. V jednotlivých částech logického výrazu mohou vystupovat aritmetické výrazy se základními matematickými operátory a dále řetězcové výrazy s operátory pro řetězce. Přehled základních operátorů ukazuje následující tabulka:
a>b, a<b, a>=b;, a<=b, a=b IS NULL, IS NOT NULL LIKE ‚K%‘, LIKE ‚L____‘, LIKE ‚_b%k‘ AND, OR, NOT, (, )
Každý databázový systém má svá různá rozšíření, toto je úplný základ, který by měl většinou dodržovat každý systém. Zastavím se na chvíli u některých operátorů. Klíčovo slovo IS NULL se používá pro zapsání podmínky, že nějaká položka (sloupec) má nedefinovanou hodnotu (uživatel ji nezadal). IS NOT NULL slouží pro opačný případ, kdy se ptáme, zdali položka má definovanou hodnotu.
Operátor LIKE slouží pro porovnávání řetězců a navíc nabízí možnost jakýchsi jednoduchých regulárních výrazů. LIKE ‚K%‘ znamená řetězec, který začíná na písmeno ‚K‘ (znak ‚%‘ nahrazuje libovolný počet znaků, i nula). LIKE ‚L____‘ je zápis řetězce, který začíná na písmeno ‚L‘ a má právě 5 znaků (znak ‚_‘ nahrazuje libovolný jeden znak). Příklad LIKE ‚_b%k‘ je jen kombinací dvou předchozích. Říká, že řetězec obsahuje na druhém místě písmeno ‚b‘, následované libovolným počtem znaků, které pak končí písmenem ‚k‘. Následuje pár příkladů s užitím restrikce:
Příklady
Názvy všech nakladatelství, která jsou z Brna:
|
Název a e-mail všech nakladatelství, která mají svou webovskou stránku:
|
Příjmení všech autorů, jejichž křestní jména začínají na písmeno ‚T‘, a kteří nemají žádný titul:
|
ORDER BY dle čeho třídit
Jak už samo klíčové slovo ORDER BY napovídá, slouží pro třídění výstupu. Třídění výstupních řádků podle hodnot určitého sloupce nebo sloupců je velmi užitečné a často využívané. Sloupce, podle kterých chceme třídit, uvedeme jako seznam za ORDER BY. Jednotlivé sloupce od sebe oddělíme opět čárkou. Základní třídění probíhá lexikograficky u řetězcových položek. Třídění dle čísel, datumu, apod. probíhá podle našeho očekávání. Pokud byste v řetězcovém třídění zaznamenali nějaké anomálie typu, že písmeno ‚ch‘ se bere jako dvojici písmen ‚c‘ a ‚h‘, nebo že by systém špatně zařazoval slova, která by začínala na nějaké diakritické písmeno, bude problém v lokálním nastavení vašeho databázového systému. Systému je nutné říct, že vaše prostředí je české.
Příklad
Chceme seznam jmen všech brněnských nakladatelství s jejich kompletními adresami, tříděno dle názvů ulic (pakliže sídlí ve stejné ulici, dle jejich čísla):
|
Nejčastěji jsou hodnoty tříděny vzestupně, od nějnižší po nejvyšší. Pokud bychom chtěli provést třídění sestupně (inverzní), použijeme třídění v následujícím tvaru:
|
Použití modifikátoru DESC by mělo fungovat ve většině databázových systémů. Kromě klíčového slova DESC existuje i ASC, které je pro základní vzestupné třídění, jeho uvedení je však nepovinné a zpravidla se tedy ani neuvádí.
V příštím díle se podíváme hloubeji na psaní SQL dotazů, povíme si o výpisu informací z více tabulek (zadefinujeme si pojem přirozeného spojení tabulek). Dále se dovíte zajímavé tipy a triky, jak můžeme zpřehledňovat a formátovat výstupní řádky.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Mohlo by vás také zajímat
-
Co je to DNSSEC, jak funguje a jak si ho nastavit?
14. srpna 2024 -
Thunderbolt 4 vs. OCuLink: Přišel čas na upgrade?
27. května 2024 -
Vlastní web: Jak nainstalovat WordPress?
24. června 2024
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024
Mario
Zář 12, 2012 v 11:47V tabulke vytisk je asi chyba :
FOREIGN KEY (kniha_id) REFERENCES kniha (id),
spravne ma byt asi FOREIGN KEY (publikace_id) REFERENCES kniha (id),
Mario
Zář 12, 2012 v 12:22Nevsimol som si starsie komentare :) uz to tam je rozoberane … Super clanok, vdaka zan. Pouzivam Ms SQL 2008 , kde datovy typ nieje NUMBER ale NUMERIC ;)