Mester SQL UPDATE: Oppdater databasen din effektivt!

Oppdag hvordan du bruker SQL-kommandoen UPDATE for å endre eksisterende data i en databasetabell.

Som programmerer er det viktig å ha god kjennskap til relasjonsdatabaser. SQL, eller Structured Query Language, er et lettlært språk med en forståelig syntaks. Ved hjelp av SQL kan du lage objekter i databasen og gjøre spørringer mot relasjonsdatabasetabeller.

Du kan bruke SQL-spørringer for å legge til, hente, endre og fjerne data i databasetabeller. Disse operasjonene er kjent under fellesbetegnelsen CRUD-operasjoner.

For å endre data som allerede er lagret i en tabell, kan du bruke SQL-kommandoen UPDATE.

I denne veiledningen vil du lære:

  • Hvordan SQL-kommandoen UPDATE er bygd opp.
  • Hvordan du endrer data basert på spesifikke vilkår eller flere vilkår kombinert med logiske operatorer.
  • En viktig advarsel som det er viktig å være klar over når du bruker SQL-kommandoen UPDATE.

Oppbygningen av SQL-kommandoen UPDATE

SQL-kommandoen UPDATE har følgende struktur:

UPDATE tabellnavn
SET kolonne = ny_verdi
WHERE betingelse;

Dette oppdaterer den spesifiserte kolonnen for alle rader der betingelsen er sann.

For å endre flere kolonner (eller felter), kan du bruke SQL-kommandoen UPDATE slik:

UPDATE tabellnavn
SET kolonne_1 = ny_verdi_1, kolonne_2 = ny_verdi_2, ..., kolonne_k = ny_verdi_k
WHERE betingelse;

Det er viktig å huske at i en relasjonsdatabase:

  • En tabell representerer en type enhet.
  • Radene i tabellen er dataene og representerer en konkret forekomst av enheten.
  • Kolonnene kalles også felter eller attributter. Vi vil bruke begrepene kolonner og felter om hverandre i denne veiledningen.

Eksempler på bruk av SQL-kommandoen UPDATE

La oss se på noen eksempler.

Forberedelser

Før du begynner å kode trenger du følgende:

  • Denne veiledningen bruker SQLite. Du trenger derfor SQLite og en SQLite Database-nettleser (anbefalt) for å følge eksemplene. Du kan også bruke MySQL eller PostgreSQL.
  • For å gjenskape eksemplene trenger du også Python og Faker Python-pakken.

Lage en databasetabell med data

For å følge denne veiledningen kan du bruke følgende kode for å opprette og koble til en kundedatabase som heter customer_db.db. Legg merke til at vi bruker Faker Python-biblioteket for å generere tilfeldige data til kundetabellen:

# main.py

import sqlite3
from faker import Faker
import random

# Kobler til databasen
conn = sqlite3.connect('customer_db.db')
cur = conn.cursor()

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

# Oppretter et Faker-objekt
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))
    cur.execute('INSERT INTO customers (name, city, email, num_orders) 
    VALUES (?,?,?,?)', (name,city,email,num_orders))

# Bekrefter transaksjonen
conn.commit()
cur.close()
conn.close()

📑 For at koden skal fungere uten feil må du ha Python 3.7 (eller nyere) og Faker installert. Du kan installere Faker med pip:

pip install faker

Hvis du allerede har en database og en tabell du kan bruke, kan du gjerne bruke den istedenfor.

Kjøre vår første SQL-spørring

Kundetabellen har disse feltene:

  • kunde-ID: Kunde-ID er primærnøkkelen som brukes til å identifisere hver rad i databasetabellen.
  • navn: Navnet på kunden.
  • by: Byen der kunden bor.
  • e-post: E-postadressen til kunden.
  • num_orders: Antall bestillinger kunden har lagt inn.
  • rabatt: Rabattprosenten, et heltall med standardverdien 2. Siden rabattfeltet har en standardverdi, trenger vi ikke å oppgi en verdi når vi fyller ut tabellen.

📝 Du kan kjøre spørringene og se resultatene med SQLite-kommandolinjeklienten eller SQLite Database-nettleseren.

Jeg vil vise resultatene fra SQLite DB-nettleseren siden de er enklere å tolke.

Kjør denne spørringen for å hente alle radene i kundetabellen:

SELECT * FROM customers;

I praksis bør du unngå å bruke SELECT * med mindre det er nødvendig. Men i dette eksemplet er det greit siden vi bare har 15 rader og få kolonner.

Oppdatere rader basert på ett vilkår

Nå som vi vet hvordan tabellen ser ut, kan vi bruke noen UPDATE-spørringer for å endre data basert på spesifikke vilkår.

📋 Merk: Etter å ha kjørt UPDATE-setningene vil vi bruke SELECT * FROM customers for å se de oppdaterte dataene.

Oppdatere ett enkelt felt

La oss først oppdatere byfeltet for raden med customerID=7:

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

La oss hente alle kolonnene og radene fra kundetabellen:

SELECT * FROM customers;

Vi ser at byfeltet for Danielle Ford (kundeID=7) er oppdatert.

Oppdatere flere felter

I det forrige eksemplet endret vi bare ett felt, byfeltet for raden med kundeID 7. Men vi kan også endre flere felter samtidig, slik vi lærte tidligere.

Her endrer vi både byen og e-postfeltet for raden med kundeID 1:

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

Deretter kjører vi:

SELECT * FROM customers;

Og her er resultatet:

Oppdatere flere rader

Siden vi brukte kunde-ID, som er primærnøkkelen som identifiserer hver kunde, har spørringene vi har kjørt så langt bare endret en enkelt rad.

Men hvis betingelsen er sann for flere rader i tabellen, vil alle de tilsvarende radene bli oppdatert når vi kjører SQL UPDATE-kommandoen.

Ta for eksempel denne spørringen:

UPDATE customers 
SET discount=10
WHERE num_orders > 170;

Kjør deretter denne spørringen:

SELECT * FROM customers;

Her er resultatet:

Denne SQL-kommandoen endrer tre rader. Alle disse radene har num_orders større enn 170, og har nå rabattverdien 10.

Oppdatere rader basert på flere vilkår

Så langt har WHERE-klausulen hatt ett enkelt vilkår, men det er vanlig at filteret har flere vilkår som er koblet sammen med logiske operatorer.

For å forstå dette, la oss sette rabatten til 5 basert på to vilkår:

  • by LIKE «New%»: Dette vilkåret sjekker og inkluderer radene der byfeltet starter med New, og
  • num_orders > 100 filtrerer basert på antall bestillinger, slik at bare rader med antall bestillinger over 100 blir inkludert.

UPDATE-setningen ser da slik ut:

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

Legg merke til at vi nå har to vilkår i WHERE-leddet, som er koblet sammen med den logiske AND-operatoren. Kun radene der begge vilkårene gjelder, blir endret.

Kjør deretter denne spørringen og se resultatet:

SELECT * FROM customers;

Som du ser, blir rabattfeltet oppdatert for de radene der begge betingelsene gjelder:

En viktig advarsel når du bruker SQL-kommandoen UPDATE

I alle UPDATE-setningene vi har kjørt så langt, har vi inkludert WHERE-klausulen.

La oss si at du skal oppdatere rabatten til 25 for en bestemt kunde. Hvis du glemmer å inkludere WHERE-klausulen med kunde-ID-en du skal filtrere på, vil du få:

UPDATE customers
SET DISCOUNT=25;

Kjør deretter:

SELECT * FROM customers;

Du vil se at alle radene i tabellen er oppdatert. Dette er kanskje ikke ønsket oppførsel.

⚠ Husk å inkludere WHERE-klausulen når du bare vil endre et utvalg av rader basert på en betingelse. Hvis du derimot vil endre et felt for alle rader, kan du utelate WHERE-leddet.

I dette eksemplet, la oss si at du har et Black Friday-salg på gang, og du vil gi alle kundene dine 25% rabatt. Da er det fornuftig å kjøre spørringen over.

Konklusjon

Her er en oppsummering av det du har lært:

  • For å endre data i en databasetabell, kan du bruke SQL-kommandoen UPDATE.
  • SQL UPDATE-setningen inneholder vanligvis en WHERE-klausul med en betingelse som bestemmer hvilke rader i tabellen som skal endres.
  • Hvis du utelater WHERE-leddet i UPDATE-setningen, vil alle radene bli endret. Du må derfor være forsiktig med å utelate WHERE-klausulen hvis du ikke ønsker at alle radene i tabellen skal bli endret.

Du kan sjekke ut denne SQL-jukselappen for en rask oversikt.