Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

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

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

Dnes sa v kurze MS-SQL zameriame na tú najkrajšiu časť, 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 dopytov robiť aj zložité výbery dát. Od jednoduchého výberu užívateľa podľa jeho Id (napr. na 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í alebo dokonca do dopytu zapojiť viac tabuliek, rôzne funkcie a skladať dopyty do seba (o tom až v ďalších lekciách).

Testovacie dáta

Pred skúšaním dooytov 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 Users vložiť nejaké záznamy, aby bolo s čím pracovať. Niečo som pre nás pripravil. Tabuľku si najskôr vyprázdnite (aby sme mali rovnaké dáta):

TRUNCATE TABLE [Users];

Ďalej spustite nasledujúci SQL dopyt:

INSERT INTO [Users] (
    [FirstName],
    [LastName],
    [BirthDate],
    [NumberOfArticles]
)
VALUES
    ('John', 'Smith', '1984-11-03', 17),
    ('Thomas', 'Williams', '1942-10-17', 6),
    ('Joseph', 'Miller', '1958-07-10', 9),
    ('Jeanette', 'Fraser', '1963-10-30', 7),
    ('Mead', 'McFetridge', '1950-09-09', 5),
    ('Griselda', 'Ashelford', '1986-11-01', 8),
    ('Terrijo', 'Chittenden', '1972-05-22', 3),
    ('Katlin', 'Edmands', '1988-06-14', 5),
    ('Frannie', 'Jzhakov', '1958-06-16', 0),
    ('Rosemarie', 'Mansbridge', '1978-10-20', 4),
    ('Bessie', 'McLice', '1965-07-31', 2),
    ('Melvin', 'Campey', '1977-01-16', 3),
    ('Read', 'Pane', '1991-10-10', 2),
    ('Michaeline', 'Olivey', '1948-02-08', 0),
    ('Helli', 'Douty', '1987-09-05', 1),
    ('Guy', 'Maris', '1956-05-16', 5),
    ('Cordie', 'Farryn', '1990-12-27', 8),
    ('Antoni', 'Burlingame', '1983-03-24', 1),
    ('Gilligan', 'Durrant', '1950-12-02', 7),
    ('Bambie', 'Goring', '1954-10-24', 14),
    ('Priscilla', 'Kingsnod', '1989-02-22', 5),
    ('Ian', 'Stroban', '1976-12-17', 8),
    ('Cart', 'Sinnett', '1972-07-14', 17),
    ('Lorna', 'Britian', '1954-02-20', 8),
    ('Any', 'Warburton', '1992-05-19', 4),
    ('Marjorie', 'Bohlje', '1978-03-11', 6),
    ('John', 'Hyam', '1964-07-06', 8),
    ('Bud', 'Dubarry', '1989-09-07', 4),
    ('Tadio', 'Arent', '1948-04-30', 5),
    ('Lenard', 'Weathers', '1986-07-12', 9),
    ('Abigale', 'Shale', '1982-06-20', 7);

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 VALUES sa dá v príkaze INSERT vložiť naraz viac, vloží sa tak viac položiek v jednom dopyte).

Dopytovanie

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

Table Data - MS-SQL databázy krok za krokom

Designer Visual Studia bol pre nás spočiatku takou 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ázu sa zavolá dopyt, ktorý vyberie iba desať prvých položiek. To sa hodí, ak je 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 dopyt T-SQL, ktorý môže vyzerať takto:

SELECT TOP 10 * FROM [Users]

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

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

Id Meno Priezvisko Dátum narodenia Počet článkov
1 Ján Smelý 1984-11-03 17
2 Tomáš Veľký 1942-10-17 6
3 Jozef Milý 1958-07-10 9
4 Jana Fritzká 1963-10-30 7
5 Marek Majtán 1950-09-09 5
6 Gabriela Abelová 1986-11-01 8
7 Tereza Múdra 1972-05-22 3
8 Katarína Lacková 1988-06-14 5
9 František Jelša 1958-06-16 0
10 Rastislav Marný 1978-10-20 4

WHERE

Dosť často potrebujeme získať dáta na základe určitých kritérií. Napríklad budeme hľadať iba užívateľov s menom John. Na tento účel sa používa klauzula WHERE, kde sa udávajú podmienky vo formáte meno stĺpca/operátor/hod­nota. Základné operátory =, >, <, >=, <= a != určite viete použiť. Zložitejšie si ukážeme ďalej v tejto lekcii. Dopyt pre vyhľadanie Jánov by vyzeral nasledovne:

SELECT * FROM [Users] WHERE [FirstName] = 'John';

Tu sme vypustili TOP 10, aby sme dostali všetkých Jánov.

Tabuľky majú väčšinou 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ť tie stĺpce, ktoré chceme. Dajme tomu, že budeme chcieť len priezvisko ľudí, ktorí sa volajú Ján, a ešte počet ich článkov. Dopyt upravíme:

SELECT [LastName], [NumberOfArticles] FROM [Users] WHERE [FirstName] = 'John';

Výsledok:

Priezvisko Počet článkov
Smelý 17
Hanák 8

Naozaj nebuďte leniví a ak nepotrebujete takmer všetky stĺpce, vymenujte v príkaze SELECT 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á dopyt vrátiť, nemá nič spoločné s ďalšími stĺpcami, ktoré v dopyte používame. Môžeme teda vyhľadávať podľa desiatich stĺpcov, ale vrátiť iba jeden.

Rovnako ako to bolo pri DELETE, aj tu bude fungovať iba dopyt:

SELECT * FROM [Users];

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

Teraz vyberme všetkých užívateľov, narodených od roku 1960 a s počtom článkov vyšším ako päť:

SELECT * FROM [Users] WHERE [BirthDate] >= '1960-1-1' AND [NumberOfArticles] > 5;

Výsledok:

Id Meno Priezvisko Dátum narodenia Počet článkov
1 Ján Malý 1984-11-03 17
4 Jana Fritzká 1963-10-30 7
6 Gabriela Abelová 1986-11-01 8
17 Karin Farbiarová 1990-12-27 8
22 Juraj Sopko 1976-12-17 8
23 Karol Smelý 1972-07-14 17
26 Martina Bodová 1978-03-11 6
27 Ján Hanák 1964-07-06 8
30 Leonard Veselý 1986-07-12 9
31 Andrea Sušková 1982-06-20 7

Všimnite si v dopyte slová AND. To určuje, že obe podmienky musia byť splnené. Ak by sme chceli, aby sa do výsledku zaradilo všetko, čo spĺňa aspoň jednu podmienku, namiesto AND by sme použili OR. Dopyt by potom po slovensky znel: "Vyber všetky stĺpce užívateľov, ktorí sa narodili od roku 1960 alebo napísali viac ako päť článkov".

Operátory

V SQL máme aj ďalších operátorov, 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ť dva zástupné znaky:

  • % (percento) 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 dopytov s operátorom LIKE. Nájdime priezvisko ľudí začínajúce na "S":

SELECT [LastName] FROM [Users] WHERE [LastName] LIKE 's%';

Text zadáme ako vždy 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 dopytu bude nasledujúci:

Priezvisko
Smelý
Stanko
Sabadoš
Surový

Teraz skúsme nájsť päťpísmenové priezviská, ktoré majú ako druhý znak O. Je všeobecne odporúčané odstraňovať v hodnotách odovzdávaných LIKE biele znaky. To docielite funkciami LTRIM() a RTRIM(), ktoré odstraňujú biele znaky zľava a sprava:

SELECT [LastName] FROM [Users] WHERE RTRIM([LastName]) LIKE '_o___';

Výsledok:

Priezvisko
Smelý

Asi už tušíte, 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 (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žívatelia s týmito menami:

SELECT [FirstName], [LastName] FROM [Users] WHERE [FirstName] IN ('Joseph', 'John', 'Priscilla');

Výsledok:

Meno Priezvisko
Ján Smelý
Jozef Majtán
Patrícia Kinská
Ján Hanák

Operátor IN sa používa ešte pri tzv. poddopytoch, 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 [FirstName], [LastName], [BirthDate] FROM [Users] WHERE [BirthDate] BETWEEN '1980-1-1' AND '1990-12-31';

Medzi dve hodnoty píšeme AND.

Výsledok:

Meno Priezvisko Dátum narodenia
Ján Smelý 1984-11-03
Gabriela Abelová 1986-11-01
Katarína Ebenová 1988-06-14
Helena Drahá 1987-09-05
Cecília Farská 1990-12-27
Anton Balog 1983-03-24
Patrícia Kinská 1989-02-22
Branislav Dolný 1989-09-07
Leonard Veselý 1986-07-12
Agnesa Sladká 1982-06-20

Dopyt by sme mohli vylepšiť porovnávaním len roku z daného dátumu pomocou funkcie YEAR():

SELECT [FirstName], [LastName], [BirthDate] FROM [Users] WHERE YEAR([BirthDate]) BETWEEN 1980 AND 1990;

To je na dnes všetko. Pri výbere dát zostaneme ešte niekoľko dielov, vlastne väčšinu tohto online MS-SQL kurzu.

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


 

Predchádzajúci článok
Riešené úlohy k 1.-5. lekcii MS-SQL
Všetky články v sekcii
MS-SQL databázy krok za krokom
Preskočiť článok
(neodporúčame)
Riešené úlohy k 6. lekcii MS-SQL
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
23 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