← Zpět na obsah

Kapitola 16: Řazení a filtrování dat

Řazení dat - od chaosu k pořádku
Řazení dat - od chaosu k pořádku

1. Úvod: Jak najít jehlu v kupce sena?

Představ si, že máš obrovskou tabulku se všemi žáky vaší školy. Jak v ní najdeš nejstaršího žáka? Nebo jak zobrazíš jen spolužáky z vaší třídy? Procházet tisíce řádků jeden po druhém by byla noční můra! Naštěstí máme dva mocné nástroje, které nám pomohou: řazení a filtrování. Naučíme se, jak s nimi pracovat, abychom z dat rychle získali odpovědi na naše otázky.

2. Řazení: Udělej si pořádek

Řazení znamená, že si data v tabulce seřadíme podle nějakého pravidla. Je to jako když si v knihovně seřadíš knížky podle abecedy, aby se ti lépe hledaly.

Definice: Řazení dat

Řazení dat je proces uspořádání řádků v tabulce podle hodnot v jednom nebo více sloupcích. Můžeme řadit vzestupně (od nejmenšího po největší, od A do Z) nebo sestupně (od největšího po nejmenší, od Z do A).

Proč je řazení užitečné?

Příklad: Tabulka zvířat
Máme tabulku zvířat a chceme najít to nejtěžší.
ZvířeVáha (kg)
Slon5000
Myš0.02
Pes15
Kočka4
Když tabulku seřadíme sestupně podle sloupce "Váha (kg)", hned vidíme výsledek:
ZvířeVáha (kg)
Slon5000
Pes15
Kočka4
Myš0.02
Nejtěžší je slon. Jednoduché, že?

3. Filtrování: Ukaž mi jen to, co chci vidět

Filtrování je jako kouzelné síto. Řekneš mu, co chceš vidět, a ono ti to ukáže. Všechno ostatní dočasně schová.

Definice: Filtrování dat

Filtrování dat je proces, při kterém zobrazíme pouze ty řádky tabulky, které splňují námi zadanou podmínku. Ostatní řádky se dočasně skryjí.

Proč je filtrování užitečné?

Příklad: Tabulka zvířat
Z naší tabulky zvířat chceme zobrazit jen ta, která váží méně než 20 kg.

Původní tabulka:

ZvířeVáha (kg)
Slon5000
Myš0.02
Pes15
Kočka4
Nastavíme filtr na sloupec "Váha (kg)" s podmínkou "je menší než 20". Výsledek:

Filtrovaná tabulka:

ZvířeVáha (kg)
Myš0.02
Pes15
Kočka4
Slon zmizel, protože nesplňoval naši podmínku.

4. Jak to funguje v počítači?

V programech jako Microsoft Excel nebo Google Tabulky najdeš tlačítka pro řazení a filtrování obvykle v menu "Data". Stačí označit tabulku, kliknout na tlačítko a vybrat si, podle kterého sloupce a jak chceš data seřadit nebo filtrovat. Je to velmi jednoduché a intuitivní!

Filtrování - výběr podle kritérií
Filtrování - výběr podle kritérií

Člověk a digitální svět

Řazení a filtrování jsou základní dovednosti pro práci s informacemi v digitálním světě. Pomáhají nám rychle se zorientovat v obrovském množství dat, se kterým se setkáváme každý den – ať už jde o výsledky vyhledávání na internetu, nabídky v e-shopech nebo data v pracovních tabulkách. Učíme se tak efektivně hledat to, co je pro nás důležité, a nenechat se zahltit nepodstatnými informacemi.

Otázky k zamyšlení

Úkoly pro praxi

  1. Seznam kontaktů: Otevři si kontakty ve svém mobilu. Většina aplikací umožňuje řazení kontaktů podle jména nebo příjmení. Zkus si to přepnout. Co je pro tebe přehlednější?
  2. E-shop: Jdi na stránky jakéhokoli e-shopu (např. s oblečením nebo elektronikou). Najdi si tam možnosti filtrování (obvykle vlevo nebo nahoře). Zkus si vyfiltrovat jen produkty, které jsou modré a stojí méně než 500 Kč.
  3. Vlastní tabulka: Vrať se k tabulce, kterou jsi vytvořil/a v minulé kapitole (např. sbírka, knihy). Pokud jsi ji dělal/a v počítači, zkus si data seřadit (např. knihy podle autora, spolužáky podle jména). Poté zkus nastavit filtr (např. zobrazit jen přečtené knihy, jen spolužáky s hnědými vlasy).

* Rozšíření pro pokročilé

Pokročilé řazení v Excelu

Základní řazení A-Z nebo Z-A jsme si už ukázali. Ale co když potřebuješ něco složitějšího?

Vícenásobné řazení

Představ si seznam zaměstnanců. Chceš je seřadit nejdřív podle oddělení (abys měl pohromadě všechny z IT, pak všechny z účtárny...) a v rámci každého oddělení podle platu od nejvyššího. To je vícenásobné řazení.

Jak na to v Excelu: Data → Seřadit → V dialogu přidej více úrovní tlačítkem "Přidat úroveň". První úroveň = Oddělení (A-Z), druhá = Plat (od největšího).

Vlastní pořadí řazení

Co když máš sloupec s dny v týdnu? Abecedně by bylo: Čtvrtek, Neděle, Pátek, Pondělí... To nedává smysl! Excel umožňuje definovat vlastní pořadí: Pondělí, Úterý, Středa...

Jak na to: Data → Seřadit → Pořadí → Vlastní seznam → Vyber "Pondělí, Úterý..." nebo vytvoř vlastní.

Pokročilé filtrování

Běžný filtr (Automatický filtr) je skvělý pro jednoduché úlohy. Pro složitější potřeby máme další nástroje:

Zástupné znaky

Při filtrování textu můžeš použít speciální znaky:

Filtr podle data

Excel nabízí speciální filtry pro data: Tento týden, Minulý měsíc, Tento rok, Starší než 6 měsíců... Velmi užitečné pro analýzu časových řad.

Řadicí algoritmy – jak to dělá počítač

Když klikneš na "Seřadit", počítač interně používá algoritmy řazení. Je zajímavé vědět, jak fungují:

Bubble Sort (bublinkové řazení) je nejjednodušší algoritmus: Porovnává dva sousední prvky a pokud jsou ve špatném pořadí, prohodí je. Opakuje dokud není vše seřazeno. Je pomalý, ale snadno pochopitelný.

Quick Sort je mnohem rychlejší: Vybere jeden prvek (pivot), rozdělí seznam na menší a větší než pivot, a rekurzivně seřadí obě části. Používá ho většina moderních programů.

Řadící algoritmy - porovnání přístupů
Řadící algoritmy - porovnání přístupů

* Úkoly pro pokročilé

  1. Excel – Vícenásobné řazení: Vytvoř tabulku zaměstnanců (Příjmení, Jméno, Oddělení, Plat). Seřaď: 1) podle Oddělení, 2) v rámci oddělení podle Platu sestupně (Data → Seřadit → Přidat úroveň).
  2. Excel – Rozšířený filtr: Vytvoř tabulku prodejů. Použij rozšířený filtr pro zobrazení záznamů, kde Částka > 1000 A Měsíc = Leden (Data → Rozšířený filtr).
  3. Scratch – Bubble Sort: Vytvoř ve Scratchi vizualizaci Bubble Sort: seznam čísel, algoritmus je porovnává a prohazuje, vizuálně ukazuje každý krok.
  4. Excel – Analýza dat: Stáhni veřejně dostupný dataset (např. z Kaggle). Importuj do Excelu. Použij řazení a filtrování pro nalezení: top 10 hodnot, záznamy z určitého období, záznamy splňující více podmínek.

** Rozšíření pro maturitní obory

Podrobně: Algoritmy řazení

V informatice je řazení jedním z nejdůležitějších problémů. Existuje mnoho algoritmů, které se liší rychlostí a složitostí. Časová složitost vyjadřuje, jak rychle roste čas výpočtu s rostoucím počtem prvků.

Bubble Sort – jednoduchý, ale pomalý

Algoritmus opakovaně prochází seznamem, porovnává sousední prvky a prohazuje je, pokud jsou ve špatném pořadí. Největší prvky "bublají" nahoru jako bubliny ve vodě.

Složitost O(n²) znamená: pro 1000 prvků potřebuje až 1 000 000 porovnání. Pro milion prvků by to bylo bilion operací – příliš pomalé!

Quick Sort – rychlý a praktický

Vybere jeden prvek (pivot), rozdělí seznam na dvě části – menší než pivot a větší než pivot. Každou část pak seřadí rekurzivně.

Složitost O(n log n) je mnohem lepší: pro 1000 prvků stačí asi 10 000 operací. Pro milion prvků "jen" 20 milionů. Proto ho používá většina reálných aplikací.

Algoritmus Složitost Princip Kdy použít
Bubble Sort O(n²) Porovnává sousedy Výuka, malé seznamy
Quick Sort O(n log n) Pivot + rozdělení Většina reálných případů
Merge Sort O(n log n) Rozdělení a slučování Velká data, stabilní řazení

Řazení a filtrování v SQL

V databázích se řazení a filtrování provádí pomocí SQL příkazů. Je to mnohem efektivnější než dělat to v Excelu pro miliony záznamů.

ORDER BY – řazení

-- Seřaď produkty podle ceny od nejlevnějšího
SELECT * FROM Produkty ORDER BY Cena ASC;

-- Seřaď od nejdražšího
SELECT * FROM Produkty ORDER BY Cena DESC;

-- Vícenásobné řazení: nejdřív kategorie, pak cena
SELECT * FROM Produkty ORDER BY Kategorie ASC, Cena DESC;
        

WHERE – filtrování

-- Produkty dražší než 100 Kč z kategorie Elektronika
SELECT * FROM Produkty
WHERE Cena > 100 AND Kategorie = 'Elektronika';

-- Produkty, jejichž název začíná na "Smart"
SELECT * FROM Produkty WHERE Nazev LIKE 'Smart%';

-- Produkty v cenovém rozmezí
SELECT * FROM Produkty WHERE Cena BETWEEN 100 AND 500;
        

Pokročilé Excel nástroje

Řezy (Slicers) jsou vizuální tlačítka pro filtrování kontingenčních tabulek. Místo rozklikávání filtru jednoduše klikneš na tlačítko s hodnotou, kterou chceš vidět.

Rozšířený filtr umožňuje zadávat kritéria do samostatné oblasti buněk. Můžeš tak vytvářet složité podmínky, které si uložíš a můžeš znovu použít.

Pokročilé filtrování v Excelu
Pokročilé filtrování v Excelu

** Úkoly pro maturitní obory

  1. Excel – Rozšířený filtr: Vytvoř tabulku zaměstnanců (50+ záznamů). Použij rozšířený filtr pro nalezení: zaměstnanci z Prahy s platem nad 40 000 Kč, kteří nastoupili po roce 2020.
  2. Excel – Řezy: Vytvoř kontingenční tabulku prodejů. Přidej řezy (Slicers) pro filtrování podle produktu a měsíce. Použij více řezů najednou.
  3. PowerPoint – Algoritmy řazení: Vytvoř prezentaci "Jak počítače řadí data" (12-15 snímků). Vysvětli Bubble Sort, Quick Sort s animacemi kroků.
  4. Word – SQL příručka: Napiš příručku "SQL pro řazení a filtrování" (2-3 strany). Zahrň ORDER BY, WHERE, AND/OR, LIKE, BETWEEN s příklady.
  5. Canva – Infografika: Vytvoř infografiku srovnávající algoritmy řazení: Bubble Sort vs Quick Sort. Ukaž složitost, rychlost, použití.

*** Rozšíření pro IT obory

Jako IT specialista musíš rozumět algoritmům řazení na implementační úrovni a umět je používat efektivně.

Implementace řadících algoritmů

def bubble_sort(seznam):
    """Bubble Sort - O(n²)"""
    n = len(seznam)
    for i in range(n):
        for j in range(0, n - i - 1):
            if seznam[j] > seznam[j + 1]:
                seznam[j], seznam[j + 1] = seznam[j + 1], seznam[j]
    return seznam

def quick_sort(seznam):
    """Quick Sort - O(n log n) průměrně"""
    if len(seznam) <= 1:
        return seznam

    pivot = seznam[len(seznam) // 2]
    mensi = [x for x in seznam if x < pivot]
    stejne = [x for x in seznam if x == pivot]
    vetsi = [x for x in seznam if x > pivot]

    return quick_sort(mensi) + stejne + quick_sort(vetsi)

def merge_sort(seznam):
    """Merge Sort - O(n log n) vždy"""
    if len(seznam) <= 1:
        return seznam

    stred = len(seznam) // 2
    leva = merge_sort(seznam[:stred])
    prava = merge_sort(seznam[stred:])

    return merge(leva, prava)

def merge(leva, prava):
    vysledek = []
    i = j = 0
    while i < len(leva) and j < len(prava):
        if leva[i] < prava[j]:
            vysledek.append(leva[i])
            i += 1
        else:
            vysledek.append(prava[j])
            j += 1
    vysledek.extend(leva[i:])
    vysledek.extend(prava[j:])
    return vysledek
        

Řazení v Pythonu

# Python používá Timsort - hybridní algoritmus O(n log n)

cisla = [5, 2, 8, 1, 9]
cisla.sort()  # In-place řazení
print(cisla)  # [1, 2, 5, 8, 9]

# sorted() vrací nový seznam
serazene = sorted([5, 2, 8, 1, 9])

# Řazení sestupně
cisla.sort(reverse=True)

# Řazení podle klíče
studenti = [
    {'jmeno': 'Jan', 'vek': 20},
    {'jmeno': 'Eva', 'vek': 18},
    {'jmeno': 'Petr', 'vek': 22}
]

# Podle věku
podle_veku = sorted(studenti, key=lambda x: x['vek'])

# Podle jména
podle_jmena = sorted(studenti, key=lambda x: x['jmeno'])

# Vícenásobné řazení (nejdřív podle příjmení, pak jména)
from operator import itemgetter
lide = sorted(lide, key=itemgetter('prijmeni', 'jmeno'))
        

Filtrování v Pythonu

# List comprehension - nejčastější způsob
cisla = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Sudá čísla
suda = [x for x in cisla if x % 2 == 0]

# Větší než 5
vetsi = [x for x in cisla if x > 5]

# Kombinace podmínek
vysledek = [x for x in cisla if x > 3 and x < 8]

# Filtrování objektů
produkty = [
    {'nazev': 'Notebook', 'cena': 25000, 'kategorie': 'IT'},
    {'nazev': 'Myš', 'cena': 500, 'kategorie': 'IT'},
    {'nazev': 'Stůl', 'cena': 3000, 'kategorie': 'Nábytek'},
]

# IT produkty dražší než 1000 Kč
it_drahe = [p for p in produkty
            if p['kategorie'] == 'IT' and p['cena'] > 1000]

# filter() funkce
suda = list(filter(lambda x: x % 2 == 0, cisla))
        

Měření výkonu algoritmů

import time
import random

def zmer_cas(funkce, data):
    start = time.time()
    funkce(data.copy())
    return time.time() - start

# Generuj náhodná data
velikosti = [100, 1000, 5000]

for n in velikosti:
    data = [random.randint(1, 10000) for _ in range(n)]

    cas_bubble = zmer_cas(bubble_sort, data)
    cas_quick = zmer_cas(quick_sort, data)
    cas_python = zmer_cas(sorted, data)

    print(f"n={n:5d}: Bubble={cas_bubble:.4f}s, "
          f"Quick={cas_quick:.4f}s, Python={cas_python:.6f}s")
        

*** Praktické úkoly pro IT obory

  1. Implementace: Implementuj všechny tři algoritmy (Bubble, Quick, Merge). Porovnej jejich rychlost na datech různé velikosti.
  2. Vizualizace: Napiš program, který vizualizuje průběh řazení (např. pomocí matplotlib nebo ASCII art).
  3. Řazení objektů: Vytvoř třídu Student a seřaď seznam studentů podle průměru, pak podle jména.
  4. Binární vyhledávání: Implementuj binární vyhledávání v seřazeném seznamu. Porovnej rychlost s lineárním.

*** Projekt pro IT obory: Databázová aplikace (část 3/6)

Pokračujeme v projektu Evidence studentů. V této kapitole se naučíš UPDATE, DELETE a řazení/filtrování v SQL.

UPDATE - aktualizace dat

USE skola;

-- Aktualizace jednoho záznamu
UPDATE studenti
SET email = 'novak.jan@skola.cz'
WHERE id = 1;

-- Aktualizace více polí
UPDATE studenti
SET trida = '9.B', email = 'novy@email.cz'
WHERE id = 2;

-- Hromadná aktualizace
UPDATE studenti
SET trida = '9.C'
WHERE trida = '9.B' AND datum_narozeni < '2008-06-01';

-- Aktualizace s výpočtem
UPDATE studenti s
SET prumer = (
    SELECT ROUND(AVG(z.znamka), 2)
    FROM znamky z
    WHERE z.student_id = s.id
);

-- ⚠️ POZOR! Bez WHERE se aktualizuje VŠE!
-- UPDATE studenti SET trida = '9.X';  -- ŠPATNĚ!
        

DELETE - mazání dat

-- Smazání jednoho záznamu
DELETE FROM studenti WHERE id = 5;

-- Smazání podle podmínky
DELETE FROM znamky WHERE datum < '2024-01-01';

-- Smazání s JOIN (studenti bez známek)
DELETE s FROM studenti s
LEFT JOIN znamky z ON s.id = z.student_id
WHERE z.id IS NULL;

-- ⚠️ POZOR! Bez WHERE se smaže VŠE!
-- DELETE FROM studenti;  -- ŠPATNĚ!

-- Bezpečnější: TRUNCATE (rychlejší, ale smaže vše)
-- TRUNCATE TABLE znamky;
        

ORDER BY a LIMIT v praxi

-- Top 5 nejlepších studentů
SELECT s.jmeno, s.prijmeni, ROUND(AVG(z.znamka), 2) as prumer
FROM studenti s
JOIN znamky z ON s.id = z.student_id
GROUP BY s.id
ORDER BY prumer ASC
LIMIT 5;

-- Stránkování (10 záznamů na stránku)
-- Stránka 1
SELECT * FROM studenti ORDER BY prijmeni LIMIT 10 OFFSET 0;
-- Stránka 2
SELECT * FROM studenti ORDER BY prijmeni LIMIT 10 OFFSET 10;
-- Stránka 3
SELECT * FROM studenti ORDER BY prijmeni LIMIT 10 OFFSET 20;

-- Řazení podle více sloupců
SELECT * FROM studenti
ORDER BY trida ASC, prijmeni ASC, jmeno ASC;
        

WHERE - pokročilé filtrování

-- LIKE - vyhledávání v textu
SELECT * FROM studenti WHERE prijmeni LIKE 'Nov%';  -- Začíná na Nov
SELECT * FROM studenti WHERE email LIKE '%@skola.cz';  -- Končí na @skola.cz
SELECT * FROM studenti WHERE jmeno LIKE '_an';  -- 3 znaky, končí na "an"

-- IN - více hodnot
SELECT * FROM studenti WHERE trida IN ('9.A', '9.B');

-- BETWEEN - rozsah
SELECT * FROM studenti
WHERE datum_narozeni BETWEEN '2008-01-01' AND '2008-06-30';

-- IS NULL / IS NOT NULL
SELECT * FROM studenti WHERE email IS NULL;
SELECT * FROM studenti WHERE email IS NOT NULL;

-- Kombinace s AND, OR, NOT
SELECT * FROM studenti
WHERE (trida = '9.A' OR trida = '9.B')
AND email IS NOT NULL
AND NOT prijmeni LIKE 'Test%';
        

Transakce - bezpečné změny

-- Transakce zajistí, že se buď provedou všechny změny, nebo žádná

START TRANSACTION;

-- Přidej studenta
INSERT INTO studenti (jmeno, prijmeni, trida)
VALUES ('Test', 'Student', '9.A');

-- Přidej jeho známky
INSERT INTO znamky (student_id, predmet_id, znamka, datum)
VALUES (LAST_INSERT_ID(), 1, 2, CURDATE());

-- Pokud vše OK, potvrď
COMMIT;

-- Pokud něco špatně, vrať změny
-- ROLLBACK;
        

*** Úkol pro tuto kapitolu

  1. Přidej 5 nových studentů pomocí INSERT.
  2. Aktualizuj e-mail jednoho studenta pomocí UPDATE.
  3. Napiš dotaz: "Studenti narození v lednu seřazení podle příjmení".
  4. Napiš dotaz: "Studenti s průměrem horším než 3.0".
  5. Vyzkoušej transakci: přidej studenta a jeho 3 známky.
  6. Ulož nové dotazy do queries.sql a commitni do Gitu.

V další kapitole: Naučíš se indexy a optimalizaci dotazů.

← Zpět na obsah