Začínáme s MySQL 10. – výběrové dotazy

V dnešním díle vám povím něco o výběrových dotazech s využitím SQL příkazu SELECT a něco málo o agregačních funkcích, které s tímto příkazem souvisejí.c
Po předchozím dílu tohoto seriálu jste nejspíš ve stavu, kdy máte tabulky alespoň z části zaplněnou daty. Nyní s největší pravděpodobností potřebujete tyto data nějakým způsobem vyvést na výstup, neboli vybrat ta, se kterými budete chtít dále pracovat. K tomu v MySQL slouží SQL příkaz SELECT. Jeho kompletní syntaxi nebudu uvádět, ale zmíním se alespoň o nejčastěji využívaných pasážích:

SELECT [HIGH_PRIORITY] [FROM název_tabulky] [WHERE podmínka] [GROUP BY podle] [ORDER BY název_pole] [LIMIT #]

Znovu podotýkám, že toto je zkrácená syntaxe a její kompletní (daleko podrobnější) výčet naleznete v manuálu, který je distribuován společně s databází.

Nejjednodušší praktické provedení příkazu vypadá následovně:

SELECT * FROM uzivatele;

Česky by se tento formát dal přeložit do věty "vyber vše z tabulky uzivatele". Znak * značí, že budou vybrána všechna pole v tabulce, tudíž i všechna data, která obsahují. Lze samozřejmě vybrat jen některá pole:

SELECT uziv_jmeno, heslo FROM uzivatele;

V tomto konkrétním případě budou vybrána pole uziv_jmeno a heslo. Stále je však tento formát příkazu dosti nepraktický. Uvedu modelový příklad. Máte tabulku s řádově tisíci záznamy a chcete z ní vybrat dejme tomu pouze 3 záznamy. Při použití předchozího příkladu by to však bylo příliš náročné, což by se v konečném důsledku neblaze projevilo na rychlosti SQL serveru. Proto je dobré využít podmínkovou klauzuli WHERE. Ta vám zaručí, že budou vybrány pouze ty záznamy, které vyhovují zadanému kritériu. To váš dotaz podstatně zrychlí. Syntaxe:

SELECT * FROM uzivatele WHERE prijmeni = "Novák";

Takto zadaný příkaz vybere z tabulky uzivatele záznamy, u nichž je v poli prijmeni uložena hodnota "Novák".. Podmiňovací kritérium však nemusí být pouze jedno – lze jich spojit i několik dohromady.

SELECT * FROM uzivatele WHERE prijmeni= "Novák" AND jmeno= "Petr";

Předcházející příkaz vybere z tabulky uzivatele záznamy, u nichž je v poli prijmeni uložena hodnota "Novák" a současně je zde uvedena v poli jmeno hodnota Petr. Kromě AND taktéž často využijete operátor OR. Ten zaručí, že klauzule WHERE bude vyhodnocena kladně, pokud bude platit alespoň jedno kriterium.

SELECT * FROM uzivatele WHERE prijmeni= "Novák" OR prijmeni= "Polák";

Záznam tedy bude vybrán, pokud je v poli prijmeni uloženo příjmení Novák nebo Polák. Takto vybrané záznamy jsou mnohdy nesetříděné, a proto je možnost je setřídit přímo ve výběrovém dotazu. K tomuto slouží klauzule ORDER BY. Rozšířím tedy předchozí příklad o tuto část:

SELECT * FROM uzivatele WHERE prijmeni= "Novák" OR prijmeni= "Polák" ORDER BY prijmeni;

Nyní budou navíc všechny záznamy, které vyhovují kriteriu, seřazeny podle pole príjmeni. Seřazovat lze také pomocí více polí s tím, že seznam polí bude oddělován čárkami. Prioritu přitom bude mít vždy první pole a až teprve tehdy, budou-li se některé hodnoty shodovat, se přistoupí na porovnávání podle dalších polí. Příklad:

SELECT * FROM uzivatele WHERE prijmeni= "Novák" OR prijmeni= "Polák" ORDER By prijmeni, jmeno;

V tomto případě budou všechny záznamy seřazeny podle prijmeni a teprve až tehdy, budou-li se některá příjmení shodovat (např. 2x Novák), nastoupí druhé porovnávací kriterium v podobě pole jmeno.

Občas též můžete využít možnosti seřazený výběr invertovat. K tomu slouží "atribut" DESC, který se uvede na konec klauzule ORDER BY.

SELECT * FROM uzivatele WHERE prijmeni= "Novák" OR prijmeni= "Polák" ORDER By prijmeni DESC;

Jistě jste si všimli, že jsem na začátku tohoto dílu uvedl za sekvencí SELECT "atribut" [HIGH_PRIORITY]. Při použití tohoto atributu se stane to, že váš výběrový dotaz bude mít rázem vyšší priority než přidávací dotaz. Jak jsem totiž uvedl v jednom z předchozích dílů, obyčejně je tomu přesně naopak.

Poslední věc, o které bych se rád v souvislosti se syntaxí příkazu SELECT rád zmínil, je část [LIMIT #]. Použití této části umožní vybrat například jen prvních 10 záznamů, které vyhovují kriteriu (je-li uvedeno).

SELECT * FROM uzivatele LIMIT 10;

Výše zmíněná syntaxe vybere maximálně 10 záznamů (v tomto případě prvních). S pomocí části LIMIT lze tedy mnohdy značně optimalizovat výběrový dotaz.

Agregační funkce

Jistě jste si mnozí všimli, že jsem vynechal popis klauzule GROUP BY. Chci se o ní zmínit až nyní, a to z jednoho prostého důvodu. Klauzuli GROUP BY lze totiž využít pouze v kombinaci s agregačními funkcemi. Agregační funkce umožňují z výsledku výběrového dotazu vypočítat základní věci jako například průměr, součet... apod.

(Poznámka: Tyto funkce se mnohdy vyskytují pod jiným označením, ale nejčastěji se s nimi setkáte právě pod pojmem agregační funkce.)

V následující tabulce jsem shrnul ty nejčastěji využívané:

Název funkce: Popis:
COUNT () spočítá počet vybraných záznamů
MAX () vrátí nejvyšší hodnotu v poli
MIN () vrátí nejnižší hodnotu v poli
AVG () vypočítá aritmetický průměr hodnot v poli
SUM () součet hodnot v poli
Agregační funkce se vkládají hned za klíčové slovo SELECT. Pro ilustraci uvedu následující příklad:

SELECT Count<) FROM uzivatele;

Předcházející řádek vrátí celkový počet záznamů uložených v tabulce uzivatele. Za hvězdičku se dá samozřejmě dosadit název pole. Funkce Count () umožňuje taktéž spočítat počet jedinečných záznamů v poli. Provede se to následovně:

SELECT COUNT(DISTINCT prijmeni) FROM uzivatele;

Jak vidíte, syntaxe je podobná. Pouze se zaměnilo klíčové slovo DISTINCT následováno názvem pole za hvězdičku. Obdobným způsobem, jako se pracuje s funkcí COUNT, se pracuje i s ostatními funkcemi – tedy kromě DISTINCT, které u ostatních funkcí nelze využít.

(Upozornění: Funkce SUM() a AVG() při svých výpočtech ignorují záznamy s NULL hodnotou.)

V jednom z předchozích odstavců jsem se zmínil, že klauzule GROUP BY je spjata právě s agregačními funkcemi. Nyní je myslím ta pravá chvíle, abych se o této klauzuli zmínil podrobněji. Klauzule GROUP BY slouží k tomu, aby sloučila záznamy, které obsahují stejné hodnoty do jediného záznamu resp. jedné hodnoty. Takto můžete například statisticky zjistit, jaká jsou nejčastější křestní jména uživatelů:

SELECT jmeno, count(jmeno) as pocet FROM uzivatele GROUP BY jmeno;

Některé z vás mohla v předchozím zápisu zarazit pasáž "as pocet". Vysvětlení je jednoduché. Laicky řečeno jsme vytvořili výpis dvou polí. První pole se jmenuje jmeno (tak je název veden v tabulce) a druhé pole jste vlastně vytvořili. Nadpis tohoto pole by normálně byl "count(jmeno)", což nevypadá příliš dobře, a proto je dobré si jej přejmenovat.

Závěrem

Po dnešním dílu již ovládáte základní formulace výběrových dotazů. Jak vidíte, není to rozhodně nic těžkého. V příštím díle vám řeknu něco o možnostech importu a exportu dat.
Diskuze (6) Další článek: Hledán Tchajwanský hacker

Témata článku: , , , , , , , , , , , , , ,