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

7. Základy vyhledávání

Když nyní umíme vytvořit databázovou strukturu a naplnit ji daty, můžeme se dostat k většinou nejčastejší operaci nad databází - výběrem dat.

Ze všeho nejdříve si musíme vytvořit testovací data, nad kterými budeme vyhledávat. Opět si vytvoříme tabulku knihy a naplníme ji údaji. Pokud v databázi máte uloženou tabulku knihy z předchozích kapitol, je nutné ji nejprve smazat.

CREATE TABLE `knihy` (
`kniha_id` int(10) AUTO_INCREMENT,
`nazev` varchar(100),
`isbn` varchar(20),
`autor` varchar(100),
`pocet_stran` int(4),
PRIMARY KEY (`kniha_id`)
);

INSERT INTO `knihy` (`kniha_id`, `nazev`, `isbn`, `autor`, `pocet_stran`) VALUES
(1, 'Duna', '978-80-269-0517-2', 'Frank Herbert', 592),
(2, 'Malý princ', '978-80-7553-131-5', 'Antoine de Saint-Exupéry', 112),
(3, 'Harry Potter a vězeň z Azkabanu', '978-80-00-04621-1', 'J. K. Rowling', 383),
(4, 'Kmotr', '978-80-242-5899-7', 'Mario Puzo', 496),
(5, 'Dva proti Říši', '978-80-242-5975-8', 'Jiří Šulc', 480),
(6, 'Bouře mečů', '978-80-257-2419-4', 'George R. R. Martin', 1132),
(7, '1984', '978-80-257-1479-9', 'George Orwell', 320),
(8, 'Lovci kostí', '978-80-7197-334-8', 'Steven Erikson', 880),
(9, 'Zelená míle', '978-80-7306-588-1', 'Stephen King', 344),
(10, 'Křest ohněm', '978-80-7477-062-3', 'Andrzej Sapkowski', 296),
(11, 'Píseň krve', '978-80-7491-602-1', 'Anthony Ryan', 624),
(12, 'Naslouchač', '978-80-7577-703-4', 'Petra Stehlíková', 374),
(13, 'Nový svět', '978-80-86803-21-0', 'Shaun Tan', 374);


Pro vyhledávání budeme používat příkaz SELECT se syntaxí:
SELECT sloupce FROM tabulka WHERE podminka


Za klíčovým slovem SELECT následuje výběr sloupců, které budeme chtít načíst přičemž jednotlivé sloupce oddělujeme čářkou. Za klíčovým slovem FROM specifikujeme ze které tabulky data vybíráme a za slovem SELECT následují podmínky určující které řádky mají být vybrány. Pokud část WHERE neuvedete, budou vybrány všechny řádky tabulky.

Místo výčtu sloupců můžeme používat znak *, který znamená že se vyberou sloupce všechny. Není hodné ho ale využívat vždy, jen kvůli zjednodušení zápisu. Pokud potřebujeme jen několik málo sloupců a jde o tabulku s mnoha řádky, zbytečně tímto malým zjednodušením zvýšíme výkonové nároky na databázový server.


Pojďme to vyzkoušet na naší tabulce. Máme rádi dlouhé knihy! Chceme vybrat pouze knihy, které mají více jak 600 stránek:
SELECT *
FROM `knihy`
WHERE `pocet_stran` > 600;

Jako výsledek dostaneme 3 knihy:
+----------+-------------+-------------------+---------------------+-------------+
| kniha_id | nazev       | isbn              | autor               | pocet_stran |
+----------+-------------+-------------------+---------------------+-------------+
|        6 | Bouře mečů  | 978-80-257-2419-4 | George R. R. Martin |        1132 |
|        8 | Lovci kostí | 978-80-7197-334-8 | Steven Erikson      |         880 |
|       11 | Píseň krve  | 978-80-7491-602-1 | Anthony Ryan        |         624 |
+----------+-------------+-------------------+---------------------+-------------+


Základní operátory

Pro vyhledávání můžeme používat základní operátory které již nejspíš budete znát: >, <, >=, <=, =, !=. Využít je můžeme jak pro porovnávání číšel tak řetězců. Můžeme je také libovolně kombinovat pomocí spojek AND a OR a také pomocí závorek, kterými můžeme určit prioritu.

V daším dotazu budeme chtít najít knihy, které mají mezi 300 a 400 stránkami včetně. Zároveň nás nezajímá ISBN knihy, mezi jmenovanými sloupci ho tak nebudeme uvádět:
SELECT `kniha_id`, `nazev`, `autor`, `pocet_stran`
FROM `knihy`
WHERE `pocet_stran` >= 300 and `pocet_stran` <= 400;


A dostáváme 5 odpovídajících záznamů:
+----------+---------------------------------+------------------+-------------+
| kniha_id | nazev                           | autor            | pocet_stran |
+----------+---------------------------------+------------------+-------------+
|        3 | Harry Potter a vězeň z Azkabanu | J. K. Rowling    |         383 |
|        7 | 1984                            | George Orwell    |         320 |
|        9 | Zelená míle                     | Stephen King     |         344 |
|       12 | Naslouchač                      | Petra Stehlíková |         374 |
|       13 | Nový svět                       | Shaun Tan        |         374 |
+----------+---------------------------------+------------------+-------------+


Porovnání s NULL

Pozor si musíme dát v případě že chceme v podmínce pracovat s hodnotou NULL. Nelze porovnávat sloupec = NULL nebo sloupec = 'NULL', takto zadána podmínka Vám nebude fungovat.

Pro porovnání s NULL musíme použít zápis sloupec IS NULL nebo pro opačný případ sloupec IS NOT NULL.


Řazení výsledků

Vy výchozím stavu jsou výsledky většinou seřazeny podle vložení, ted od nejstaršího. Často ale potřebujeme určit vlastní způsob řazení. Výsledky můžeme seřadit podle jakéhokoliv sloupce a to sestupně (desc) nebo vzestupně (asc).

Pro řazení použíjeme klíčová slova ORDER BY za nimiž následuje název sloupce a směr řazení asc/desc:
SELECT *
FROM `knihy`
WHERE `pocet_stran` > 500
ORDER BY `pocet_stran` desc;


Jako výsledek dostaneme všechny knihy, které mají nad 500 stránek seřazené sestupně dle délky:
+----------+-------------+-------------------+---------------------+-------------+
| kniha_id | nazev       | isbn              | autor               | pocet_stran |
+----------+-------------+-------------------+---------------------+-------------+
|        6 | Bouře mečů  | 978-80-257-2419-4 | George R. R. Martin |        1132 |
|        8 | Lovci kostí | 978-80-7197-334-8 | Steven Erikson      |         880 |
|       11 | Píseň krve  | 978-80-7491-602-1 | Anthony Ryan        |         624 |
|        1 | Duna        | 978-80-269-0517-2 | Frank Herbert       |         592 |
+----------+-------------+-------------------+---------------------+-------------+


Řadit můžeme i podle více sloupců než jednoho. Jednotlivé definice řazení můžeme zapisovat za sebou oddělené čárkou, např. rok desc, pocet_stran asc. Čím víc je definice na začátku, tím větší prioritu má. V tomto případě se tedy výsledky nejdříve seřadí sestupně dle roku vydání. Výsledky, které mají rok vydání stejný se pak budou dále řadit vzestupně dle počtu stran.

Pomocí ORDER BY RAND() lze nechat databázi, aby seřadila výsledky náhodně. Jde však o výkonové náročnou operaci a není tak vhodné ji často spouštět nad rozsáhlými tabulkami.


Omezení počtu výsledků

V předchozích případech nám vždy databáze vrátila všechny výsledky odpovídající námi zadané podmínce. Často však nepotřebujeme všechny, ale pouze nějakou jejich podčást. V mnoha případech je to také nevhodné ze stejných výkonových důvodů jako výběr všech sloupců. Pokud potřebujeme znát pouze jeden výsledek, je zbytečné načítat tisíce řádků.

K omezení výsledků slouží klíčové slovo LIMIT. Za ním může následovat 1 číslo, v takovém případě databáze vrátí uvedený počet výsledků. Pokud za limit uvedeme 2 čísla, první určuje od jaké pozice se výběr provede, druhá pak počet výsledků.

LIMIT lze využít i při aktualizaci dat pomocí UPDATE.


V našem knižním případě si to můžeme ilustrovat na příkladu, kdy nás zajímá pouze nejdelší kniha v databázi:
SELECT *
FROM `knihy`
ORDER BY `pocet_stran` desc
LIMIT 1;


Jako výsledek dostaneme jedinou knihu:
+----------+-------------+-------------------+---------------------+-------------+
| kniha_id | nazev       | isbn              | autor               | pocet_stran |
+----------+-------------+-------------------+---------------------+-------------+
|        6 | Bouře mečů  | 978-80-257-2419-4 | George R. R. Martin |        1132 |
+----------+-------------+-------------------+---------------------+-------------+


Pokud by nás zajímala například třetí nejdelší kniha, konec dotazu by vypadal takto: LIMIT 2, 1.

Při vytváření dotazu je důležité pořadí jednotlivých části. Není možné například přehodit části LIMIT a ORDER BY.


V příštím díle se podrobněji podíváme na pokročilejší podmínky a kombinace výběru v klauzuli WHERE.


Další díly tutoriálu

5. Mazání dat
6. Základy - co se jinam nevešlo
7. Základy vyhledávání
8. Pokročilé podmínky výběru
9. Spojování více tabulek - základy