Open software as four years from Windows and Office to policy.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pepaskopec-blip 2026-10-11 19:25:48 +02:00
commit 264f4a73d8
84 changed files with 3327 additions and 4 deletions

View file

@ -0,0 +1,6 @@
---
nazev: A database
popis: A table, a record, a key. When a sheet is no longer enough.
nazev_cviceni: Quiz: databases
nadpis_kvizu: Name the key and the reason for a database
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-databaze
nazev: Databáze
popis: Tabulka, záznam, klíč. Kdy už nestačí Excel.
nazev_cviceni: Kvíz: databáze
nadpis_kvizu: Poznejte klíč a důvod databáze
---
# Výklad
## Excel nestačí
*Vztahy*
- Excel je výborný na jeden seznam. Jakmile se třída opakuje na každém řádku žáka, začne se název třídy rozcházet.
- Databáze drží věci v samostatných tabulkách a spojuje je klíčem.
- Tabulka tridy má název třídy jednou. Tabulka zaci se na ni jen odkáže.
- Access i MySQL umí totéž v principu. Access je soubor accdb, MySQL je server a příkazy SQL.
> Tip: Když opravujete 1.A na 1. A v padesáti řádcích Excelu, má to být tabulka tříd, ne opis.
## Řádek a sloupec
*Záznam a pole*
- Řádek je záznam, třeba jeden žák. Sloupec je pole, třeba prijmeni.
- Každá hodnota je atomická. Jméno a příjmení nepatří do jedné buňky.
- Primární klíč je hodnota, která se v tabulce neopakuje. U žáka je to id, ne příjmení.
- Cizí klíč je pole, které ukazuje na primární klíč jiné tabulky. trida_id v tabulce zaci ukazuje na id v tridy.
> Tip: Dva Nováci se smějí jmenovat stejně. Jejich id je různé. Proto příjmení klíč není.
## Typy
*Číslo, text, datum*
- id je číslo. Jméno je krátký text. Datum narození je datum, ne text 12.6.
- Ano/ne je samostatný typ, ne text ano.
- Do číselného pole nepatří jednotka. Počet žáků je 28, ne 28 žáků.
- Prázdné pole a nula nejsou totéž. Nula je známá hodnota, prázdno je nevíme.
> Tip: Text v číselném poli se nepodaří uložit, nebo se sečte špatně. Typ zvolte při založení sloupce.
## Zadání: návrh na papír
*Cvičení*
- Navrhněte dvě tabulky: tridy (id, nazev) a zaci (id, jmeno, prijmeni, trida_id).
- U každého pole napište typ. id v obou tabulkách je primární klíč.
- Napište dva řádky tříd, 1.A a 1.B, a tři žáky, z toho Annu Novákovou ve třídě 1.A.
- Soubor navrh.txt uložte k databázím. Access ani MySQL ještě neotevírejte, dokud návrh nesedí.
> Tip: Šipka vede od trida_id k id tabulky tridy. Opačně by žák byl klíčem třídy, což není.
# Kvíz
## Co je primární klíč žáka?
- Příjmení
- [x] id, které se neopakuje
- Název třídy
- První sloupec, ať je v něm cokoli
> Příjmení se opakuje. id jednoho žáka ne.
## Co je trida_id v tabulce zaci?
- Primární klíč třídy v téže tabulce
- [x] Cizí klíč na tabulku tridy
- Text 1.A opsaný do každého řádku
- Heslo
> Cizí klíč drží jen číslo třídy. Název třídy žije v tabulce tridy jednou.
## Kdy už je Excel na seznam žáků těsný?
- Jakmile má víc než jeden sloupec
- [x] Když se údaj, třeba název třídy, opakuje a musí zůstat stejný
- Excel nestačí nikdy
- Jakmile je soubor xlsx
> Opakovaný název se rozjede. Databáze ho má v jedné tabulce a ostatní se na ni odkážou.
## Čím se liší nula a prázdné pole?
- Ničím
- [x] Nula je hodnota, prázdné pole znamená, že hodnota chybí
- Prázdné pole je vždy nula
- Nula je text
> Průměr nulu počítá. Prázdnou buňku často ne. Typ i význam se liší.

View file

@ -0,0 +1,6 @@
---
nazev: Access: tables and a relationship
popis: An AutoNumber, a foreign key and a one-to-many link without a cascade.
nazev_cviceni: Quiz: Access
nadpis_kvizu: Pick the key type and the cascade
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-access-tabulky
nazev: Access: tabulky a vztah
popis: Automatické číslo, cizí klíč a vztah 1:N bez kaskády.
nazev_cviceni: Kvíz: Access
nadpis_kvizu: Vyberte typ klíče a kaskádu
---
# Výklad
## Soubor
*accdb*
- Databáze Accessu je jeden soubor accdb. Jmenuje se evidence.accdb.
- Tabulku založíte v návrhovém zobrazení, ne jen v datovém listu. V návrhu je vidět typ.
- Tabulka tridy má pole id a nazev. Tabulka zaci má id, jmeno, prijmeni a trida_id.
- Název pole je bez mezery a bez diakritiky: trida_id. Popisek pro lidi se dá nastavit zvlášť.
> Tip: Datový list je na zapisování řádků. Typ pole se mění v návrhu. Když už v tabulce data jsou, změna typu může selhat.
## Klíče
*Automatické číslo*
- id je typ Automatické číslo a je to primární klíč. Access ho doplňuje sám: 1, 2, 3.
- trida_id je typ Číslo, dlouhé celé číslo. Není to automatické číslo. Píšete ho vy, nebo ho vybere vztah.
- nazev, jmeno a prijmeni jsou Krátký text. Délka 50 stačí.
- Dva primární klíče v jedné tabulce školního cvičení nejsou. Stačí id.
> Tip: Když trida_id necháte jako text, vztah na číselné id třídy Access odmítne. Typy obou konců musí sedět.
## Vztah 1:N
*Bez kaskády*
- Jedna třída má víc žáků. Žák má jednu třídu. To je vztah 1:N.
- Ve vztazích přetáhnete tridy.id na zaci.trida_id.
- Zaškrtněte vynucení referenční integrity. Žák se nesmí odkázat na třídu, která neexistuje.
- Kaskádové odstranění nechte vypnuté. Smazání třídy by jinak smazalo i žáky.
> Tip: Na straně tridy je jednička, na straně zaci je znak nekonečna. Když je to obráceně, táhli jste vztah špatným směrem.
## Zadání: evidence.accdb
*Cvičení*
- Založte evidence.accdb s tabulkami tridy a zaci podle návrhu.
- Vložte třídy 1.A a 1.B. Vložte Annu Novákovou s trida_id třídy 1.A a ještě dva žáky.
- Vztah 1:N s referenční integritou, bez kaskádového odstranění.
- Zkuste uložit žáka s trida_id 99. Access ho má odmítnout. Pak to číslo vraťte na platnou třídu.
> Tip: Když jde uložit trida_id 99, integrita není zapnutá. Otevřete vztahy a vztah vytvořte znovu.
# Kvíz
## Jaký typ má id žáka?
- Krátký text, který píšete ručně
- [x] Automatické číslo a primární klíč
- Ano/ne
- Dlouhý text s celým jménem třídy
> Automatické číslo žák nedoplňuje. Access ho dá samo a v tabulce se neopakuje.
## Jaký typ má trida_id?
- Automatické číslo
- [x] Číslo, dlouhé celé číslo
- Datum
- Ano/ne
> Je to cizí klíč na id třídy, které je taky číslo. Automatické číslo by si vymýšlelo vlastní hodnoty.
## Co dělá referenční integrita?
- Smaže žáky při smazání třídy
- [x] Nedovolí žáka s třídou, která neexistuje
- Schová tabulku
- Převede accdb na xlsx
> Odkaz musí vést na skutečný řádek. Třída 99 bez řádku v tridy projít nemá.
## Proč nechat kaskádové odstranění vypnuté?
- Access ho neumí
- [x] Smazání třídy by smazalo i její žáky
- Jinak nejde uložit accdb
- Kvůli Excelu
> Třída a žáci jsou různá data. Smazat třídu omylem a přijít o žáky je špatná pojistka pro školní cvičení.

View file

@ -0,0 +1,6 @@
---
nazev: Access: queries
popis: A query that shows only class 1.A, and a criterion in quotes.
nazev_cviceni: Quiz: queries
nadpis_kvizu: Fill in the criterion
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-access-dotazy
nazev: Access: dotazy
popis: Dotaz, který ukáže jen třídu 1.A, a kritérium v uvozovkách.
nazev_cviceni: Kvíz: dotazy
nadpis_kvizu: Doplňte kritérium
---
# Výklad
## Dotaz není kopie
*Pohled*
- Dotaz data nekopíruje do nové tabulky. Přečte je a ukáže výsledek.
- Když ve třídě přibude žák, stejný dotaz ho příště ukáže taky.
- Dotaz se dělá v návrhovém zobrazení. Tabulky se přidají a pole se přetáhnou dolů.
- Uložený dotaz se jmenuje zaci_1A. Dotaz1 se neodevzdává.
> Tip: Když dotaz otevřete a data změníte, měníte zdrojovou tabulku. Na prohlížení to vadit nemusí, na omyl ano.
## Kritérium
*1.A*
- Pod pole nazev z tabulky tridy patří kritérium "1.A" včetně uvozovek.
- Bez uvozovek Access text nepozná a dotaz selže, nebo se zeptá na parametr.
- Číselné kritérium uvozovky nemá. id 1 je prostě 1.
- Chcete-li žáky obou tříd, kritérium 1.A tam nedávejte. Filtr, který tam zbyl z minula, výsledek ořeže.
> Tip: Řádek Kritéria je filtr. Řádek Zobrazit schová sloupec, který v dotazu být musí, ale ve výsledku ho nechcete.
## Spojení v dotazu
*Obě tabulky*
- Do dotazu přidejte tridy i zaci. Access použije vztah, který už máte.
- Ven dejte prijmeni, jmeno a nazev třídy. id ven dávat nemusíte.
- Řazení podle prijmeni je vzestupně. V návrhové mřížce je na to řádek Řadit.
- Žák bez třídy se při vnitřním spojení neukáže. Díky integritě takový řádek stejně nemá vzniknout.
> Tip: Když se každý žák ukáže dvakrát, tabulky nejsou spojené a Access udělal všechny kombinace. Vraťte vztah.
## Zadání: jen 1.A
*Cvičení*
- Dotaz zaci_1A ukáže jméno, příjmení a název třídy, jen pro 1.A, seřazené podle příjmení.
- Anna Nováková v něm je. Žák z 1.B v něm není.
- Uložte dotaz do evidence.accdb. Výsledek nekopírujte do Excelu jako jediný výstup.
- Změňte v tabulce příjmení Anny na Novák a dotaz otevřete znovu. Má ukázat Novák.
> Tip: Když se zeptá na parametr 1.A, kritérium nemá uvozovky a Access ho bere jako otázku.
# Kvíz
## Kam patří podmínka "1.A"?
- Do názvu souboru
- [x] Do řádku Kritéria pod polem nazev
- Do primárního klíče místo id
- Do kaskádového odstranění
> Kritéria filtrují řádky. Pole nazev drží text 1.A.
## Proč jsou u 1.A uvozovky?
- [x] Access jinak text pochopí jako parametr nebo chybu
- Protože 1.A je číslo
- Uvozovky se v Accessu nepoužívají
- Aby se zapnula kaskáda
> Textové kritérium se píše v uvozovkách. Číslo ne.
## Co se stane s dotazem, když do třídy 1.A přidáte žáka?
- Dotaz je stará kopie a žáka neukáže
- [x] Po novém otevření ho ukáže
- Access databázi zavře
- Musíte ho opsat do Excelu
> Dotaz čte tabulky. Není to zmrazený export.
## Proč se žák v dotazu objeví dvakrát u každé třídy?
- Má dva primární klíče
- [x] Tabulky v dotazu nejsou spojené vztahem
- Je seřazený podle příjmení
- Filtr je vypnutý
> Bez spojení Access zkombinuje každý řádek s každým. Vztah tomu zabrání.

View file

@ -0,0 +1,6 @@
---
nazev: Access: a form and a report
popis: Entry through a form and printing through a report. The datasheet is not for users.
nazev_cviceni: Quiz: forms
nadpis_kvizu: Pick what is for entry and what is for print
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-access-formulare
nazev: Access: formulář a sestava
popis: Zápis přes formulář a tisk přes sestavu. Datový list není pro uživatele.
nazev_cviceni: Kvíz: formulář
nadpis_kvizu: Vyberte, čím se data zadávají a čím tisknou
---
# Výklad
## Formulář
*Jeden žák*
- Formulář ukáže jeden záznam jako políčka. Datový list ukáže mřížku a tam se běžný uživatel snadno trefí do špatného řádku.
- Formulář Zaci se založí z tabulky zaci. Pole id ať je vidět, ale zamčené. Automatické číslo se nepíše.
- trida_id je lépe rozbalovací seznam, který ukazuje název třídy a ukládá id.
- Formulář se jmenuje frmZaci. Výchozí Formulář1 se neodevzdává.
> Tip: Rozbalovací seznam bere řádky z tabulky tridy. Viditelný sloupec je nazev, vázaný sloupec je id.
## Sestava
*Tisk*
- Sestava je na tisk a na PDF. Formulář je na zápis. Neslouží k tomu totéž.
- Sestava žáků je seskupená podle třídy a v rámci třídy seřazená podle příjmení.
- Záhlaví skupiny ukáže 1.A jednou, ne na každém řádku jako jediný nadpis celé sestavy.
- Do sestavy nepatří tlačítka formuláře. Patří do ní nadpis Evidence žáků a číslo stránky.
> Tip: Náhled sestavy je před tiskem povinný. Prázdná druhá stránka znamená velkou zápatí nebo prázdný oddíl.
## Kdo kam smí
*Ne do návrhu*
- Uživatel, který jen zapisuje žáky, dostane formulář. Návrhové zobrazení ne.
- Mazání záznamu na formuláři je vypnuté, dokud učitel neřekne jinak.
- Sestava se needituje. Když v ní přepíšete jméno, často přepisujete data, a to z sestavy dělat nechcete.
- Záloha je kopie accdb před mazáním. Jediný soubor na ploše záloha není.
> Tip: Soubor, Uložit jako, a datum v názvu: evidence-2026-06-12.accdb. Pak teprve mažete zkušební řádky.
## Zadání: formulář a sestava
*Cvičení*
- frmZaci zapíše jméno, příjmení a třídu. id nejde přepsat.
- Sestava seskupí žáky podle třídy. Anna Nováková je pod 1.A.
- Z formuláře přidejte jednoho žáka do 1.B a v sestavě ho najděte.
- Uložte vše do evidence.accdb. PDF sestavy je evidence-zaci.pdf vedle souboru.
> Tip: Když v rozbalovacím seznamu vidíte čísla místo 1.A, zobrazujete id. Přepněte šířku sloupců, ať je vidět nazev.
# Kvíz
## Čím se ve škole zadává nový žák?
- Přímo v návrhovém zobrazení tabulky
- [x] Formulářem frmZaci
- Přepsáním sestavy
- Excelem místo Accessu bez uložení accdb
> Formulář ukáže jeden záznam a umí seznam tříd. Návrh tabulky je pro autora databáze.
## K čemu je sestava?
- K mazání sloupců
- [x] K tisku a PDF, seskupenému podle třídy
- K nastavení automatického čísla
- K instalaci Accessu
> Sestava formátuje výstup. Zápis zůstává formuláři.
## Proč je id na formuláři zamčené?
- [x] Automatické číslo se nepíše ručně
- Access id neumí ukázat
- Jinak nejde sestava
- Protože je to text
> Číslo přidělí Access. Ruční přepsání by rozbilo klíč.
## Co uděláte před mazáním zkušebních řádků?
- Nic, accdb se sám verzuje
- [x] Kopie souboru s datem v názvu
- Smažete vztah
- Export jen do JPG
> Jedna kopie accdb je záloha. Mazání bez ní nejde vzít zpět tak snadno jako Ctrl+Z ve Wordu.

View file

@ -0,0 +1,6 @@
---
nazev: MySQL: SELECT
popis: Choosing columns, a WHERE condition and a sort. Text sits in single quotes.
nazev_cviceni: Quiz: SELECT
nadpis_kvizu: Pick the right statement
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-mysql-select
nazev: MySQL: SELECT
popis: Výběr sloupců, podmínka WHERE a řazení. Text je v jednoduchých uvozovkách.
nazev_cviceni: Kvíz: SELECT
nadpis_kvizu: Vyberte správný příkaz
---
# Výklad
## Databáze skola
*Dvě tabulky*
- Na serveru je databáze skola. Tabulka tridy má id a nazev. Tabulka zaci má id, jmeno, prijmeni a trida_id.
- Příkazy se píšou v MySQL, ne do Excelu. Středník příkaz ukončí.
- Nejdřív USE skola; ať další příkazy nemíří do jiné databáze.
- Heslo k serveru do sešitu nepatří. Patří učiteli a do klienta, který ho neukazuje v příkazu.
> Tip: Když klient hlásí, že tabulka neexistuje, jste v jiné databázi, nebo je v názvu překlep. SHOW TABLES; ukáže, co tam je.
## SELECT
*Jen to, co potřebujete*
- SELECT prijmeni, jmeno FROM zaci; vrátí dva sloupce všech žáků.
- Hvězdička SELECT * FROM zaci; je na průzkum. Do odevzdaného dotazu vyberte sloupce jménem.
- WHERE trida_id = 1 nechá jen jednu třídu. Číslo je bez uvozovek.
- Text se píše v jednoduchých uvozovkách: WHERE nazev = '1.A'.
> Tip: Dvojité uvozovky kolem 1.A záleží na režimu serveru. Ve škole pište jednoduché, ty platí spolehlivě.
## Pořadí
*ORDER BY*
- ORDER BY prijmeni; seřadí vzestupně, tedy A až Ž.
- ORDER BY prijmeni DESC; je sestupně.
- WHERE patří před ORDER BY. Obrácené pořadí příkazů server odmítne.
- LIMIT 5 vrátí nejvýš pět řádků. Na kontrolu ano, na úplný seznam třídy ne.
> Tip: Nejdřív FROM, pak WHERE, pak ORDER BY. SELECT je na začátku, i když se sloupce vybírají jako první v hlavě.
## Zadání: tři dotazy
*Cvičení*
- Do souboru dotazy.sql napište USE skola; a tři SELECT.
- První: příjmení a jméno všech žáků podle příjmení.
- Druhý: jen žáci s trida_id = 1.
- Třetí: název třídy 1.A z tabulky tridy. Text '1.A' je v jednoduchých uvozovkách.
> Tip: Každý příkaz ukončete středníkem. Bez něj klient čeká na pokračování.
# Kvíz
## Který příkaz vrátí příjmení žáků třídy s id 1?
- [x] SELECT prijmeni FROM zaci WHERE trida_id = 1;
- SELECT prijmeni WHERE trida_id = 1;
- SELECT * FROM tridy WHERE nazev = 1.A;
- WHERE trida_id = 1;
> SELECT říká sloupce, FROM tabulku, WHERE podmínku. Číslo je bez uvozovek.
## Jak se v podmínce zapíše název třídy?
- nazev = 1.A
- [x] nazev = '1.A'
- nazev = "bez uvozovek a bez čísla"
- nazev := 1.A
> Text patří do jednoduchých uvozovek. Bez nich to není řetězec.
## Kam patří ORDER BY?
- Před SELECT
- [x] Za WHERE
- Místo FROM
- Do názvu tabulky
> Pořadí je WHERE, potom ORDER BY. SELECT zůstává první.
## K čemu je ve škole SELECT * ?
- Na odevzdaný tisk všech osobních údajů
- [x] Na rychlý pohled, co v tabulce je
- Místo primárního klíče
- Na smazání řádků
> Hvězdička je průzkum. Odevzdaný dotaz jmenuje sloupce, které mají být vidět.

View file

@ -0,0 +1,6 @@
---
nazev: MySQL: INSERT, UPDATE and DELETE
popis: A new row, a change and a delete. An UPDATE or DELETE without WHERE is not written in class.
nazev_cviceni: Quiz: changing data
nadpis_kvizu: Recognise the safe statement
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-mysql-zmeny
nazev: MySQL: INSERT, UPDATE a DELETE
popis: Nový řádek, oprava a smazání. UPDATE a DELETE bez WHERE se ve škole nepíšou.
nazev_cviceni: Kvíz: změny dat
nadpis_kvizu: Poznejte bezpečný příkaz
---
# Výklad
## INSERT
*Nový žák*
- INSERT INTO zaci (jmeno, prijmeni, trida_id) VALUES ('Anna', 'Nováková', 1); přidá jeden řádek.
- Sloupce v závorce a hodnoty za VALUES musí být ve stejném pořadí a stejném počtu.
- id s automatickým číslem do výčtu nedávejte, server ho doplní.
- Jeden INSERT, jeden žák. Balit pět žáků do nepřehledného příkazu ve cvičení nemusíte.
> Tip: Když server hlásí neznámý sloupec, název nesedí s tabulkou. SHOW COLUMNS FROM zaci; ukáže pravdu.
## UPDATE
*Jen jeden řádek*
- UPDATE zaci SET trida_id = 2 WHERE id = 15; přepíše třídu jen žáku 15.
- Bez WHERE by stejný příkaz přepsat třídu všem. Ve škole se neodevzdává.
- Nejdřív SELECT s stejnou podmínkou WHERE. Až když vidíte jeden správný řádek, pusťte UPDATE.
- SET mění hodnoty. Není to SELECT a nic nevrací kromě počtu ovlivněných řádků.
> Tip: Klient ukáže, kolik řádků se změnilo. Když vidíte desítky a čekali jste jeden, zastavte se a volejte učitele. Záloha se hodí předtím, ne potom.
## DELETE
*Také s WHERE*
- DELETE FROM zaci WHERE id = 15; smaže jeden řádek.
- DELETE FROM zaci; bez WHERE smaže všechny žáky. To není čištění tabulky, to je ztráta dat.
- Smazaný řádek Ctrl+Z v MySQL nevrátí. Vrátí ho záloha, nebo ho vložíte znovu, když znáte hodnoty.
- Mazat třídu, na kterou ještě ukazují žáci, referenční pravidlo nemá dovolit. Nejdřív žáci, nebo třídu nemazat.
> Tip: Před DELETE udělejte SELECT se stejnou podmínkou. Počet řádků musí být ten, který čekáte, obvykle jeden.
## Zadání: tři změny na kopii
*Cvičení*
- Na cvičných datech vložte žáka Petr Svoboda do třídy 1, tedy trida_id 1.
- UPDATE mu změňte třídu na 2, ale jen přes jeho id, které jste předtím přečetli SELECTem.
- Téhož žáka DELETE smažte zase jen podle id. Ostatní žáci v tabulce zůstanou.
- Tři příkazy připojte do dotazy.sql pod komentář, který říká, že UPDATE a DELETE mají WHERE.
> Tip: Komentář v SQL začíná dvěma pomlčkami. Do příkazu se nepočítá, příštímu čtenáři řekne, proč tam WHERE je.
# Kvíz
## Který příkaz přidá Annu do třídy 1?
- [x] INSERT INTO zaci (jmeno, prijmeni, trida_id) VALUES ('Anna', 'Nováková', 1);
- SELECT Anna INTO zaci;
- UPDATE zaci SET Anna;
- DELETE FROM zaci WHERE jmeno = 'Anna';
> INSERT vkládá řádek. Sloupce a hodnoty drží pořadí.
## Jak se změní třída jen žáku s id 15?
- UPDATE zaci SET trida_id = 2;
- [x] UPDATE zaci SET trida_id = 2 WHERE id = 15;
- SELECT trida_id = 2;
- INSERT INTO zaci VALUES (15);
> Bez WHERE by se třída přepsala všem. WHERE id = 15 drží jeden řádek.
## Co udělá DELETE FROM zaci; bez WHERE?
- Nesmaže nic, WHERE je volitelné a server se zeptá
- [x] Smaže všechny řádky v zaci
- Smaže jen poslední řádek
- Jen vypíše žáky
> Bez podmínky je cílem celá tabulka. Ve školním cvičení takový příkaz nepište.
## Co uděláte těsně před UPDATE?
- DELETE bez WHERE
- [x] SELECT se stejnou podmínkou, ať vidíte ty řádky
- DROP tabulky
- Vypnete integritu
> SELECT ukáže, na koho UPDATE dopadne. Až pak má smysl stejné WHERE použít ke změně.

View file

@ -0,0 +1,6 @@
---
nazev: MySQL: joining tables
popis: An INNER JOIN on trida_id, and why the class name is not repeated on every row.
nazev_cviceni: Quiz: JOIN
nadpis_kvizu: Complete the join
---

View file

@ -0,0 +1,79 @@
---
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í.

View file

@ -0,0 +1,6 @@
---
nazev: Assignment: a student register
popis: Classes, students, a relationship and one query that shows 1.A by name.
nazev_cviceni: Quiz: the register
nadpis_kvizu: Walk the keys and the query
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-zadani-databaze
nazev: Zadání: evidence žáků
popis: Třídy, žáci, vztah a jeden dotaz, který ukáže 1.A jménem.
nazev_cviceni: Kvíz: evidence
nadpis_kvizu: Projděte klíče i dotaz
---
# Výklad
## Struktura
*Dvě tabulky*
- tridy: id jako klíč, nazev. Řádky 1.A a 1.B.
- zaci: id jako klíč, jmeno, prijmeni, trida_id jako cizí klíč.
- Anna Nováková je ve třídě 1.A. Ve třídě 1.B je aspoň jeden jiný žák.
- Název 1.A není opsaný v tabulce žáků. Je jen v tridy.
> Tip: Ať děláte Access, nebo MySQL, tahle dvě pole a vztah jsou povinné. Nástroj je obal.
## Access
*Když odevzdáváte accdb*
- evidence.accdb má vztah 1:N, referenční integritu a vypnutou kaskádu.
- Dotaz zaci_1A a formulář frmZaci. Sestava je seskupená podle třídy.
- Žák s neexistující třídou nejde uložit. Vyzkoušeno na trida_id 99.
- PDF sestavy leží vedle accdb.
> Tip: Když učitel otevře jen accdb, formulář a dotaz v něm musí být. Samotné PDF bez souboru nestačí.
## MySQL
*Když odevzdáváte SQL*
- dotazy.sql obsahuje SELECT se WHERE, INSERT, UPDATE i DELETE, oba měnící příkazy s WHERE.
- JOIN vypíše příjmení a název 1.A, seřazené podle příjmení.
- V souboru není heslo k serveru a není DELETE bez WHERE.
- Příkazy jdou spustit znovu jen tam, kde to dává smysl. DELETE testovacího žáka v souboru má konkrétní id a komentář.
> Tip: Odevzdává se text příkazů, ne snímek obrazovky klienta. Snímek smí být navíc.
## Jedno odevzdání
*Ne obě poloviční*
- Stačí jeden nástroj, Access nebo MySQL, ale celý: struktura, data, dotaz na 1.A.
- V dotazu je Anna vidět jako 1.A, ne jako holé číslo, pokud je součástí této části zadání JOIN nebo dotaz s názvem.
- Záloha souboru má datum v názvu, třeba evidence-2026-06-12.accdb.
- Do textu úkolu nepište heslo a nepište, že jste kaskádu zapnuli, pokud jste ji zapnout neměli.
> Tip: Když umíte obojí, odevzdejte jedno pořádně. Dvě rozdělané databáze jsou horší než jedna hotová.
# Kvíz
## Kde leží text 1.A?
- V každém řádku žáka jako jediná pravda
- [x] V tabulce tridy, v poli nazev
- V názvu souboru jako jediném místě
- V hesle
> Žák má jen trida_id. Název je v tabulce tříd jednou.
## Jaký vztah mají třídy a žáci?
- [x] 1:N, jedna třída a víc žáků
- N:N bez třetí tabulky uprostřed školního cvičení
- Žádný, stačí Excel bez klíče
- 1:1, každý žák vlastní tabulku třídy
> Jedna třída, mnoho žáků. Na straně žáků je cizí klíč.
## Co musí mít UPDATE a DELETE v odevzdaném SQL?
- Žádnou podmínku, ať je příkaz krátký
- [x] WHERE, které trefí jen zamýšlené řádky
- Hvězdičku místo sloupců
- Kaskádu v příkazu SELECT
> Bez WHERE se mění nebo maže celá tabulka. Ve cvičení se to neodevzdává.
## Co Access odmítne, když je integrita zapnutá?
- Žáka se třídou 1.A
- [x] Žáka s trida_id 99, které v tridy není
- Formulář
- Sestavu podle příjmení
> Cizí klíč musí ukazovat na existující třídu. 99 v tabulce tříd není.