Dekódování příkazu SQL UPDATE

Osvojte si umění aktualizace databázových záznamů pomocí příkazu SQL UPDATE.

Jako softwaroví inženýři, práce s relačními databázemi je pro vás nezbytná dovednost. SQL, neboli Structured Query Language, je intuitivní a uživatelsky přívětivý jazyk s jednoduchou syntaxí. Umožňuje vám manipulovat s databázovými objekty a provádět dotazy nad tabulkami relačních databází.

Pomocí SQL dotazů můžete vytvářet, číst, aktualizovat a mazat záznamy v tabulkách databáze. Tyto operace se souhrnně označují jako CRUD operace.

Pro úpravu stávajících záznamů v databázi použijete v SQL příkaz UPDATE.

V tomto tutoriálu se dozvíte:

  • Jaká je syntaxe příkazu UPDATE.
  • Jak selektivně aktualizovat záznamy na základě specifické podmínky, případně více podmínek spojených logickými operátory.
  • Na co si dát pozor, abyste předešli nechtěným následkům při používání SQL příkazu UPDATE.

Syntaxe příkazu SQL UPDATE

Základní struktura příkazu SQL UPDATE je:

UPDATE název_tabulky
SET sloupec = nová_hodnota
WHERE podmínka;

Tento dotaz modifikuje hodnotu sloupce ve všech záznamech, které splňují zadanou podmínku.

Pokud potřebujete aktualizovat více sloupců současně, použijte následující formát:

UPDATE název_tabulky
SET sloupec_1 = nová_hodnota_1, sloupec_2 = nová_hodnota_2, ..., sloupec_k = nová_hodnota_k
WHERE podmínka;

V relačních databázích platí, že:

  • Tabulka reprezentuje entitu.
  • Řádky tabulky, nazývané záznamy, představují jednotlivé instance dané entity.
  • Sloupce, někdy nazývané i pole nebo atributy, popisují vlastnosti entity. V tomto textu budeme termíny sloupce a pole používat zaměnitelně.

Příklady použití příkazu SQL UPDATE

Podívejme se na praktické příklady použití.

Předpoklady

Než začnete s kódováním, ujistěte se, že máte:

  • Nainstalované SQLite. Pro tento tutoriál doporučujeme SQLite Database Browser. Alternativně můžete použít i MySQL nebo PostgreSQL.
  • Pokud chcete replikovat kompletní příklad, budete potřebovat Python a Faker Python package.

Vytvoření databázové tabulky se záznamy

Pro účely tohoto tutoriálu si vytvoříme databázi zákazníků `customer_db.db`. Následující fragment kódu v Pythonu vygeneruje databázi a tabulku s fiktivními daty pomocí knihovny Faker:

import sqlite3
from faker import Faker
import random

# Připojení k databázi
conn = sqlite3.connect('customer_db.db')
cur = conn.cursor()

# Vytvoření tabulky
cur.execute('''CREATE TABLE customers (
                  customerID INTEGER PRIMARY KEY,
                  name TEXT,
                  city TEXT,
                  email TEXT,
                  num_orders INTEGER,
                  discount INTEGER DEFAULT 2)''')


# Inicializace Faker
fake = Faker()
Faker.seed(42)

for _ in range(15):
    name = fake.name()
    city = fake.city()
    domain = fake.domain_name()
    email = f"{name[:2]}.{city[:2]}@{domain}"
    num_orders = random.choice(range(200))
    cur.execute('INSERT INTO customers (name, city, email, num_orders) 
    VALUES (?,?,?,?)', (name,city,email,num_orders))

# Uložení změn
conn.commit()
cur.close()
conn.close()

⚠️ Pro bezproblémové spuštění kódu se ujistěte, že máte Python 3.7 (nebo novější) a Faker nainstalované ve vašem vývojovém prostředí. Knihovnu Faker nainstalujete pomocí pip:

pip install faker

Pokud již máte databázi a tabulku, kterou chcete použít, můžete tento krok přeskočit a použít je.

Spuštění našeho prvního SQL dotazu

Tabulka zákazníků obsahuje následující pole:

  • `customerID`: Primární klíč, který jednoznačně identifikuje záznam.
  • `name`: Jméno zákazníka.
  • `city`: Město, kde zákazník bydlí.
  • `email`: Emailová adresa zákazníka.
  • `num_orders`: Počet objednávek, které zákazník učinil.
  • `discount`: Procentuální sleva (celé číslo), s výchozí hodnotou 2. Díky výchozí hodnotě není nutné tuto hodnotu zadávat při vkládání nových záznamů.

📝 Pro spouštění dotazů a prohlížení výsledků můžete použít příkazový řádek SQLite nebo specializovaný nástroj, jako je SQLite Database Browser, který používáme v tomto tutoriálu.

Dotazem na všechny záznamy získáte kompletní obsah tabulky:

SELECT * FROM customers;

V reálné praxi byste se měli vyhnout použití `SELECT *`, pokud to není nezbytně nutné. Pro tento demonstrační příklad je ale použití vhodné, jelikož máme pouze 15 záznamů a malý počet sloupců.

Aktualizace záznamů na základě jedné podmínky

Nyní, když víme, jak tabulka vypadá, můžeme vyzkoušet několik příkazů UPDATE pro aktualizaci záznamů na základě specifických podmínek.

📋 Poznámka: Po provedení každého příkazu UPDATE vždy znovu spustíme `SELECT * FROM customers`, abychom viděli změny.

Aktualizace jednoho pole

Nejprve aktualizujeme pole `city` pro záznam s `customerID = 7`:

UPDATE customers
SET city='Codeshire'
WHERE customerID=7;

Nyní si zobrazíme aktualizovanou tabulku:

SELECT * FROM customers;

Vidíme, že hodnota v poli `city` u záznamu Danielle Ford (s `customerID=7`) byla upravena.

Aktualizace více polí

V předchozím příkladu jsme měnili pouze jedno pole. Stejným způsobem ale můžeme modifikovat i více polí současně:

Aktualizujeme `city` a `email` pro záznam s `customerID=1`:

UPDATE customers
SET city='East Carlisle',email="[email protected]"
WHERE customerID=1;

Následně opět zobrazíme všechny záznamy:

SELECT * FROM customers;

Výsledek:

Aktualizace více záznamů

Protože jsme použili `customerID`, což je primární klíč, předchozí dotazy měnily pouze jeden záznam. Pokud ale podmínka příkazu `UPDATE` platí pro více záznamů, budou upraveny všechny odpovídající.

Podívejme se na následující dotaz:

UPDATE customers 
SET discount=10
WHERE num_orders > 170;

Po spuštění si zobrazíme aktualizované záznamy:

SELECT * FROM customers;

Výstup:

Výsledkem tohoto dotazu je aktualizace tří záznamů, které mají `num_orders` větší než 170 a nyní mají hodnotu `discount` rovnou 10.

Aktualizace záznamů na základě více podmínek

Zatím měla klauzule `WHERE` jen jednu podmínku. V praxi se ale často setkáte s potřebou filtrovat záznamy podle více kritérií spojených logickými operátory.

Představme si situaci, kdy chceme nastavit slevu na 5 u zákazníků, kteří splňují dvě podmínky:

  • `city LIKE ‚Nové %’`: Vybereme ty záznamy, kde pole `city` začíná slovem „Nové“.
  • `num_orders > 100`: Vybereme jen ty záznamy, které mají v `num_orders` více než 100.

Příkaz UPDATE bude vypadat takto:

UPDATE customers
SET DISCOUNT=5
WHERE city LIKE 'New%' AND num_orders>100;

Klauzule `WHERE` nyní obsahuje dvě podmínky spojené logickým operátorem `AND`. Upraveny budou jen ty záznamy, které splní obě podmínky současně.

Zobrazíme si výstup:

SELECT * FROM customers;

Vidíme, že pole `discount` bylo upraveno jen u těch záznamů, které splnily obě podmínky:

Časté upozornění při použití příkazu SQL UPDATE

Všechny doposud použité příkazy `UPDATE` obsahovaly klauzuli `WHERE`.

Představte si, že chcete například nastavit slevu na 25 pro specifického zákazníka, ale omylem zapomenete uvést `WHERE` s `customerID`:

UPDATE customers
SET DISCOUNT=25;

Zobrazíme si tabulku:

SELECT * FROM customers;

Vidíme, že byly aktualizovány *všechny* záznamy v tabulce, což pravděpodobně nebylo zamýšlené chování.

⚠ Proto, pokud chcete aktualizovat jen podmnožinu záznamů, *nikdy* nezapomeňte přidat klauzuli `WHERE`. Pokud naopak chcete aktualizovat *všechny* záznamy v tabulce, klauzuli `WHERE` vynechejte.

V případě, že máte akci „Černý pátek“ a chcete nabídnout slevu 25% všem zákazníkům, vynechání klauzule `WHERE` dává smysl.

Závěr

Shrnutí toho, co jste se naučili:

  • Příkaz `SQL UPDATE` slouží k aktualizaci dat v databázové tabulce.
  • Příkaz `UPDATE` obvykle obsahuje klauzuli `WHERE`, která specifikuje, které záznamy se mají aktualizovat.
  • Vyřazením klauzule `WHERE` aktualizujete *všechny* záznamy v tabulce. Proto je potřeba být opatrný a ujistit se, že to je vaše zamýšlené chování.

Podívejte se na tento SQL cheat sheet pro rychlé referenční informace.