Vložení výsledku dotazu
Někdy už řádky, které chcete přidat, v databázi v nějaké podobě jsou. Místo abyste je vypisovali za VALUES, můžete je nechat najít dotazem: INSERT INTO … SELECT … přidá každý řádek, který dotaz najde.
Obchod chystá edice Deluxe svých RPG, každou o 200 Kč dražší než původní hra, s vydáním 2026-03-01. Každá z nich je kopií existující hry s několika změnami:
INSERT INTO hry (nazev, zanr, cena, vydano, vek_od)
SELECT nazev || ' Deluxe', zanr, cena + 200, '2026-03-01', vek_od
FROM hry
WHERE zanr = 'RPG';Dotaz najde dvě RPG, takže INSERT přidá dvě hry (Změněné řádky: 2) s ID 21 a 22:
| id | nazev | zanr | cena | vydano |
|---|---|---|---|---|
| 21 | Dragon Forge Deluxe | RPG | 1199 | 2026-03-01 |
| 22 | Knight's Oath Deluxe | RPG | 1799 | 2026-03-01 |
Sloupce dotazu se do vypsaných sloupců ukládají podle pořadí, ne podle názvů: první sloupec dotazu do prvního sloupce seznamu a tak dál. Proto může mít dotaz nazev || ' Deluxe' tam, kde má tabulka nazev, a pevné hodnoty jako '2026-03-01', které jsou v každém řádku stejné. Počty musí souhlasit: když má dotaz méně sloupců než seznam, dostanete chybu jako 3 values for 4 columns.
Dotaz může být cokoli, co znáte: s WHERE, se spojením tabulek, s GROUP BY nebo s poddotazy. Napište ho nejdřív samotný, spusťte ho a zkontrolujte výsledek. Když ukazuje přesně ty řádky, které chcete přidat, napište nad něj řádek s INSERT INTO. Je to stejná rada jako u WHERE v UPDATE: nejdřív se podívejte, pak měňte.
Typická chyba: sloupce dotazu v jiném pořadí, než je seznam. S (zakaznik_id, datum, stav) a SELECT id, 'zaplaceno', '2026-01-01' by se datum uložilo do stavu. Tady to databáze zastaví chybou CHECK constraint failed: stav IN ('zaplaceno', 'vraceno'), ale dva textové sloupce bez pravidla by si hodnoty potichu prohodily.
Jak psát:
Pokyny
Obchod chce poděkovat svým nejvěrnějším zákazníkům: každý, kdo má aspoň 3 zaplacené objednávky, dostane dárek. Napište INSERT … SELECT, který pro každého z nich přidá novou objednávku s datem 2026-01-01 a stavem zaplaceno (dárek do objednávek přidáte později). Zákazníky najděte nejdřív dotazem: seskupte zaplacené objednávky podle zákazníka a nechte ty, kteří jich mají aspoň 3.
Pod něj ukažte zákazníka, datum a stav objednávek s ID větším než 30, seřazené podle zákazníka. Měly by být čtyři:
| zakaznik_id | datum | stav |
|---|---|---|
| 1 | 2026-01-01 | zaplaceno |
| 2 | 2026-01-01 | zaplaceno |
| 3 | 2026-01-01 | zaplaceno |
| 4 | 2026-01-01 | zaplaceno |
Dárkem je Lost Temple (hra 9), jeden kus za 0 Kč. Druhým INSERT … SELECT ho přidejte jako položku ke každé z nových objednávek, které najdete podle data. Pak ukažte všechny položky s hrou Lost Temple, kterou si dřív nikdo nekoupil: jméno zákazníka, který ji dostal, počet kusů a cenu, seřazené podle jména. Měly by to být právě čtyři dárky:
| jmeno | pocet | cena |
|---|---|---|
| Eva Novotná | 1 | 0 |
| Jakub Dvořák | 1 | 0 |
| Lukáš Procházka | 1 | 0 |
| Tereza Svobodová | 1 | 0 |
Začněte programovat zdarma
9/9