Декодирање СКЛ наредбе УПДАТЕ

Naučite kako da upotrebite SQL UPDATE naredbu za modifikaciju podataka u tabeli baze podataka.

Kao programer, neophodno je da budete vešti u radu sa relacionim bazama podataka. SQL (Structured Query Language) je intuitivan jezik, jednostavan za učenje sa lako razumljivom sintaksom. SQL vam omogućava da kreirate objekte baze podataka i vršite upite nad tabelama relacione baze podataka.

Možete izvršavati SQL upite za kreiranje, čitanje, ažuriranje i brisanje zapisa unutar tabele baze podataka. Ove operacije se često nazivaju CRUD operacijama.

Za izmenu podataka koji se nalaze u tabeli baze podataka, koristite naredbu UPDATE u SQL-u.

U ovom vodiču ćete naučiti:

  • Sintaksu naredbe UPDATE
  • Kako modifikovati zapise na osnovu određenog uslova, ili više uslova povezanih logičkim operatorima
  • Na šta treba obratiti pažnju prilikom izvršavanja SQL UPDATE naredbe

Sintaksa SQL UPDATE naredbe

Sintaksa SQL UPDATE naredbe je:

UPDATE naziv_tabele
SET kolona = nova_vrednost
WHERE uslov;

Gornji upit modifikuje vrednost kolone za sve zapise koji zadovoljavaju uslov.

Da biste modifikovali više kolona (ili polja), koristite SQL UPDATE naredbu na sledeći način:

UPDATE naziv_tabele
SET kolona_1 = nova_vrednost_1, kolona_2 = nova_vrednost_2, ..., kolona_k = nova_vrednost_k
WHERE uslov;

Podsetimo se da u relacionoj bazi podataka:

  • Tabela predstavlja entitet.
  • Redovi tabele su zapisi i predstavljaju instancu entiteta.
  • Kolone se nazivaju i poljima ili atributima. U ovom vodiču, koristićemo termine kolone i polja naizmenično.

Primjeri upotrebe SQL UPDATE naredbe

Pogledajmo sada nekoliko primjera.

Preduslovi

Pre nego što počnemo sa kodiranjem:

  • Ovaj vodič koristi SQLite. Prema tome, trebat će vam SQLite i SQLite Database Browser (preporučeno) za praćenje koda. Možete koristiti i MySQL ili PostgreSQL.
  • Ako želite da ponovite primer, potrebni su vam Python i Faker Python paket.

Kreiranje tabele baze podataka sa zapisima

Ukoliko želite da kodirate zajedno sa ovim vodičem, možete pokrenuti sledeći kod da biste kreirali i povezali se sa bazom podataka klijenata `customer_db.db`. Koristimo Faker Python biblioteku za generisanje sintetičkih podataka za umetanje u tabelu `customers`:

# main.py

import sqlite3
from faker import Faker
import random

# Povezivanje sa bazom
conn = sqlite3.connect('customer_db.db')
cur = conn.cursor()

# Kreiranje tabele u bazi
cur.execute('''CREATE TABLE customers (
                  customerID INTEGER PRIMARY KEY,
                  name TEXT,
                  city TEXT,
                  email TEXT,
                  num_orders INTEGER,
                  discount INTEGER DEFAULT 2)''')


# Kreiranje Faker objekta
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))

# Potvrđivanje transakcije
conn.commit()
cur.close()
conn.close()

📑 Da bi ovaj kod radio bez grešaka, osigurajte da imate Python 3.7 (ili noviju verziju) i Faker instaliran u vašem okruženju. Možete instalirati Faker Python paket koristeći pip:

pip install faker

Ako već imate bazu podataka na koju se možete povezati i tabelu u bazi podataka sa kojom možete da radite, možete ih koristiti po želji.

Izvršavanje našeg prvog SQL upita

Tabela `customers` ima sledeća polja:

  • `customerID`: Primarni ključ koji nam pomaže da jedinstveno identifikujemo zapis u tabeli baze podataka.
  • `name`: Ime kupca.
  • `city`: Grad iz kojeg dolazi kupac.
  • `email`: Adresa e-pošte kupca.
  • `num_orders`: Broj porudžbina koje je kupac napravio.
  • `discount`: Procenat popusta, celobrojna vrednost sa podrazumevanom vrednošću 2. Pošto polje za popust ima podrazumevanu vrednost, nije potrebno unositi vrednost za njega prilikom popunjavanja tabele.

📝 Upite i rezultate možete pregledati koristeći SQLite klijent komandne linije, ili možete upotrebiti SQLite Database Browser.

Prikazaću izlaz iz SQLite DB Browser-a jer ga je lako interpretirati.

Izvršite sledeći upit da biste dobili sve zapise iz tabele `customers`:

SELECT * FROM customers;

U praksi, trebalo bi da izbegavate upotrebu `SELECT *`, osim ako nije neophodno. Ali za ovaj primer, koristićemo ga jer imamo samo 15 zapisa i mali broj polja.

Modifikacija zapisa na osnovu jednog uslova

Sada kada znamo kako izgleda naša tabela, izvršimo nekoliko `UPDATE` upita kako bismo izmenili zapise na osnovu traženog uslova.

📋 Napomena: Nakon izvršavanja `UPDATE` naredbi, izvršićemo `SELECT * FROM customers` da bismo videli izmenjene zapise.

Ažuriranje jednog polja

Prvo, da ažuriramo polje `city` u zapisu sa `customerID=7`:

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

Izaberimo sve kolone i zapise iz tabele `customers`:

SELECT * FROM customers;

Možemo videti da je polje `city` za Danielle Ford (customerID=7) ažurirano.

Ažuriranje više polja

U prethodnom primeru, ažurirali smo samo jedno polje, i to `city` za zapis koji odgovara ID-u kupca 7. Takođe, možemo ažurirati više polja koristeći sintaksu koju smo naučili.

Ovde ažuriramo i `city` i `email` polja za kupca sa `customerID=1`:

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

Zatim izvršavamo:

SELECT * FROM customers;

A ovo je izlaz:

Ažuriranje više zapisa

Budući da smo koristili `customerID`, koji je primarni ključ i jedinstveno identifikuje zapis o kupcu, upiti koje smo do sada izvršili su ažurirali samo jedan zapis.

Međutim, ako je uslov tačan za više od jednog zapisa u tabeli, izvršavanje SQL `UPDATE` naredbe će ažurirati sve odgovarajuće zapise.

Uzmimo za primer ovaj upit:

UPDATE customers
SET discount=10
WHERE num_orders > 170;

Sada pokrenite ovaj upit:

SELECT * FROM customers;

Evo izlaza:

Izvršavanje gornje SQL `UPDATE` naredbe modifikuje tri zapisa. Svi oni imaju `num_orders` veći od 170 i sada imaju vrednost popusta od 10.

Ažuriranje zapisa na osnovu više uslova

Do sada je klauzula `WHERE` imala jednostavan uslov, ali je uobičajeno da kriterijum filtriranja sadrži više uslova povezanih logičkim operatorima.

Da bismo ovo razumeli, postavimo popust na 5 na osnovu dva uslova:

  • `city` KAO ‘Novi%’: ovaj uslov proverava i uključuje one zapise gde polje grada počinje sa Novi, i
  • `num_orders` > 100 filter koji uključuje samo one zapise gde je broj narudžbina veći od 100.

`UPDATE` izjava izgleda ovako:

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

Sada imamo dva uslova u `WHERE` klauzuli – povezana logičkim `AND` operatorom. Ažuriraju se samo oni zapisi za koje su oba uslova tačna.

Zatim, izvršite ovaj upit i pogledajte izlaz:

SELECT * FROM customers;

Kao što se vidi iz izlaza, polje `discount` za one zapise za koje važe oba uslova se ažurira:

Uobičajeno upozorenje kada koristite SQL UPDATE naredbu

U svim do sada izvršenim `UPDATE` naredbama uključili smo `WHERE` klauzulu.

Na primer, želite da postavite popust na 25 za određenog kupca. U upitu za ažuriranje, propustili ste da uključite `WHERE` klauzulu sa ID-om kupca za filtriranje:

UPDATE customers
SET DISCOUNT=25;

Sada izvršite:

SELECT * FROM customers;

Videćete da su svi zapisi u tabeli ažurirani. Ovo možda nije ponašanje koje biste želeli.

⚠ Ne zaboravite da uključite `WHERE` klauzulu kada želite da ažurirate podskup zapisa na osnovu uslova. Ako želite da ažurirate određeno polje za sve zapise, možete izostaviti `WHERE` klauzulu.

U ovom primeru, recimo da imate rasprodaju za Crni petak i želite da ponudite svim svojim kupcima popust od 25%. Tada bi izvršavanje gornjeg upita imalo smisla.

Zaključak

Evo rezimea onoga što ste naučili:

  • Kada želite da ažurirate zapise u tabeli baze podataka, koristite SQL `UPDATE` naredbu.
  • SQL `UPDATE` izraz obično uključuje `WHERE` klauzulu sa uslovom koji određuje podskup zapisa (redova tabele) koje treba ažurirati.
  • Izostavljanjem `WHERE` klauzule u `UPDATE` izjavi, ažuriraju se svi zapisi. Zato morate paziti da ne izostavite `WHERE` klauzulu ako ažuriranje svih redova tabele nije željeno ponašanje.

Pogledajte ovaj SQL cheat sheet za brzu referencu.