Odkodowywanie polecenia SQL UPDATE

Dowiedz się, jak używać polecenia SQL UPDATE do aktualizowania rekordów w tabeli bazy danych.

Jako programista powinieneś czuć się komfortowo pracując z bazami danych relacyjnych. SQL (Structured Query Language) to język przyjazny dla początkujących, intuicyjny do nauki i o prostym składni. SQL pozwala tworzyć obiekty bazy danych i zapytania tabel relacyjnych.

Możesz wykonywać zapytania SQL do tworzenia, odczytu, aktualizacji i usuwania rekordów w tabeli bazy danych. Być może wiesz, że te operacje są nazywane operacjami CRUD (Create, Read, Update, Delete).

Aby zaktualizować przechowywane w tabeli bazy danych rekordy, możesz użyć polecenia UPDATE w SQL.

W tym samouczku dowiesz się:

  • Składnia polecenia UPDATE w SQL
  • Jak aktualizować rekordy na podstawie określonego warunku lub wielu warunków połączonych za pomocą operatorów logicznych
  • Wspólne problemy, o których należy pamiętać podczas uruchamiania polecenia UPDATE w SQL

Składnia polecenia UPDATE w SQL

Składnia polecenia UPDATE w SQL jest następująca:

UPDATE nazwa_tabeli
SET kolumna = nowa_wartość
WHERE warunek;

W powyższym zapytaniu aktualizowana jest kolumna dla wszystkich rekordów, dla których warunek jest spełniony.

Aby zaktualizować wiele kolumn (pól), użyj polecenia UPDATE w SQL w ten sposób:

UPDATE nazwa_tabeli
SET kolumna_1 = nowa_wartość_1, kolumna_2 = nowa_wartość_2, ..., kolumna_k = nowa_wartość_k
WHERE warunek;

Pamiętaj, że w bazie danych relacyjnej:

  • Tabela reprezentuje encję.
  • Wiersze tabeli to rekordy i reprezentują instancję encji.
  • Kolumny nazywane są również polami lub atrybutami. W tym samouczku będziemy używać terminów kolumny i pola zamiennie.

Przykłady użycia polecenia UPDATE w SQL

Teraz przejdźmy do kilku przykładów.

Wymagane

Przed rozpoczęciem kodowania:

  • W tym samouczku używamy SQLite. Musisz mieć zainstalowany SQLite i przeglądarkę bazy danych SQLite (zalecane), aby kodować. Możesz również użyć MySQL lub PostgreSQL.
  • Jeśli chcesz odtworzyć przykład, będziesz również potrzebował Pythona i pakietu Python Faker.

Tworzenie tabeli bazy danych z rekordami

Jeśli chcesz kodować razem z tym samouczkiem, możesz uruchomić poniższy fragment kodu, aby utworzyć i połączyć się z bazą danych klienta customer_db.db. Zauważ, że używamy biblioteki Python Faker do generowania syntetycznych danych do wstawienia do tabeli customers:

# main.py

import sqlite3
from faker import Faker
import random

# połączenie z bazą danych
conn = sqlite3.connect('customer_db.db')
cur = conn.cur()

# utworzenie tabeli bazy danych
cur.execute('''CREATE TABLE customers (
                  customerID INTEGER PRIMARY KEY,
                  name TEXT,
                  city TEXT,
                  email TEXT,
                  num_orders INTEGER,
                  discount INTEGER DEFAULT 2)''')


# utworzenie obiektu Faker 
fake = Faker()
Faker.seed(42)

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

# potwierdzenie transakcji 
conn.commit()
cur.close()
conn.close()

📑 Aby ten kod działał bez błędów, upewnij się, że masz zainstalowany Python 3.7 (lub nowszą wersję) oraz bibliotekę Faker. Pakiet Python Faker możesz zainstalować przy użyciu narzędzia pip:

pip install faker

Jeśli masz już bazę danych, do której możesz się podłączyć, i tabelę bazy danych, z której możesz korzystać, możesz również z niej skorzystać.

Wykonanie pierwszego zapytania SQL

Tabela customers ma następujące pola:

  • customerID: customerID to klucz główny, który pomaga nam jednoznacznie zidentyfikować rekord w tabeli bazy danych.
  • name: Imię klienta
  • city: Miasto, do którego należą.
  • email: Adres e-mail.
  • num_orders: Liczba złożonych zamówień.
  • discount: Procent rabatu, liczba całkowita o domyślnej wartości 2. Ponieważ pole discount ma wartość domyślną, nie musimy podawać wartości przy wypełnianiu tabeli bazy danych.

📝 Możesz uruchamiać zapytania i sprawdzać wyniki za pomocą konsolowego klienta SQLite lub przeglądarki bazy danych SQLite.

Poniżej przedstawiam wyniki z przeglądarki bazy danych SQLite, które są łatwe do zinterpretowania.

Uruchom następujące zapytanie, aby uzyskać wszystkie rekordy w tabeli customers:

SELECT * FROM customers;

W praktyce należy unikać używania SELECT *, chyba że jest to konieczne. Jednak w tym przykładzie użyjemy go, ponieważ mamy tylko 15 rekordów i niewiele pól.

Aktualizowanie rekordów na podstawie pojedynczego warunku

Teraz, gdy wiemy, jak wygląda nasza tabela, wykonajmy kilka zapytań UPDATE, aby zaktualizować rekordy na podstawie wymaganego warunku.

📋 Uwaga: Po wykonaniu instrukcji UPDATE uruchomimy SELECT * FROM customers, aby zobaczyć zaktualizowane rekordy.

Aktualizowanie pojedynczego pola

Najpierw zaktualizujmy pole city rekordu o customerID=7:

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

Wybierzmy wszystkie kolumny i rekordy z tabeli customers:

SELECT * FROM customers;

Widzimy, że pole city dla Danielle Ford (customerID=7) zostało zaktualizowane.

Aktualizowanie wielu pól

W poprzednim przykładzie zaktualizowaliśmy tylko jedno pole, a mianowicie pole city rekordu odpowiadającego customerID 7. Ale możemy również aktualizować wiele pól, korzystając ze składni, którą poznaliśmy.

Tutaj aktualizujemy zarówno pole city, jak i pole email odpowiadające customerID 1:

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

Następnie uruchom:

SELECT * FROM customers;

A oto wynik:

Aktualizowanie wielu rekordów

Ponieważ użyliśmy klucza głównego customerID, który jednoznacznie identyfikuje rekord klienta, zapytania, które do tej pory uruchomiliśmy, zaktualizowały tylko jeden rekord.

Jednak jeśli warunek jest prawdziwy dla więcej niż jednego rekordu w tabeli, to wykonanie polecenia aktualizacji SQL aktualizuje wszystkie odpowiadające rekordy.

Przykład takiego zapytania:

UPDATE customers 
SET discount=10
WHERE num_orders > 170;

Teraz uruchom to zapytanie:

SELECT * FROM customers;

Oto wynik:

Wykonanie powyższego polecenia aktualizacji SQL modyfikuje trzy rekordy. Wszystkie mają num_orders większe niż 170 i teraz mają wartość rabatu równą 10.

Aktualizowanie rekordów na podstawie wielu warunków

Do tej pory klauzula WHERE miała prosty warunek, ale często zdarza się, że kryterium filtrowania ma wiele warunków połączonych operatorami logicznymi.

Aby zrozumieć to, ustawmy rabat na 5 na podstawie dwóch warunków:

  • city LIKE ‘New%‘: ten warunek sprawdza i uwzględnia te rekordy, których pole city zaczyna się od New, oraz 
  • num_orders > 100 filtruje rekordy na podstawie liczby zamówień, uwzględniając tylko te rekordy, dla których liczba zamówień jest większa niż 100.

Polecenie UPDATE wygląda następująco:

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

Zauważ, że teraz mamy dwa warunki w klauzuli WHERE — połączone operatorem AND. I aktualizowane są tylko te rekordy, dla których oba warunki są spełnione.

Następnie uruchom to zapytanie i zaobserwuj wynik:

SELECT * FROM customers;

Jak widać na wyjściu, pole rabat dla rekordów, dla których oba powyższe warunki są prawdziwe, zostało zaktualizowane:

Wspólne problemy podczas korzystania z polecenia UPDATE w SQL

We wszystkich dotychczasowych instrukcjach UPDATE zawarliśmy klauzulę WHERE.

Na przykład, chcesz zaktualizować rabat na 25 dla określonego klienta. W zapytaniu aktualizacyjnym zapominasz jednak o dołączeniu klauzuli WHERE z customerID:

UPDATE customers
SET DISCOUNT=25;

Następnie uruchom:

SELECT * FROM customers;

Zobaczysz, że wszystkie rekordy w tabeli zostały zaktualizowane. To może nie być oczekiwane zachowanie.

⚠ Pamiętaj więc, aby dołączyć klauzulę WHERE, gdy chcesz zaktualizować podzbiór rekordów na podstawie warunku. Jeśli chcesz zaktualizować konkretną kolumnę dla wszystkich rekordów, możesz pominięć klauzulę WHERE.

W tym przykładzie powiedzmy, że nadchodzi wyprzedaż Black Friday, i chcesz zaproponować wszystkim klientom rabat w wysokości 25%. Wówczas uruchomienie powyższego zapytania miałoby sens.

Wnioski

Oto podsumowanie tego, czego się nauczyłeś:

  • Aby zaktualizować rekordy w tabeli bazy danych, możesz użyć polecenia UPDATE w SQL.
  • Zapytanie SQL UPDATE zazwyczaj zawiera klauzulę WHERE z warunkiem, który określa podzbiór rekordów (wierszy tabeli) do zaktualizowania.
  • Niewłączenie klauzuli WHERE w instrukcji UPDATE powoduje zaktualizowanie wszystkich rekordów. Dlatego należy uważać, aby nie pomijać klauzuli WHERE, jeśli niechcianym zachowaniem nie jest aktualizowanie wszystkich wierszy tabeli.

Następnie sprawdź ten arkusz odnośników SQL w celu szybkiego odniesienia.