ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
MySQL (24) - Seskupujeme záznamyMít spoustu dat je hezká věc, ale občas bychom spíše potřebovali udělat z nich nějaký "výcuc". O tom je dnešní díl seriálu o MySQL. Již víme, že tabulky se v dotazech dají spojovat. Dosud jsme ale
pracovali způsobem, při němž se vždy ve výsledku dotazu zobrazily
všechny (nebo vybrané) řádky z jedné či více tabulek. To může pro
základní práci s databází sice stačit, ale většinou je to málo. Pojďme
se dnes začít zabývat seskupováním záznamů. Seskupování záznamůAbychom byli od začátku přesní - seskupování záznamů je něco jiného
než spojování tabulek. Při spojování tabulek totiž pracujete se dvěma
nebo více tabulkami s cílem najít záznamy, které spolu vzájemně
souvisejí. (Exaktně řečeno lze spojit tabulku i samu se sebou, je to
však speciální případ a probereme to později samostatně). Seskupování
naproti tomu je proces, který probíhá s cílem zjistit něco o skupině
nějak souvisejících záznamů. "Skupina nějak souvisejících záznamů"
přitom může být docela dobře v jediné tabulce. V praxi bychom mohli
najít mnoho případů seskupování:
Představme si například následující tabulku, která by mohla
vzniknout jako záznam z nějakého toho logu návštěvnosti webu. Ukládá
datum návštěvy, operační systém uživatele, jeho prohlížeč, stránku,
kterou navštívil a čas, který tím strávil: create table logtable
(datum datetime, system varchar(20), doba_prohlizeni ) , doba_prohlizeni ) , doba_prohlizeni ) , doba_prohlizeni ) , doba_prohlizeni ) , doba_prohlizeni ) , doba_prohlizeni ) , doba_prohlizeni ) , doba_prohlizeni ) Pozn.: Omlouvám se za délku, ale
pokud si to budete chtít vyzkoušet, nějaká ta data je při testech
seskupování záznamů třeba mít po ruce. Seskupování záznamů probíhá tak, že se za příkaz SELECT uvede klauzule GROUP BY [název pole,[název pole...]], která přikáže serveru data před jejich vrácením seskupit. V nejjednodušším případě to může vypadat nějak takto: select * from logtable
group by system;
Pokud si to zkoušíte, asi nejste z výsledku příliš nadšeni. MySQL
totiž vybere z celé tabulky vždy první záznam o systému, který tu ještě
nebyl, a ten vrátí. Ve výsledku tedy bude jeden řádek s linuxem, jeden
s unixem a jeden s windows. Ze seskupování se ale dá vyzískat mnohem
víc, když se použijí Agregační funkceAgregační funkce umožňují "něco" vypočítat z řádků, které se právě
seskupují. Přestože těchto funkcí existuje celá řada, v praxi pro
většinu běžných úloh typicky stačí znát pouze dvě z nich:
Obě teď můžeme předvést na příkladu. Pomocí agregační funkce COUNT můžeme z protokolu například zjistit, kolik přístupů zaznamenala ta která stránka: select stranka, count(*)
from logtable group by stranka;
A pomocí SUM můžeme třeba vypátrat, kolik času na jednotlivých stránkách naši návštěvníci tráví: select stranka,
sum(doba_prohlizeni) from logtable group by stranka;
K agregačním funkcím se váže celá řada postřehů a zásad, které je dobře znát. Tak například za klauzulí GROUP BY nemusí být uveden jeden sloupec, ale může jich být hned několik. Není to takový nesmysl, jak by se mohlo na první pohled zdát. Můžeme třebas náš příkad s funkcí COUNT chtít rozšířit tak, aby vracel počet shlédnutí stránky podle stránky a prohlížeče, jímž se na tuto stránku přistupovalo. V tom případě bude vrácen počet přístupů pro každou kombinaci stránky a prohlížeče: select stranka,
prohlizec, count(*) from logtable group by stranka, prohlizec;
Dále, nic nám nebrání sestavit dotaz, v němž bude jak klauzule WHERE, tak i GROUP BY (ve skutečnosti je to celkem častý případ). Jestliže nás bude zajímat jen chování uživatelů Firexofu, můžeme předchozí příklad přepsat použitím: select stranka,
prohlizec, count(*) from logtable where prohlizec = 'firefox' group by
stranka, prohlizec; Konečně, jednou seskupené řádky lze řadit. Uvědomme si, že řazení
probíhá až PO seskupení záznamů. To má dva praktické důsledky:
select stranka,
sum(doba_prohlizeni) from logtable group by stranka order by
sum(doba_prohlizeni) desc;
Důvod je prostý - MySQL nesmí mít v klauzuli ORDER BY výraz. Řešení jsou dvě, buď se dá použít číslo řazeného sloupce, nebo si výraz SUM (doba_prohlizeni) nazvat aliasem. Oba dotazy níže již projdou a dělají totéž: select stranka,
sum(doba_prohlizeni) as doba from logtable group by stranka order by
doba desc;
V příštím díle se můžete těšit na další informace ohledně seskupování záznamů.
Související články
Předchozí Celou kategorii (seriál) Další
MySQL (1) - pestrý svět databází
MySQL (2) - Instalujeme databázi MySQL MYSQL (3) Instalujeme MySQL podruhé MySQL (4) - něco terminologie MySQL (5) - tajuplné SQL MySQL (6) - Ukládáme řetězce MySQL (7) - hrátky s čísly MySQL (8) - Ukládání datumů MySQL (9) - Další datové typy MySQL (10) - tvorba databáze. Základy DDL MySQL (11) - vytváříme tabulky MySQL (12) - tipy k tvorbě tabulek MySQL (13) - Vkládáme data MySQL (14) - Upravujeme data MySQL (15) - Odstraňujeme data MySQL (16) - Tipy a triky k manipulaci s daty MySQL (17) - vybíráme data MySQL (18) - Filtrujeme data MySQL (19) - Řadíme data MySQL (20) - spojení více tabulek MySQL (21) - klauzule JOIN MySQL (22) - tipy a triky ke spojování tabulek MySQL (23) - relace 1:N a N:N MySQL (25) - hrátky se seskupenými záznamy MySQL (26) - Poddotazy MySQL (27) - Složitější dotazy MySQL (28) - Dotazy pro pokročilé MySQL (29) - Vracení nejvyšších záznamů MySQL (30) - průběžné součty MySQL (31) - Indexy MySQL (32) - ještě k indexům MySQL (33) - Příkaz UNION MySQL (34) - větvení kódu a pivotní tabulky MySQL (35) - vestavěné funkce MySQL (36) - Regulární výrazy MySQL (37) - použití fulltextového vyhledávání MySQL (38) - Fulltext a praxe MySQL (39) - typy tabulek v MySQL MySQL (40) - další typy tabulek MySQL (41) - Transakce MySQL (42) - ještě k transakcím MySQL (43) - Uložené procedury MySQL (44) - parametry uložených procedur MySQL (45) - větvení kódu uložených procedur MySQL (46) - Triggery MySQL (47) - Triggery a praxe MySQL (48) - UDF MySQL (49) - pohledy MySQL (50) - Pohledy podruhé MySQL (51) - Metadata MySQL (52) - A co zálohování? MySQL (53) - SELECT INTO OUTFILE MySQL (54) - zálohování MySQL z webu MySQL (55) - zálohování MySQL z pohledu správce MySQL (56) - Obnova zálohovaných dat MySQL (57) - Ach, ta čeština MySQL (58) - čeština v praxi MySQL (59) - české řazení MySQL (60) - řádkový klient MySQL (61) - Oprávnění MySQL (62) - Oprávnění podruhé MySQL (63) - jemné nastavení práv MySQL (64) - nad dotazy čtenářů MySQL (65) - Ladíme server MySQL (66) - Ještě k ladění serveru MySQL - (67) MySQL (68) - Závěr MySQL (69) - Prepared Statements Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |