Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

16. Výběr dat - co se jinam nevešlo

Zbývá nám dovysvětlit si několik věcí, které se tématicky do žádné z předchozích kapitol nehodily, ale přesto je potřeba je detailněji zmínit.

Alias

V některých příkladech jsme již alias využívali. Jde o použití výrazu AS, který nám umožnuje pojmenovat či přejmenovat jak se bude jmenovat sloupec ve výsledku dotazu či jak ho můžeme dále označovat v rámci samotného dotazu.

První možnost jak AS použít, je za názvem jakéhokoliv sloupce, který vyjmenováváme v rámci SELECT. Ve výsledcích pak bude tento sloupec takto přejmenován. Stejně ta bychom s novým názvem sloupce pracovali při prípadném spojování tabulek:
SELECT nazev AS nazev_knihy 
FROM `knihy`;


Dalším častým využitím aliasu je pojmenování sloupce výsledku při použití agregačních funkcí:
SELECT kniha_id, avg(hodnoceni) AS prumerne_hodnoceni 
FROM `hodnoceni`
GROUP BY kniha_id;


Třetí častou možností je využítí při použítí poddotazu, jehož výsledkem je tabulka, kterou například dále spojujeme. Tuto tabulku vzniklou z poddotazu je nutné pojmenovat, abychom spojení mohli provést:
SELECT knihy.*
FROM `knihy` JOIN (select kniha_id FROM vydani_knihy WHERE rok >= 2014) AS vydani
ON vydani.kniha_id = knihy.kniha_id;



DISTINCT

Klíčové slovo DISTINCT slouží v MySQL k odstranění duplicitních záznamů ve výsledku dotazu. Pokud by několik řádků mělo hodnoty ve všech sloupcích stejné, budou zredukovány pouze na jediný řádek. Pokud bychom měli tabulku uživatelů s městy odkud pocházejí, snadno bychom tak mohli získat seznam všech měst, ze kterých naši uživatelé jsou, aniž by se nám opakovala. Klíčové slovo DISTINCT se umisťuje bezprostředně za SELECT, ještě před vyjmenované sloupec.

DISTINCT se nevztahuje pouze na hodnotu následujícícho sloupce za klíčovým slovem, ale všech sloupců které jsou ve výsledku dotazu.

DISTINCT lze také kombinovat s agregačními funkcemi, pro například získaní počtu unikátních hodnot ve slupci: SELECT COUNT(DISTINCT sloupec) FROM ...



Určení vlastního řazení výsledků

V článku o základech vyhledávání jsme si ukázali řazení podle jedno i více sloupců sestupně či vzestupně. Pokud máme sloupec s předem známými hodnotami (malým počtem různých hodnot) a nevyhovuje nám abecední / číselné seřazení, můžeme si určit vlastní. K tomu využijeme funkci FIELD(). Jako první parametr funkce je sloupec, podle kterého probíhá řazení a pak následují vyjmenované hodnoty v pořadí, které požadujete:

SELECT * FROM `vydani_knihy`
ORDER BY FIELD(kniha_id, 4, 1, 2, 3);


Ke stejném účelu můžeme využít také větvení kódu, které může být v jednodušších případech na pohled komplikovanejší, ale celkově nabízí více možností.


UNION

UNION nám umožnuje sloučít výsledky více dotazů do jednoho. Můžeme tak spojít několik různých selectů a získat pouze jediný výsledek. Nejvhodnější použití je, pokud jsou dotazy nad stejnou tabulkou. Lze sice zkombinovat i dotazy na různých tabulkách (jedinou podmínkou je stejný počet sloupců), ale pokud by šlo o zcela nesourodé tabulky, nedává to příliš smysl:

SELECT kniha_id, nazev FROM `knihy` WHERE kniha_id = 1
UNION
SELECT kniha_id, nazev FROM `knihy` WHERE kniha_id = 4;

+----------+------------------+
| kniha_id | nazev            |
+----------+------------------+
|        1 | Duna             |
|        4 | Svět ledu a ohně |
+----------+------------------+



ROLLUP

Tak klauzule nám při použití agregační funkcí umožnuje získat výsledek agregační funkce pro všechny výsledky dohromady. Pokud bychom vytvořili dotaz, který v naší tabulce hodnoceni bude zjištovat průměrné hodnocení každé knihy, pomoci ROLLUP rovnou získáme celkový průměr hodnocení všech knih:

SELECT AVG(hodnoceni), kniha_id
FROM `hodnoceni`
GROUP BY kniha_id WITH ROLLUP;

+----------------+----------+
| AVG(hodnoceni) | kniha_id |
+----------------+----------+
|         9.6667 |        1 |
|         8.8000 |        2 |
|         5.6667 |        4 |
|         8.5000 |     NULL |
+----------------+----------+


Tím jsme ukončili část MySQL tutorálů věnovanou asi nejrozsáhlejšímu tématu - vyhledávání. V dalších částech si povíme více například o indexech nebo transakcích a procedurách.


Další díly tutoriálu

14. Regulární výrazy
15. Operace nad vybranými daty
16. Výběr dat - co se jinam nevešlo
17. K čemu slouží indexy
18. Jak správně používat indexy