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:

idnazevzanrcenavydano
21Dragon Forge DeluxeRPG11992026-03-01
22Knight's Oath DeluxeRPG17992026-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.

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_iddatumstav
12026-01-01zaplaceno
22026-01-01zaplaceno
32026-01-01zaplaceno
42026-01-01zaplaceno

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:

jmenopocetcena
Eva Novotná10
Jakub Dvořák10
Lukáš Procházka10
Tereza Svobodová10

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

9/9