mirror of
https://github.com/pepaskopec-blip/Graduately.git
synced 2026-10-27 15:14:35 +00:00
79 lines
2.9 KiB
Markdown
79 lines
2.9 KiB
Markdown
---
|
|
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;
|
|
- [x] 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?
|
|
- [x] 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í
|
|
- [x] 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é
|
|
- [x] 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í.
|