[Tipy - triky] - {Mírně pokročilí} Dnešním dnem zahajujeme praktický seriál o jazyku SQL, který se bude skládat z různých tipů a triků rozdílné úrovně – od naprostých začátečníků až po profesionály živící se vývojem databázových aplikací. Dnes se podíváme na kombinované třídění výsledku dotazu.
Jednotlivé tipy-triky ze seriálu 365 x SQL = praxe jsou vytvářeny tak, aby byly co nejméně závislé na konkrétní databázové platformě. Nepodaří-li se nám toto pravidlo dodržet, uvedeme, pro jakou platformu je daný tip-trik určen.
Pro třídění výsledků dotazu se běžně používá v SQL klauzule ORDER BY. Možností je ale mnohem více, než jen třídění podle jednoho sloupce tabulky.
Pomocí následujícího příkazu si založme tabulku dluznici:
create table dluznici
( prijmeni varchar(25),
jmeno varchar(25),
dluzi char(1)
);
Hodnota sloupce dluzi může být 'A' nebo 'N', podle toho, zda nám daná osoba něco dluží či nikoli.
Nyní tabulku dluznici naplňme daty:
insert into dluznici values ('Kocan','Marek','N');
insert into dluznici values ('Kocan','Martin','A');
insert into dluznici values ('Kocan','Ivo','A');
insert into dluznici values ('Skřivánek','Petr','N');
insert into dluznici values ('Skřivánek','František','A');
insert into dluznici values ('Málek','Jiří','A');
Prvním úkolem, který nás pravděpodobně napadne je vypsat si všechny osoby z této tabulky tak, aby byly setříděny podle příjmení a jména vzestupně. Nic těžkého, stačí na to jednoduchý dotaz:
select dluzi,
prijmeni,
jmeno
from dluznici
order by prijmeni,
jmeno;
Výsledkem bude:
DLUZI PRIJMENI JMENO
===== ======== =====
A Kocan Ivo
N Kocan Marek
A Kocan Martin
A Málek Jiří
A Skřivánek František
N Skřivánek Petr
Ten sice odpovídá zadání, ale nemusí být pro nás vždy přehledný. Dejme tomu v případě, kdy bychom chtěli mít výsledek setříděný nejprve podle toho, zda nám někdo něco dluží a teprve pak až podle příjmení a jména. Zkusme dotaz:
select dluzi,
prijmeni,
jmeno
from dluznici
order by dluzi,
prijmeni,
jmeno;
Výsledkem tohoto dotazu bude:
DLUZI PRIJMENI JMENO
===== ======== =====
A Kocan Ivo
A Kocan Martin
A Málek Jiří
A Skřivánek František
N Kocan Marek
N Skřivánek Petr
Stejného výsledku dosáhneme, pokud dotaz rozšíříme o volbu pro vzestupné třídění (ASC[ENDING]), neboť tato volba je pro třídění implicitní:
select dluzi,
prijmeni,
jmeno
from dluznici
order by dluzi ascending,
prijmeni asc,
jmeno asc;
Jak vidíme z příkladu, lze používat plný i zkrácený tvar volby ASCENDING.
Jakým způsobem ale zadáme dotaz, kdybychom chtěli v první části výsledku mít osoby, které nám nic nedluží a v druhé části osoby, které nám něco dluží (písmeno N je v abecedě až za písmenem A)? Při zachování ostatního třídění. Rada je jednoduchá, stačí použít vedle volby ASCENDING také volbu DES[CENGING] pro sestupné třídění.
select dluzi,
prijmeni,
jmeno
from dluznici
order by dluzi descending,
prijmeni asc,
jmeno asc;
Výsledek již nyní vypadá lépe:
DLUZI PRIJMENI JMENO
===== ======== =====
N Kocan Marek
N Skřivánek Petr
A Kocan Ivo
A Kocan Martin
A Málek Jiří
A Skřivánek František
Na závěr je vhodné po sobě v databázi uklidit:
drop table dluznici;
Pro úplnost dodejme, že požadovaného výsledku lze dosáhnout celou řadou dalších způsobů. Cílem tohoto tipu-triku bylo ukázat, že volby pro vzestupné a sestupné třídění lze libovolně u jednotlivých sloupců kombinovat.