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

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
... ...
V dotaze by samozrejme mohlo byť aj 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
... ... ...
Smer radenia

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
Na 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
Pozor, ak by sme chceli vybrať aj meno a priezvisko, tento kód nebude fungovať:
-- 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
Max ()

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
MS-SQL má ešte nejaké agregačné funkcie, ale tie pre nás už nie sú zaujímavé.

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
...
Vidíme, že každé meno je tu zastúpené len raz, aj keď je v databáze viackrát. Pridajme teraz okrem mena aj počet jeho zastúpenie v tabuľke, urobíme to pomocou agregačné funkcie COUNT(*):
SELECT [Jmeno], COUNT(*) FROM [Uzivatele] GROUP BY [Jmeno];

výsledok:

jmeno
Alfons 1
eva 1
František 1
Jan 2
Jana 1
...
Vidíme, že treba Jany máme v databáze dva.

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:

Použitie AS u agregačné funkcie COUNT v MS-SQL databáze - MS-SQL databázy krok za krokom

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


 

Predchádzajúci článok
MS-SQL krok za krokom: Vývoz
Všetky články v sekcii
MS-SQL databázy krok za krokom
Preskočiť článok
(neodporúčame)
Kvíz - Tvorba, vkladanie, import a export dát v MS-SQL
Č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