IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

6. diel - MySQL krok za krokom - Výber dát (vyhľadávanie)

V predchádzajúcom cvičení, Riešené úlohy k 1.-5. lekciu MySQL / MariaDB, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V dnešnom MySQL tutoriále sa zameriame na tú najkrajšiu časť práce s databázou a tou je výber dát. Ide o dotazovanie na dáta, inými slovami vyhľadávanie dát v tabuľke.

Vyhľadávanie dát je kľúčovou funkciou databáz, umožňuje nám totiž pomocou relatívne jednoduchých otázok robiť aj zložité výbery. Od jednoduchého výberu užívateľa podľa jeho ID (napríklad pre zobrazenie detailov v aplikácii) môžeme vyhľadávať užívateľov spĺňajúcich určité vlastnosti, výsledky zoradiť podľa rôznych kritérií. Je možné dokonca do dotazu zapojiť viac tabuliek, rôzne funkcie alebo skladať otázky do seba.

Príprava testovacích dát

Pred skúšaním otázok je vždy dobré mať nejaké testovacie dáta, aby sme mali s čím pracovať a nemali v tabuľke len štyroch užívateľov. Poďme si do našej tabuľky uzivatele vložiť viac záznamov. Pôvodnú tabuľku si najskôr vyprázdnime, aby sme v nej mali rovnaké dáta:

TRUNCATE TABLE `uzivatele`;

Ďalej spustíme nasledujúci SQL príkaz:

INSERT INTO `uzivatele` (
    `jmeno`,
    `prijmeni`,
    `datum_narozeni`,
    `pocet_clanku`
)
VALUES
    ('Jan',  'Novák',  '1984-11-03', 17),
    ('Tomáš', 'Marný', '1942-10-17', 12),
    ('Josef', 'Nový', '1958-7-10', 5),
    ('Alfons', 'Svoboda', '1935-5-15', 6),
    ('Ludmila', 'Dvořáková', '1967-4-17', 2),
    ('Petr', 'Černý', '1995-2-20', 1),
    ('Vladimír', 'Pokorný', '1984-4-18', 1),
    ('Ondřej', 'Bohatý', '1973-5-14', 3),
    ('Vítezslav', 'Churý', '1969-6-2', 7),
    ('Pavel', 'Procházka', '1962-7-3', 8),
    ('Matěj', 'Horák', '1974-9-10', 0),
    ('Jana', 'Veselá', '1976-10-2', 1),
    ('Miroslav', 'Kučera', '1948-11-3', 1),
    ('František', 'Veselý', '1947-5-9', 1),
    ('Michal', 'Krejčí', '1956-3-7', 0),
    ('Lenka', 'Němcová', '1954-2-11', 5),
    ('Věra', 'Marková', '1978-1-21', 3),
    ('Eva', 'Kučerová', '1949-7-26', 12),
    ('Lucie', 'Novotná', '1973-7-28', 4),
    ('Jaroslav', 'Novotný', '1980-8-11', 8),
    ('Petr', 'Dvořák', '1982-9-30', 18),
    ('Jiří', 'Veselý', '1961-1-15', 2),
    ('Martina', 'Krejčí', '1950-8-29', 4),
    ('Marie', 'Černá', '1974-2-26', 5),
    ('Věra', 'Svobodová', '1983-3-2', 2),
    ('Pavel', 'Dušín', '1991-5-1', 9),
    ('Otakar', 'Kovář', '1992-12-17', 9),
    ('Kateřina', 'Koubová', '1956-11-15', 4),
    ('Václav', 'Blažek', '1953-10-20', 6),
    ('Jan', 'Spáčil', '1967-5-6', 3),
    ('Zdeněk', 'Malačka', '1946-3-10', 6);

V databáze máme 31 užívateľov. To by malo stačiť na to, aby sme si na nich vyskúšali základy dopytovania.

Už vieme, že môžeme za kľúčovým slovom VALUES uviesť viac záznamov a nemusíme teda pre každého používateľa písať vlastnú otázku.

Dopytovanie

Jednoduchý dotaz na dáta, teda na ich vyhľadanie alebo výber môžeme v prostredí phpMyAdmin vytvoriť v záložke Vyhľadávanie v hornej lište. Otvoríme ním nasledujúce okno:

Vyhľadávanie v phpMyAdmin - MySQL databázy krok za krokom - MySQL databázy krok za krokom

Tu stačí zadať nejakú hodnotu do stĺpca Hodnota. Pokiaľ v tomto stĺpci vyplníme polí viac, bude sa hľadať podľa viacerých hodnôt. Operátory si vysvetlíme vzápätí.

Nástroj phpMyAdmin bol pre nás spočiatku takou berličkou, ale teraz pre nás už prestáva byť zaujímavý. Budeme ho používať hlavne na spúšťanie otázok a ukazovanie ich výsledkov.

Základná otázka pre výber všetkých osôb z tabuľky s krstným menom Jan by vyzerala takto:

SELECT * FROM `uzivatele` WHERE `jmeno` = 'Jan';

Hviezdička v dotaze označuje, že chceme vybrať všetky stĺpce. Otázka teda po slovensky znie: "Vyber všetky stĺpce z tabuľky uzivatele, kde má stĺpce jmeno hodnotu Jan ".

Výsledok dotazu nám phpMyAdmin zobrazí. Nájdeme v ňom dva záznamy:

8    Jan    Novák     1984-11-03    17
37   Jan    Spáčil    1967-05-06    3

Tabuľky majú mnoho stĺpcov a väčšinou nás zaujímajú len nejaké. Aby sme databázu nezaťažovali prenášaním zbytočných dát späť do našej aplikácie, budeme sa snažiť vždy špecifikovať stĺpce, ktoré chceme zobraziť.

Výber stĺpcov v dotaze

Dajme tomu, že budeme chcieť len priezvisko ľudí, ktorí sa volajú Jan ak tomu počet článkov, ktoré napísali. Otázku upravíme:

SELECT `prijmeni`, `pocet_clanku` FROM `uzivatele` WHERE `jmeno` = 'Jan';

Výsledok:

Novák     17
Spáčil    3

Naozaj je v tomto prípade dobré nebyť leniví. Pokiaľ nepotrebujeme takmer všetky stĺpce, vymenujeme v dotaze iba tie, ktorých hodnoty nás v tej chvíli zaujímajú.

Vždy sa snažíme podmienku obmedziť čo najviac už na úrovni databázy. Z hľadiska výkonu nie je dobré získavať dáta celej tabuľky do aplikácie a tam si ju ešte len vyfiltrovať. Povedzme, že by potom naša aplikácia nebola úplne rýchla:)

Výpočet stĺpcov, ktoré má dotaz vrátiť, nemá nič spoločné s ďalšími stĺpcami, ktoré v dotaze používame. Môžeme teda vyhľadávať podľa desiatich stĺpcov, ale vrátiť iba jeden.

Rovnako ako to bolo u DELETE, aj tu bude fungovať iba otázka:

SELECT * FROM `uzivatele`;

Vtedy budú vybraní úplne všetci používatelia z tabuľky.

Pri podmienkovaní platí to isté, ako pri DELETE, klauzula WHERE tu funguje úplne rovnako. Skúsme si to. Vyberme všetkých užívateľov, narodených v roku 1960 a neskôr s počtom článkov vyšším ako päť:

SELECT * FROM `uzivatele` WHERE `datum_narozeni` >= '1960-1-1' AND `pocet_clanku` > 5;

Výsledok:

8     Jan          Novák        1984-11-03    17
16    Vítezslav    Churý        1969-06-02    7
17    Pavel        Procházka    1962-07-03    8
27    Jaroslav     Novotný      1980-08-11    8
28    Petr         Dvořák       1982-09-30    18
33    Pavel        Dušín        1991-05-01    9
34    Otakar       Kovář        1992-12-17    9

Operátorov

Základných operátorov =, >, <, >=, <=, != si popisovať nemusíme. V SQL máme ale aj ďalších operátorov:

  • LIKE,
  • IN
  • a BETWEEN.
Poďme si ich popísať.

Operátor LIKE

Tento operátor umožňuje vyhľadávať textové hodnoty len podľa časti textu. Funguje podobne ako operátor =, ale môžeme s ním používať dva zástupné znaky:

  • % označuje ľubovoľný počet ľubovoľných znakov.
  • _ (podčiarknutie) označuje jeden ľubovoľný znak.
Poďme si vyskúšať niekoľko otázok s operátorom LIKE. Nájdime priezvisko ľudí začínajúcich na S:
SELECT `prijmeni` FROM `uzivatele` WHERE `prijmeni` LIKE 's%';

Všimnime si, že na veľkosti hľadaného písmena nezáleží. Hľadanie je case-insensitive.

Výsledok dotazu bude nasledujúci:

Svoboda
Svobodová
Spáčil

Teraz skúsme nájsť päťpísmenové priezviská, ktoré majú ako druhý znak O:

SELECT `prijmeni` FROM `uzivatele` WHERE `prijmeni` LIKE '_o___';

Výsledok:

Novák
Horák
Kovář

Asi už tušíme, ako LIKE funguje. Použitie je možné vymyslieť veľa, väčšinou sa používa s percentami na oboch stranách pre fulltextové vyhľadávanie.

Operátor IN

Operátor IN umožňuje vyhľadávať pomocou zoznamu prvkov. Urobme si teda zoznam mien a vyhľadajme užívatelia s týmito menami:

SELECT `jmeno`, `prijmeni` FROM `uzivatele` WHERE `jmeno` IN ('Petr', 'Jan', 'Kateřina');

Výsledok:

Jan         Novák
Petr        Černý
Petr        Dvořák
Kateřina    Koubová
Jan         Spáčil

Operátor IN sa používa ešte pri tzv. poddotazoch, ale na tie máme ešte dosť času :)

Operátor BETWEEN

Posledný operátor, ktorý si dnes vysvetlíme, nie je ničím iným, než skráteným zápisom podmienky >= AND <=. Využime ho na nájdenie užívateľov, ktorí sa narodili medzi rokmi 1980 a 1990:

SELECT `jmeno`, `prijmeni`, `datum_narozeni` FROM `uzivatele` WHERE `datum_narozeni` BETWEEN '1980-1-1' AND '1989-12-31';

Medzi dve hodnoty píšeme aj operátor AND.

Výsledok:

Jan         Novák        1984-11-03
Vladimír    Pokorný      1984-04-18
Jaroslav    Novotný      1980-08-11
Petr        Dvořák       1982-09-30
Věra        Svobodová    1983-03-02

Vzorový príklad s operátorom BETWEEN a jeho alternatívny zápis prináša očakávané výsledky vzťahujúce sa predovšetkým k dátovému typu DATE. Pri type DATETIME, ktorý býva používaný častejšie, však dochádza k mierne odlišným výsledkom. Dátový typ DATETIME totiž zahŕňa aj čas, ktorý má východiskovú hodnotu 00:00:00.

Predstavme si, že máme v tabuľke užívateľov osobu s dátumom narodenia (typu DATETIME) nastaveným na hodnotu 1989-12-31 12:00:00. Pôvodný dotaz vyššie, pokiaľ v ňom nešpecifikujeme tiež čas, by nám takého užívateľa nenašiel. Aby sme získali všetkých užívateľov narodených od roku 1980 do konca roku 1989, museli by sme otázku upraviť takto:

SELECT `jmeno`, `prijmeni`, `datum_narozeni` FROM `uzivatele` WHERE `datum_narozeni` BETWEEN '1980-1-1 00:00:00' AND '1989-12-31 23:59:59';

Pri výbere dát zostaneme ešte niekoľko lekcií, vlastne väčšinu tohto kurzu.

V nasledujúcom cvičení, Riešené úlohy k 6. lekcii MySQL/MariaDB, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 12x (2.69 kB)
Aplikácia je vrátane zdrojových kódov v jazyku mysql

 

Predchádzajúci článok
Riešené úlohy k 1.-5. lekciu MySQL / MariaDB
Všetky články v sekcii
MySQL databázy krok za krokom
Preskočiť článok
(neodporúčame)
Riešené úlohy k 6. lekcii MySQL/MariaDB
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
3 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity