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í.

4. diel - MS-SQL krok za krokom: Výber dát (vyhľadávanie)

V minulej lekcii, MS-SQL krok za krokom: Vkladanie a mazanie dát v tabuľke , sme si ukázali vkladanie a mazanie záznamov.

Dnes sa v MS-SQL tutoriálu zameriame na tú najkrajšiu časť a tou je výber dát. Jedná sa o dotazovanie na dáta, či 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 prostého výberu užívateľa podľa jeho Id (napr. Pre zobrazenie detailov v aplikácii) môžeme vyhľadávať užívateľa spĺňajúce určité vlastnosti, výsledky zoradiť podľa rôznych kritérií alebo dokonca do dotazu zapojiť viac tabuliek, rôzne funkcie a skladať dotazy do seba (o tom až v ďalších lekciách ).

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 Uzivatele vložiť nejaké záznamy, aby bolo s čím pracovať. Niečo som pre nás pripravil. Tabuľku si najprv vyprázdnite (aby sme mali rovnaké dáta):

DELETE FROM [Uzivatele];

Ďalej spustite nasledujúci SQL dotaz:

INSERT INTO [Uzivatele] (
        [Jmeno],
        [Prijmeni],
        [DatumNarozeni],
        [PocetClanku]
)
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ítězslav', '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.

(Mimochodom, všimnite si, že sa dá VALUES v príkaze INSERT vložit naraz viac, vloží sa tak viac položiek v jednom dotaze).

Dopytovania

Dotaz na dáta, teda ich vyhľadanie / výber, sme už vlastne videli, keď sme riadok pridávali. Pre rekapituláciu zobrazíte všetky dáta kliknutím pravým tlačidlom na tabuľku a vybraním Show Table Data.

Dáta vo Visual Studiu - MS-SQL databázy krok za krokom

Designer Visual Studia bol pre nás spočiatku takú barličkou, ale teraz pre nás už prestáva byť zaujímavý. Narážame totiž na jeho hranice, jediné, čo tu môžeme nastaviť, je počet riadkov. Do políčka Max Rows zadajte napr. 10 a potvrďte. Na databáze sa zavolá dotaz, ktorý vyberie iba 10 prvých položiek. To sa hodí ak databáza rozsiahla, aby ste neposielali úplne všetko. Ak chcete naozaj všetky dáta (a neviete koľko ich je), tak z ponuky zvolíte All.

Na pozadí Visual Studio posiela do databázy samozrejme T-SQL dotaz, ktorý môže vyzerať nasledovne:

SELECT TOP 10 * FROM [Uzivatele]

Príkaz je asi celkom zrozumiteľný, TOP 10 hovorí, že chceme 10 riadku z vrchu (prvých 10) a tá hviezdička označuje, že chceme vybrať všetky stĺpce. Otázka teda slovensky znie: "Vyber prvých 10 riadkov a všetky stĺpce z tabuľky užívateľ".

Výsledok dotazu nám Visual Studio zobrazí, mali by ste vidieť takúto tabuľku:

Id jmeno Prijmeni DatumNarozeni PocetClanku
8 Jan Novák 1984-11-03 17
9 Tomáš márny 1942-10-17 12
10 Josef nový 1958-07-10 5
11 Alfons sloboda 1935-05-15 6
12 Ludmila Dvořákova 1967-04-17 2
13 Petr cierny 1995-02-20 1
14 Vladimír pokorný 1984-04-18 1
15 ondrej bohatý 1973-05-14 3
16 Vítězslava Churý 1969-06-02 7
17 pavel Procházka 1962-07-03 8
Pozn .: Visual Studio nezobrazuje vo výsledkoch všetku diakritiku, čo je normálne a nemá to na dáta žiadny vplyv.

Where

Dosť často potrebujeme získať dáta na základe určitých kritérií. Napríklad budeme hľadať iba Jany. K tomuto účelu sa používa klauzuly WHERE, kde sa udávajú podmienky vo formáte sloupec operátor hodnota. Základný operátormi =, >, <, >=, <= a != Určite viete použiť. Zložitejšie si ukážeme ďalej v tejto lekcii. Otázka pre vyhľadanie Janů by vyzeral nasledovne.

SELECT * FROM [Uzivatele] WHERE [Jmeno] = 'Jan';

Tu sme vypustili TOP 10, aby sme dostali všetky Jany.

Tabuľky majú väčšinou veľa 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ť 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ázka upravíme:

SELECT [Prijmeni], [PocetClanku] FROM [Uzivatele] WHERE [Jmeno] = 'Jan';

výsledok:

Prijmeni PocetClanku
Novák 17
Spáčil 3
Naozaj nebuďte leniví a ak nepotrebujete takmer všetky stĺpce, vymenujte v SELECT tie, ktorých hodnoty vás v tú chvíľu zaujímajú. Vždy sa snažte podmienku obmedziť čo najviac už na úrovni databázy, nie že si vyťaháme 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ĺpci, ktoré v dotaze používame. Môžeme teda vyhľadávať podľa desiatich stĺpcov, ale vrátiť len jeden.

Rovnako ako tomu bolo pri DELETE, aj tu bude fungovať iba otázka:

SELECT * FROM [Uzivatele];

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

Teraz vyberme všetkých užívateľov, narodené od roku 1960 as počtom článkov vyšším ako 5:

SELECT * FROM [Uzivatele] WHERE [DatumNarozeni] >= '1960-1-1' AND [PocetClanku] > 5;

výsledok:

Id jmeno Prijmeni DatumNarozeni PocetClanku
8 Jan Novák 1984-11-03 17
16 Vítězslava 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
Všimnite si v dotaze slová AND. To určuje, že podmienky musia byť splnené obe. Ak by sme chceli, aby sa do výsledku zaradilo všetko, čo spĺňa aspoň jednu podmienku, miesto AND by sme použili OR. Otázka by potom slovensky znel: "Vyber všetky stĺpce užívateľov, ktorí sa narodili od roku 1960 alebo napísali viac ako 5 článkov".

Operátormi

V SQL máme i ďalšie operátormi, 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), len môžeme používať 2 zástupné znaky:

  • % (Percento) označuje ľubovoľný počet ľubovoľných znakov.
  • _ (Podčiarkovník) 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úce na "S":

SELECT [Prijmeni] FROM [Uzivatele] WHERE [Prijmeni] LIKE 's%';

Text zadáme ako vždy apostrofmi, 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:

Prijmeni
sloboda
Svobodová
Spáčil
Teraz skúsme nájsť pětipísmenná priezvisko, ktoré majú ako 2. znak "O". Je všeobecne doporučované odstraňovať v hodnotách odovzdávaných LIKE biele znaky. Toho docielite funkciami LTRIM() a RTRIM(), ktoré odstraňujú biele znaky zľava a sprava:
SELECT [Prijmeni] FROM [Uzivatele] WHERE RTRIM([Prijmeni]) LIKE '_o___';

výsledok:

Prijmeni
Novák
Horák
Kovář
Asi už tušíte, ako LIKE funguje. Použitie možno 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 výpočet mien a vyhľadajme užívatelia s týmito menami:

SELECT [Jmeno], [Prijmeni] FROM [Uzivatele] WHERE [Jmeno] IN ('Petr', 'Jan', 'Kateřina');

výsledok:

jmeno Prijmeni
Jan Novák
Petr Čierny
Petr Dvořák
Kateřina Koubová
Jan Spáčil
Operátor IN sa používa ešte u tzv. Poddotazov, 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 bežne porovnávať. Nájdime si užívateľov, ktorí sa narodili medzi rokmi 1980 a 1990:

SELECT [Jmeno], [Prijmeni], [DatumNarozeni] FROM [Uzivatele] WHERE [DatumNarozeni] BETWEEN '1980-1-1' AND '1990-1-1';

Medzi 2 hodnoty píšeme AND.

výsledok:

jmeno Prijmeni DatumNarozeni
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
Otázka by sme mohli vylepšiť porovnávaním len roka z daného dáta pomocou funkcie YEAR():
SELECT [Jmeno], [Prijmeni], [DatumNarozeni] FROM [Uzivatele] WHERE YEAR([DatumNarozeni]) BETWEEN 1980 AND 1990;

To je pre dnešok všetko. U výberu dát zostaneme ešte niekoľko dielov, vlastne väčšinu tohto on-line MS-SQL kurzu.

V budúcej lekcii, MS-SQL krok za krokom: Radenie, Limit a agregačné funkcie , sa pozrieme na radenie a agregačné funkcie.


 

Predchádzajúci článok
MS-SQL krok za krokom: Vkladanie a mazanie dát v tabuľke
Všetky články v sekcii
MS-SQL databázy krok za krokom
Preskočiť článok
(neodporúčame)
MS-SQL krok za krokom: Radenie, Limit a agregačné funkcie
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
5 hlasov
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity