7. diel - SQLite - Radenie, Limit a agregačné funkcie
V minulej lekcii, SQLite - Import, sme si ukázali import databázy.
V tomto SQLite tutoriáli sa pozrieme na zoradenie a agregačné funkcie.
Pracovať budeme s tabuľkou používateľov z
web_database, ktorú sme si pripravili v lekcii SQLite - Výber dát
(vyhľadávanie).
Radenie
Doteraz sme nijako neriešili poradie nájdených položiek, ktoré nám
dopyt SELECT vrátil. Ono vlastne žiadne ani neexistovalo,
databáza vo vnútri funguje pomocou určitých sofistikovaných pravidiel
(ktoré sú nad rámec tohto seriálu) a vrátila nám položky tak, ako sa jej
to práve hodilo. Keby sme v databáze vykonali nejakú zmenu a zavolali znovu
ten istý dopyt, poradie by pravdepodobne vyzeralo úplne inak. Databáza nám
ale vrátený výsledok samozrejme zoradiť dokáže.
Radiť môžeme podľa ktoréhokoľvek stĺpca. Keď budeme radiť podľa
id, 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 dopytu:
SELECT "first_name", "last_name" FROM "users" ORDER BY "last_name";
Výsledok:
Tadio Arent Griselda Ashelford Marjorie Bohlje Lorna Britian Antoni Burlingame ...
V dopyte by samozrejme mohlo byť aj WHERE, pre jednoduchosť
sme vybrali všetkých užívateľov.
Zoradiť môžeme podľa niekoľkých kritérií (stĺpcov), poďme si užívateľov zoradiť podľa napísaných článkov a tých s rovnakým počtom zoraďme ešte podľa abecedy:
SELECT "first_name", "last_name", "article_count" FROM "users" ORDER BY "article_count", "last_name"
Výsledok:
Frannie Jzhakov 0 Michaeline Olivey 0 Antoni Burlingame 1 Helli Douty 1 Bessie McLice 2 Read Pane 2 Melvin Campey 3 Terrijo Chittenden 3 ...
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 "first_name", "last_name", "article_count" FROM "users" ORDER BY "article_count" DESC, "last_name";
Výsledok:
Cart Sinnett 17 John Smith 17 Bambie Goring 14 Joseph Miller 9 Lenard Weathers 9 Griselda Ashelford 8 ...
DESC treba vždy uviesť, vidíte, že radenie podľa priezviska
je normálne zostupné, pretože sme DESC napísali len k
article_count.
Limit
Zostaňme ešte pri našom rebríčku používateľov podľa počtu
článkov. Takto budeme chcieť vypísať 10 najlepších používateľov. Keď
ich bude ale milión, asi nie je dobrý nápad ich všetky vybrať a potom ich v
aplikácii použiť len 10 a tých 999 990 zahodiť. Databáze dáme
limit, teda maximálny počet záznamov, ktoré chceme vybrať.
Zároveň uvedieme aj radenie. Príkaz LIMIT píšeme vždy na
koniec dopytu:
SELECT "first_name", "last_name", "article_count" FROM "users" ORDER BY "article_count" DESC, "last_name" LIMIT 10;
LIMIT a ORDER BY je možné používať aj pri
ďalších príkazoch, napr. pri DELETE alebo UPDATE.
Môžeme si tak poistiť, aby bol vymazaný alebo editovaný vždy iba jeden
záznam.
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átia jednu hodnotu.
Funkcia COUNT()
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 "article_count" > 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
používateľov, ktorí majú vyplnené meno (presnejšie ktorí ho nemajú
NULL, ale to nechajme na ďalšie diely).
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 je tam mien. 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 číslo. Nikdy nepočítajte pomocou výberu hodnoty, iba
funkciou COUNT()!
Funkcia AVG()
AVG() označuje priemer z daných hodnôt. Pozrime sa, aký je
priemerný počet článkov na používateľa:
SELECT AVG("article_count") FROM "users";
Výsledok:
6.06451612903226
Funkcia SUM()
SUM() vracia súčet hodnôt. Pozrime sa, koľko článkov
napísali dohromady ľudia narodení po roku 1980:
SELECT SUM("article_count") FROM "users" WHERE "birth_date" > '1980-1-1';
Výsledok:
71
Funkcia MIN()
Funkcia MIN() vráti minimum (najmenšiu hodnotu). Nájdime
najnižší dátum narodenia:
SELECT MIN("birth_date") FROM "users";
Výsledok:
1942-10-17
Funkcia MAX()
Podobne ako MIN() existuje aj funkcia MAX(),
nájdime maximálny počet článkov od 1 užívateľa:
SELECT MAX("article_count") FROM "users";
Výsledok:
17
SQLite 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 "first_name" FROM "users" GROUP BY "first_name";
Výsledok:
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 "first_name", COUNT(*) FROM "users" GROUP BY "first_name";
Výsledok:
Abigale 1 Antoni 1 Any 1 Bambie 1 Bessie 1 ...
Aliasy AS
Pre zjednodušenie si môžeme v dopyte vytvoriť aliasy, teda premenovať
napríklad nejaký dlhý stĺpec, aby bol dopyt prehľadnejší. S týmto sa
ešte stretneme pri dopytoch 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 dopytu. 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ý dopyt:
SELECT "first_name", COUNT(*) AS "amount" FROM "users" GROUP BY "first_name";
Výsledok:
first_name amount ================== Abigale 1 Antoni 1 Any 1 Bambie 1 Bessie 1 Bud 1 Cart 1 Cordie 1
V nasledujúcom cvičení, Riešené úlohy k 7. lekcii SQLite, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
