mirror of
https://github.com/pepaskopec-blip/Graduately.git
synced 2026-10-27 15:14:35 +00:00
2.9 KiB
2.9 KiB
id: sw-3-mysql-join nazev: MySQL: spojení tabulek popis: INNER JOIN přes trida_id a proč se název třídy neopakuje v každém řádku. nazev_cviceni: Kvíz: JOIN nadpis_kvizu: Doplňte spojení
Výklad
Jedna pravda
Název jen jednou
- Název 1.A je v tabulce tridy jednou. V zaci je jen trida_id.
- Když by název ležel i u žáka, oprava překlepu znamená projít všechny žáky.
- To je důvod dvou tabulek. Excel to umí jen ručně, databáze vztahem.
- JOIN tabulky spojí ve výsledku dotazu. Nesloučí je do jedné natrvalo.
Tip: Po JOIN pořád existují dvě tabulky. Výsledek dotazu je jen pohled pro tento příkaz.
INNER JOIN
Shoda klíčů
- INNER JOIN vrátí řádky, kde se klíče sejdou. Žák a jeho třída.
- ON z.trida_id = t.id je podmínka spojení. Není to totéž co WHERE na název.
- Bez ON server buď příkaz odmítne, nebo spojí každý řádek s každým.
- Přezdívky z a t jsou v dotazu proto, aby bylo jasné, která tabulka je která.
Tip: WHERE t.nazev = '1.A' přijde až po spojení. Nejdřív se tabulky potkají, pak se filtruje.
Celý příkaz
Jak má vypadat
- SELECT z.prijmeni, z.jmeno, t.nazev FROM zaci AS z INNER JOIN tridy AS t ON z.trida_id = t.id;
- WHERE t.nazev = '1.A' z toho udělá jen jednu třídu.
- ORDER BY z.prijmeni výsledek seřadí.
- Sloupce pište s přezdívkou tabulky. Samotné id by bylo nejasné, mají ho obě tabulky.
Tip: Když příkaz hlásí nejednoznačný sloupec id, napište z.id nebo t.id. Server nehádá.
Zadání: jeden JOIN
Cvičení
- Do dotazy.sql přidejte dotaz, který vypíše příjmení, jméno a název třídy.
- Jen třída 1.A, seřazené podle příjmení.
- Anna Nováková v něm je včetně textu 1.A, ne jen čísla 1.
- Příkaz spusťte dvakrát. Výsledek má být stejný, JOIN data nemění.
Tip: Když vidíte číslo místo 1.A, vybíráte trida_id a ne t.nazev. Doplňte sloupec z tabulky tridy.
Kvíz
Které spojení ukáže žáka i název jeho třídy?
- SELECT * FROM zaci;
- SELECT z.prijmeni, t.nazev FROM zaci AS z INNER JOIN tridy AS t ON z.trida_id = t.id;
- DELETE FROM tridy;
- INSERT INTO tridy VALUES ('1.A');
JOIN vezme příjmení z žáků a název z tříd tam, kde se id shoduje.
Co patří do ON?
- z.trida_id = t.id
- t.nazev = '1.A'
- ORDER BY z.prijmeni
- USE skola
ON je shoda klíčů. Filtr na název 1.A je WHERE, ne spojení.
Proč není název třídy uložený u každého žáka?
- MySQL to neumí
- Aby se název měnil na jednom místě
- Protože text v MySQL nejde uložit
- Aby nešel JOIN
Jedna pravda v tabulce tridy. Žáci drží jen číslo.
Co JOIN udělá s uloženými tabulkami?
- Sloučí je natrvalo do jedné
- Jen složí výsledek dotazu, tabulky zůstanou dvě
- Smaže cizí klíče
- Převede je na Excel
Výsledek je odpověď na příkaz. tridy a zaci na serveru zůstávají.