Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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. lekcii 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 sa 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 dotazov robiť aj zložité výbery. Od jednoduchého výberu používateľa podľa jeho ID (napríklad pre zobrazenie detailov v aplikácii) môžeme vyhľadávať používateľov spĺňajúcich určité vlastnosti, výsledky zoradiť podľa rôznych kritérií. Je možné dokonca do dotazu zapojiť viacero tabuliek, rôzne funkcie alebo skladať dotazy do seba.

Príprava testovacích dát

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

TRUNCATE TABLE `users`;

Ďalej spustíme nasledovný SQL príkaz:

INSERT INTO `users` (
        `first_name`,
        `last_name`,
        `birthdate`,
        `article_count`
)
VALUES
('John',  'Smith',  '1984-11-03', 17),
('Steven', 'Murphy', '1942-10-17', 12),
('George', 'Lam', '1958-7-10', 5),
('Linda', 'Martin', '1935-5-15', 6),
('Donald', 'Brown', '1967-4-17', 2),
('Aron', 'Heaven', '1995-2-20', 1),
('Paul', 'Lee', '1984-4-18', 1),
('David', 'Clark', '1973-5-14', 3),
('Mark', 'Wilson', '1969-6-2', 7),
('Sarah', 'Johnson', '1962-7-3', 8),
('Charles', 'Lopez', '1974-9-10', 0),
('Jennifer', 'Williams', '1976-10-2', 1),
('Daniel', 'Jones', '1948-11-3', 1),
('Betty', 'Miller', '1947-5-9', 1),
('Michelle', 'Davis', '1956-3-7', 0),
('Mary', 'Taylor', '1954-2-11', 5),
('Barbara', 'Thomas', '1978-1-21', 3),
('Donna', 'Johnson', '1949-7-26', 12),
('Joseph', 'Murphy', '1973-7-28', 4),
('Helen', 'Murphy', '1980-8-11', 8),
('Jeff', 'Moore', '1982-9-30', 18),
('Anthony', 'Jackson', '1961-1-15', 2),
('Nancy', 'Thompson', '1950-8-29', 4),
('Edward', 'White', '1974-2-26', 5),
('Lucy', 'Harris', '1983-3-2', 2),
('Paul', 'Walker', '1991-5-1', 9),
('Carol', 'Young', '1992-12-17', 9),
('James', 'Baker', '1956-11-15', 4),
('Patricia', 'Adams', '1953-10-20', 6),
('Lisa', 'Green', '1967-5-6', 3),
('John', 'Johnson', '1946-3-10', 6);

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

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

Dotazovanie

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

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

Tu stačí zadať nejakú hodnotu do stĺpca Value. Ak v tomto stĺpci vyplníme viac polí, 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 barličkou, ale teraz pre nás už prestáva byť zaujímavý. Budeme ho používať hlavne na spúšťanie dotazov a ukazovanie ich výsledkov.

Základný dotaz pre výber všetkých osôb z tabuľky s krstným menom John by vyzeral takto:

SELECT * FROM `users` WHERE `first_name` = 'John';

Hviezdička v dotaze označuje, že chceme vybrať všetky stĺpce. Príkaz teda po slovensky znie: "Vyber všetky stĺpce z tabuľky users, kde má stĺpec first_name hodnotu John ".

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

1    John    Smith     1984-11-03    17
31   John    Johnson   1946-03-10     6

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ú John a k tomu počet článkov, ktoré napísali. Príkaz upravíme:

SELECT `last_name`, `article_count` FROM `users` WHERE `first_name` = 'John';

Výsledok:

Smith     17
Johnson    6

Naozaj je v tomto prípade dobré nebyť lenivý. Ak nepotrebujeme 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 až tam si ich ešte len začať filtrovať. 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:

SELECT * FROM `users`;

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 používateľov, narodených v roku 1960 a neskôr s počtom článkov vyšším ako päť:

SELECT * FROM `users` WHERE `birthdate` >= '1960-1-1' AND `article_count` > 5;

Výsledok:

1     John          Smith       1984-11-03    17
9     Mark          Wilson      1969-06-02    7
10    Sarah         Johnson     1962-07-03    8
20    Helen         Murphy      1980-08-11    8
21    Jeff          Moore       1982-09-30    18
26    Paul          Walker      1991-05-01    9
27    Carol         Young       1992-12-17    9

Operátory

Základné operátoroy =, >, <, >=, <=, != si popisovať nemusíme. V SQL máme ale aj ďalšie operátory:

  • LIKE,
  • IN,
  • a BETWEEN.

Poďme si ich rozobrať.

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 W:

SELECT `last_name` FROM `users` WHERE `last_name` LIKE 'w%';

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

Výsledok dotazu bude nasledovný:

Wilson
Williams
White
Walker

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

SELECT `last_name` FROM `users` WHERE `last_name` LIKE '_o___';

Výsledok:

Lopez
Jones
Moore
Young

Asi už tušíme, ako LIKE funguje. Použití 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 používateľov s týmito menami:

SELECT `first_name`, `last_name` FROM `users` WHERE `first_name` IN ('Paul', 'John', 'Barbara');

Výsledok:

John        Smith
Paul        Lee
Barbara     Thomas
Paul        Walker
John        Johnson

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 používateľov, ktorí sa narodili medzi rokmi 1980 a 1990:

SELECT `first_name`, `last_name`, `birthdate` FROM `users` WHERE `birthdate` BETWEEN '1980-1-1' AND '1989-12-31';

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

Výsledok:

John        Smith        1984-11-03
Paul        Lee          1984-04-18
Helen       Murphy       1980-08-11
Jeff        Moore        1982-09-30
Luccy       Harris       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 použí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 aj čas, by nám takého používateľa nenašiel. Aby sme získali všetkých používateľov narodených od roku 1980 do konca roku 1989, museli by sme otázku upraviť takto:

SELECT `first_name`, `last_name`, `birthdate` FROM `users` WHERE `birthdate` 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é 14x (2.56 kB)
Aplikácia je vrátane zdrojových kódov v jazyku mysql

 

Predchádzajúci článok
Riešené úlohy k 1.-5. lekcii 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:
20 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