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.