4. diel - SQLite - Výber dát (vyhľadávanie)
V minulej lekcii, SQLite - Vkladanie a mazanie dát v tabuľke , sme si ukázali vkladanie a mazanie záznamov.
Dnes sa zameriame na tú najkrajšiu časť a tou je výber dát. Ide o dopytovanie na dáta, ak chcete, tak vyhľadávanie v tabuľke.
Výber 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 dát. Od jednoduchého výberu užívateľa podľa jeho id (napr. pre zobrazenie detailov v aplikácii) môžeme vyhľadávať užívateľov spĺňajúcich určité vlastnosti, výsledky radiť podľa rôznych kritérií alebo dokonca do dotazu zapojiť viac tabuliek, rôzne funkcie a skladať otázky do seba (o tom až v ďalších dieloch ).
Testovacie dáta
Pred skúšaním otázok je vždy dobré mať nejaké testovacie dáta, aby sme mali s čím pracovať a nemali tam len 4 užívateľov. Poďme si do našej tabuľky používateľa vložiť nejaké záznamy, aby bolo s čím pracovať. Niečo som vám pripravil. Tabuľku si najskôr vyprázdnite (aby sme mali rovnaké dáta):
DELETE FROM "uzivatele";
Ďalej spustite nasledujúci SQL dotaz:
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 38 užívateľov. To by malo stačiť na to, aby ste si na nich vyskúšali základy dopytovania.
(Mimochodom, všimnite si, že sa dá VALUES v príkaze INSERT vložiť naraz viac, vloží sa tak viac položiek v jednom dotaze).
Dopytovanie
Otázku na dáta, teda ich vyhľadanie/výber nájdete v prostredí DB Browsera na paneli Browse Data. Môžete si to skúsiť, stačí zadať nejakú hodnotu do nejakého poľa Filter. Operátory, ktoré vo vyhľadávaní hrajú veľkú úlohu, si vysvetlíme ďalej.
DB Browser 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 Jánov z tabuľky by vyzerala takto:
SELECT * FROM "uzivatele" WHERE "jmeno" = 'Jan';
Príkaz je asi zrozumiteľný, tá hviezdička označuje, že chceme vybrať všetky stĺpce. Otázka teda po slovensky znie: "Vyber všetky stĺpce z tabuľky používateľa, kde je meno Ján".
Výsledok dotazu nám phpMyAdmin zobrazí, mali by ste vidieť toto:
6 Jan Novák 1984-11-03 17 35 Jan Spáčil 1967-05-06 3
Tabuľky majú väčšinou veľa stĺpcov a väčšinou nás zaujímajú iba 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ť tie stĺpce, ktoré chceme. Dajme tomu, že budeme chcieť len priezvisko ľudí, čo sa volajú Ján a ešte počet ich článkov. Otázku upravíme:
SELECT "prijmeni", "pocet_clanku" FROM "uzivatele" WHERE "jmeno" = 'Jan';
Výsledok:
Novák 17 Spáčil 3
Naozaj nebuďte leniví a pokiaľ nepotrebujete takmer všetky stĺpce, vymenujte v SELECTe tie, ktorých hodnoty vás v tej chvíli zaujímajú. Vždy sa snažte podmienku obmedziť čo najviac už na úrovni databázy, nie že si vyťaháte celú tabuľku do aplikácie a tam si ju vyfiltrujete. Povedzme, že by vaša aplikácia potom 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 funguje úplne rovnako. Skúsme si to. Vyberme všetkých užívateľov, narodených po roku 1960 as počtom článkov vyšším ako 5:
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 =, >, <, >=, <=, != určite viete použiť. V SQL máme ale ďalšie, povedzme si o LIKE, IN a BETWEEN.
LIKE
Like umožňuje vyhľadávať textové hodnoty len podľa časti textu. Funguje podobne, ako operátor "=" (rovná sa), iba môžeme používať 2 zástupné znaky:
- % (percento) označuje ľubovoľný počet ľubovoľných znakov.
- _ (podčiarknutie) označuje jeden ľubovoľný znak.
SELECT "prijmeni" FROM "uzivatele" WHERE "prijmeni" LIKE 's%';
Zadáme normálne text v apostrofoch, iba na niektoré miesta môžeme vložiť špeciálne znaky. Na veľkosti písmen nezáleží (hľadanie je teda case-insensitive). Výsledok dotazu bude nasledujúci:
Svoboda Svobodová Spáčil
Teraz skúsme nájsť päťpísmenové priezviská, ktoré majú ako 2. znak O:
SELECT "prijmeni" FROM "uzivatele" WHERE "prijmeni" LIKE '_o___';
Výsledok:
Novák Horák Kovář
Asi už tušíte, 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 (napr. slová v texte článku).
IN == IN umožňuje vyhľadávať pomocou zoznamu prvkov. Urobme si teda zoznam mien a vyhľadajme užívateľa 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
BETWEEN
Posledný operátor, ktorý si dnes vysvetlíme, je BETWEEN (teda medzi). Nie je ničím iným, než skráteným zápisom podmienky ">= AND <=". Už vieme, že aj dátumy môžeme normálne porovnávať, nájdime si 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 '1990-1-1';
Medzi 2 hodnoty píšeme 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
To je pre dnešok všetko. Pri výbere dát zostaneme ešte niekoľko dielov, vlastne väčšinu tohto seriálu.
V nasledujúcom kvíze, Kvíz - Tvorba, mazanie, vkladanie a výber dát v SQLite, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.