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:

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