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.
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 |
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 |
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 |
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 |
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ář |
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 |
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 |
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.