7. diel - MS-SQL krok za krokom: Radenie, Limit a agregačné funkcie
V predchádzajúcom cvičení, Riešené úlohy k 6. lekcii MS-SQL, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
Dnes sa v MS-SQL tutoriále pozrime na radenie a agregačné funkcie.
Radenie
Doteraz sme nijako neriešili poradie nájdených položiek, ktoré nám
dotaz SELECT
vrátil. Niektoré databázy neudržujú žiadne
poradie prvkov a vracajú ich tak, ako sa im to práve hodilo. MS-SQL je
výnimka a výsledky vracia vždy zoradené podľa Id
. Databáza
nám ale vrá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 východiskové 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áza si s tým vždy nejako poradí. Poďme si vybrať úplne všetkých
užívateľov a zoraďme ich podľa priezviska. Slúži na to klauzula
ORDER BY
(radiť podľa), ktorá sa píše na koniec dotazu:
SELECT [FirstName], [LastName] FROM [Users] ORDER BY [LastName];
Výsledok:
FirstName | LastName |
---|---|
Tadio | Arent |
Griselda | Ashelford |
Marjorie | Bohlje |
Lorna | Britian |
Antoni | Burlingame |
Melvin | Campey |
... | ... |
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 používateľa zoradiť podľa napísaných článkov a tie s rovnakým počtom raďme ešte podľa abecedy:
SELECT [FirstName], [LastName], [NumberOfArticles] FROM [Users] ORDER BY [NumberOfArticles], [LastName];
Výsledok:
FirstName | LastName | NumberOfArticles |
---|---|---|
Frannie | Jzhakov | 0 |
Michaeline | Olivey | 0 |
Antoni | Burlingame | 1 |
Helli | Douty | 1 |
Bessie | McLice | 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 používateľov podľa
počtu článkov. Tí prví ich teda majú najviac, radiť budeme zostupne. Tie
s rovnakým počtom článkov budeme radiť ešte podľa abecedy:
SELECT [FirstName], [LastName], [NumberOfArticles] FROM [Users] ORDER BY [NumberOfArticles] DESC, [LastName];
Výsledok:
FirstName | LastName | NumberOfArticles |
---|---|---|
Cart | Sinnett | 17 |
John | Smith | 17 |
Bambie | Goring | 14 |
Joseph | Miller | 9 |
... | ... | ... |
DESC
je treba vždy uviesť, vidíte, že radenie podľa
priezviska je normálne zostupné, pretože sme DESC
napísali len
k NumberOfArticles
.
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úca nejaké kritériá. Spočítajme, koľko
z užívateľov napísalo aspoň jeden článok:
SELECT COUNT(*) FROM [Users] WHERE [NumberOfArticles] > 0;
Výsledok:
29 |
Na COUNT()
sa pýtame pomocou SELECT
, nie je to
príkaz, je to funkcia, ktorá sa vykoná nad riadkami a jej výsledok je
vrátený selectom. 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
užívateľov, ktorí majú vyplnené meno (presnejšie ktorí ho nemajú
NULL
, ale to nechajme na ďalšie lekcie).
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ýto prenos je ale zbytočne
náročný na databázu a spomaľoval by aplikáciu. COUNT()
prenáša iba 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 používateľa:
SELECT AVG([NumberOfArticles]) FROM [Users];
Výsledok:
6 |
SUM()
Funkcia SUM()
vracia súčet hodnôt. Pozrime sa, koľko
článkov napísali dohromady ľudia narodení po roku 1980:
SELECT SUM([NumberOfArticles]) FROM [Users] WHERE [BirthDate] > '1980-12-31';
Výsledok:
77 |
MIN()
Funkcia MIN()
vráti minimum (najmenšiu hodnotu). Nájdime
najnižší dátum narodenia:
SELECT MIN([BirthDate]) FROM [Users];
Výsledok:
1942-10-17 |
Pozor, ak by sme chceli vybrať aj meno a priezvisko, tento kód nebude fungovať:
-- This code will not work SELECT [FirstName], [LastName], MIN([BirthDate]) FROM [Users];
Agregačná funkcia pracuje s hodnotami viacerých stĺpcov a vybrané
stĺpce (FirstName
a LastName
) nebudú nijako
súvisieť s hodnotou MIN()
. Problém by sme mohli vyriešiť
poddotazom alebo ešte jednoduchšie sa funkciám MIN()
a
MAX()
úplne vyhnúť a použiť namiesto nich radenie a
TOP
:
SELECT TOP 1 [FirstName], [LastName], [BirthDate] FROM [Users] ORDER BY [BirthDate];
Výsledok:
FirstName | LastName | BirthDate |
Thomas | Williams | 1942-10-17 |
MAX()
Podobne ako MIN()
existuje aj funkcia MAX()
.
Nájdime maximálny počet článkov od 1 používateľa:
SELECT MAX([NumberOfArticles]) FROM [Users];
Výsledok:
17 |
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ť používateľa podľa mena:
SELECT [FirstName] FROM [Users] GROUP BY [FirstName];
Výsledok:
FirstName |
---|
Abigale |
Antoni |
Any |
Bambie |
Bessie |
... |
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úpení v tabuľke,
urobíme to pomocou agregačnej funkcie COUNT(*)
:
SELECT [FirstName], COUNT(*) FROM [Users] GROUP BY [FirstName];
Výsledok:
FirstName | |
---|---|
Abigale | 1 |
Antoni | 1 |
Any | 1 |
Bambie | 1 |
... | |
John | 2 |
... |
Vidíme, že napríklad Johny 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ší. S týmto sa
ešte stretneme pri dotazoch cez viacero tabuliek, kde je to veľmi užitočné.
Pri tabuľkách AS
používame na zjednodušenie operácií vo
vnútri dotazu. Pri stĺpcoch sa AS
používa na to, aby aplikácia
videla dáta pod iným názvom, než sú skutočne v databáze. To môže byť
užitočné najmä pri agregačných funkciách, 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ý dotaz:
SELECT [FirstName], COUNT(*) AS [Quantity] FROM [Users] GROUP BY [FirstName];
Výsledok:
V nasledujúcom cvičení, Riešené úlohy k 7. lekcii MS-SQL, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.