5. diel - MS-SQL krok za krokom: Radenie, Limit a agregačné funkcie
V minulej lekcii, MS-SQL krok za krokom: Vývoz , sme si ukázali rôzne typy exportov databázy.
Dnes sa v MS-SQL tutoriálu pozrime na radenie a agregačné funkcie.
Radenie
Doteraz sme nijako neriešili poradie nájdených výsledkov, ktoré nám
dotaz SELECT
vrátil. Niektoré databázy neudržujú žiadne
poradie prvkov a vracia ich tak, ako sa im to práve hodilo. MS-SQL je výnimka
a výsledky vracia vždy Zoradiť podľa Id
. Databáza nám ale
navrátený výsledok samozrejme zoradiť dokáže, keď si o to povieme.
Radiť môžeme podľa ktoréhokoľvek stĺpca. Keď budeme radiť podľa
Id
alebo ponecháme predvolené radenie, máme položky v poradí,
v akom boli do databázy vložené. Ďalej môžeme radiť podľa číselných
stĺpcov, ale aj podľa tých textových (radí sa podľa abecedy). Radiť
môžeme aj podľa dátumu a všetkých ďalších dátových typov, databázy
si s tým vždy nejako poradia. Poďme si vybrať úplne všetkých
užívateľov a zoradí ich podľa priezviska. Slúži na to klauzuly
ORDER BY
(radiť podľa), ktorá sa píše na koniec dotazu:
SELECT [Jmeno], [Prijmeni] FROM [Uzivatele] ORDER BY [Prijmeni]
výsledok:
jmeno | Prijmeni |
---|---|
Václav | Blažek |
Ondřej | bohatý |
marie | čierna |
Petr | Čierny |
Vítězslava | Churý |
pavel | Dušín |
... | ... |
WHERE
(písalo by sa pred
ORDER BY
), pre jednoduchosť sme vybrali všetkých užívateľov.
Radiť môžeme podľa niekoľkých kritérií (stĺpcov). Poďme si užívateľa zoradiť podľa napísaných článkov a tie s rovnakým počtom řaďme ešte podľa abecedy:
SELECT [Jmeno], [Prijmeni], [PocetClanku] FROM [Uzivatele] ORDER BY [PocetClanku], [Prijmeni]
výsledok:
jmeno | Prijmeni | PocetClanku |
---|---|---|
Matěj | Horák | 0 |
michal | Krejčí | 0 |
Petr | Čierny | 1 |
miroslav | Kučera | 1 |
Vladimír | pokorný | 1 |
Jana | Veselá | 1 |
František | veselý | 1 |
Ludmila | Dvořáková | 2 |
Věra | Svobodová | 2 |
Jiří | veselý | 2 |
... | ... | ... |
Určiť môžeme samozrejme aj smer radenia. Môžeme radiť vzostupne
(predvolené smer) kľúčovým slovom ASC
a zostupne kľúčovým
slovom DESC
. Skúsme si urobiť rebríček užívateľov podľa
počtu článkov. Tí prví ich teda majú najviac, radiť budeme zostupne. Tie
sa rovnakým počtom článkov budeme radiť ešte podľa abecedy:
SELECT [Jmeno], [Prijmeni], [PocetClanku] FROM [Uzivatele] ORDER BY [PocetClanku] DESC, [Prijmeni]
výsledok:
jmeno | Prijmeni | PocetClanku |
---|---|---|
Petr | Dvořák | 18 |
Jan | Novák | 17 |
eva | Kučerová | 12 |
Tomáš | márny | 12 |
pavel | Dušín | 9 |
Otakar | Kovář | 9 |
... | ... | ... |
DESC
treba vždy uviesť, vidíte, že zoradenie podľa priezviska
je normálne zostupnej, pretože sme DESC
napísali len k
PocetClanku
.
Agregačné funkcie
Databáza nám ponúka množstvo tzv. Agregačných funkcií. To sú funkcie, ktoré nejakým spôsobom spracujú viac hodnôt a ako výsledok vráti hodnotu jednu.
Count (Počet)
Príkladom takejto funkcie je funkcia COUNT()
, ktorá vráti
počet riadkov v tabuľke, spĺňajúce nejaká kritériá. Spočítajme, koľko
z užívateľov popísalo aspoň jeden článok:
SELECT COUNT(*) FROM [Uzivatele] WHERE [PocetClanku] > 0;
výsledok:
29 |
COUNT()
sa pýtame pomocou SELECT
, nie je to
príkaz, je to funkcia, ktorá sa vykoná nad riadky a jej výsledok je
vrátený SELECT. Funkcia má rovnako ako v iných programovacích jazykoch
(aspoň vo väčšine z nich) zátvorky. Tá hviezdička v nich znamená, že
nás zaujímajú všetky stĺpce. Môžeme totiž počítať napríklad len
používateľov, ktorí majú vyplnené meno (presnejšie ktorí ho nemajú
NULL
, ale to nechajme na ďalšie lekcie).
Pozn .: Určite by vás napadol aj iný spôsob, ako tento výsledok
docieliť. Jednoducho by ste si vybrali nejakú hodnotu ako doteraz (napríklad
meno), tieto riadky by ste si preniesli do svojej aplikácie a spočítali,
koľko mien je. Dáta by ste potom zahodili. Taký prenos je ale zbytočne
náročný na databázu a spomaľoval by aplikáciu. COUNT()
prenáša len jedno jediné číslo. Nikdy nepočítajte pomocou výberu
hodnoty, iba funkciou COUNT()
!
AVG ()
AVG()
počíta priemer z daných hodnôt. Pozrime sa, aký je
priemerný počet článkov na užívateľa:
SELECT AVG([PocetClanku]) FROM [Uzivatele];
výsledok:
5 Šum ()
SUM()
vracia súčet hodnôt. Pozrime sa, koľko článkov
napísali dohromady ľudia narodení po roku 1980:
SELECT SUM([PocetClanku]) FROM [Uzivatele] WHERE [DatumNarozeni] > '1980-12-31';
výsledok:
57 MIN ()
Funkcia MIN()
vráti minimum (najmenšiu hodnotu). Nájdime
najnižšej dátum narodenia:
SELECT MIN([DatumNarozeni]) FROM [Uzivatele];
výsledok:
1935-05-15 |
-- Tento kód nebude fungovat SELECT [jmeno], [prijmeni], MIN([DatumNarozeni]) FROM [Uzivatele];
Agregačné funkcie pracuje s hodnotami viac stĺpcov a vybrané stĺpce
(Jmeno
a Prijmeni
) nebudú nijako súvisieť s
hodnotou MIN()
. Problém by sme mohli vyriešiť poddotazov alebo
ešte jednoduchšie sa funkciám MIN()
a MAX()
úplne
vyhnúť a použiť namiesto nich radenia a TOP
:
SELECT TOP 1 [Jmeno], [DatumNarozeni] FROM [Uzivatele] ORDER BY [DatumNarozeni]
výsledok:
jmeno | DatumNarozeni |
Alfons | 1935-05-15 |
Podobne ako MIN()
existuje aj funkcia MAX()
.
Nájdime maximálny počet článkov od 1 užívateľa:
SELECT MAX([PocetClanku]) FROM [Uzivatele];
výsledok:
18 |
Zoskupovanie (Grouping)
Položky v databáze môžeme zoskupovať podľa určitých kritérií. Zoskupovanie používame takmer vždy spolu s agregačními funkciami. Poďme zoskupiť užívateľa podľa mena:
SELECT [Jmeno] FROM [Uzivatele] GROUP BY [Jmeno];
výsledok:
jmeno |
---|
Alfons |
eva |
František |
Jan |
Jana |
... |
COUNT(*)
:
SELECT [Jmeno], COUNT(*) FROM [Uzivatele] GROUP BY [Jmeno];
výsledok:
jmeno | |
---|---|
Alfons | 1 |
eva | 1 |
František | 1 |
Jan | 2 |
Jana | 1 |
... |
AS ##
Pre zjednodušenie si môžeme v dotaze vytvoriť aliasy, teda premenovať
napríklad nejaký dlhý stĺpec, aby bol dotaz prehľadnejšie. S týmto sa
ešte stretneme u otázok cez viac tabuliek, kde je to veľmi užitočné. U
tabuliek AS
používame na zjednodušenie operácií vo vnútri
dotazu. U stĺpcov sa AS
používa k tomu, aby aplikácia videla
dáta pod iným názvom, ako sú skutočne v databáze. To môže byť
užitočné najmä u agregačných funkcií, pretože pre nich v databáze nie
je žiadny stĺpec a mohlo by sa nám s ich výsledkom zle pracovať. Upravme si
posledný otázka:
SELECT [Jmeno], COUNT(*) AS [Pocet] FROM [Uzivatele] GROUP BY [Jmeno];
výsledok:
V nasledujúcom kvíze, Kvíz - Tvorba, vkladanie, import a export dát v MS-SQL, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.