Wyobraź sobie, że jesteś adminem bazy danych i musisz zmienić albo usunąć jakieś rekordy. Ale co, jeśli przypadkiem zaktualizujesz albo usuniesz wszystko? Użycie operatora WHERE to twój "ubezpieczeniowy polis" przeciwko katastrofalnym błędom. Pozwala dokładnie wskazać, które wiersze mają być zmienione w wyniku zapytania.
Na przykład:
UPDATE students
SET status = 'Graduated';
To zapytanie zaktualizuje
absolutnie wszystkie wiersze w tabeli
students. A wyobraź sobie, że zamiast gratulacji z okazji ukończenia, przypadkiem ustawiłeś wszystkim
status = 'Expelled'. Straszne, nie? Żeby tego uniknąć, zawsze używamy
WHERE, żeby wskazać
warunki, które określają, które wiersze mają być zaktualizowane lub usunięte.
Składnia warunku WHERE
WHERE służy do filtrowania wierszy, do których stosowany jest operator. Możesz go użyć w poleceniu UPDATE albo DELETE. Składnia wygląda tak:
Dla UPDATE:
UPDATE tabela
SET kolumna1 = wartość1, kolumna2 = wartość2
WHERE warunek;
Dla DELETE:
DELETE FROM tabela
WHERE warunek;
Bez WHERE zmiany dotkną wszystkich wierszy w tabeli. Dlatego zawsze staraj się podawać warunki, żeby nie zmienić danych, których nie chciałeś ruszać.
Użycie operatorów porównania
Do budowania warunków w WHERE używamy operatorów porównania. Zobaczmy najważniejsze z nich:
| Operator | Opis | Przykład |
|---|---|---|
= |
Równe | age = 18 |
<> |
Nie równe | age <> 18 |
> |
Większe | age > 18 |
< |
Mniejsze | age < 18 |
>= |
Większe lub równe | age >= 18 |
<= |
Mniejsze lub równe | age <= 18 |
Przykład: aktualizujemy status studenta
Jeśli chcesz oznaczyć wszystkich studentów starszych niż 21 lat jako "absolwentów", robisz to tak:
UPDATE students
SET status = 'Graduated'
WHERE age > 21;
Przykład: usuwamy wszystkich studentów młodszych niż 18 lat
Jeśli ktoś przypadkiem dodał niepełnoletnich studentów, możemy ich usunąć:
DELETE FROM students
WHERE age < 18;
Zaawansowane warunki z operatorami logicznymi
Często trzeba filtrować wiersze według kilku kryteriów. Na przykład, żeby zaktualizować tylko tych studentów, którzy są starsi niż 18 lat i uczą się na kursie programowania. Do tego używamy operatorów logicznych: AND, OR i NOT.
Operatory logiczne:
| Operator | Opis | Przykład |
|---|---|---|
AND |
Wykonuje się, jeśli wszystkie warunki są prawdziwe | age > 18 AND course = 'Programming' |
OR |
Wykonuje się, jeśli chociaż jeden warunek jest prawdziwy | age > 18 OR course = 'Programming' |
NOT |
Odwrotność (odwraca wynik warunku) | NOT (age < 18) |
Przykład: aktualizujemy tylko studentów-programistów starszych niż 18 lat
UPDATE students
SET status = 'Advanced'
WHERE age > 18 AND course = 'Programming';
Przykład: usuwamy wszystkich studentów młodszych niż 18 lat lub tych, którzy są na kursie "Śpiew"
DELETE FROM students
WHERE age < 18 OR course = 'Singing';
Jak uniknąć katastrofalnych błędów
Zawsze sprawdzaj warunek przed wykonaniem!
Jeśli napiszesz zapytanie bez WHERE, PostgreSQL z radością wykona je dla wszystkich wierszy w tabeli. Oto co się stanie:
DELETE FROM students;
-- Ups! Wszystkie rekordy z tabeli students zostały usunięte!
Żeby tego uniknąć, dodaj WHERE:
DELETE FROM students
WHERE student_id = 123;
Tip: jeśli nie jesteś pewien, jaki efekt da warunek, zacznij od polecenia SELECT. Na przykład:
SELECT * FROM students
WHERE student_id = 123;
Jak już się upewnisz, że wybór jest poprawny, wykonaj UPDATE albo DELETE.
Praktyczne przykłady
Przykład 1: Aktualizacja statusów studentów
Załóżmy, że mamy tabelę students:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Beginner |
| 2 | Maria Chi | 22 | Mathematics | Graduated |
| 3 | Eva Gram | 19 | Programming | Beginner |
Chcemy oznaczyć wszystkich studentów-programistów starszych niż 18 lat jako "Intermediate":
UPDATE students
SET status = 'Intermediate'
WHERE age > 18 AND course = 'Programming';
Efekt:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Intermediate |
| 2 | Maria Chi | 22 | Mathematics | Graduated |
| 3 | Eva Gram | 19 | Programming | Beginner |
Przykład 2: Usuwanie wydalonych studentów
Załóżmy teraz, że mamy studentów na kursach, których trzeba się pozbyć. Na przykład studentów z kursu "Historia sztuki". Tabela:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Intermediate |
| 4 | Alex Ming | 21 | History of Arts | Expelled |
Usuwamy studentów z kursu "History of Arts":
DELETE FROM students
WHERE course = 'History of Arts';
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Intermediate |
Przykład 3: Aktualizacja bez warunków (i dlaczego to zły pomysł)
Jeśli napiszesz:
UPDATE students
SET status = 'Absolwent';
WSZYSCY studenci zostaną absolwentami. Dlatego zawsze zaleca się używać WHERE!
Załóżmy, że początkowo mieliśmy taką tabelę:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Intermediate |
| 2 | Maria Chi | 22 | Mathematics | Graduated |
| 3 | Eva Gram | 19 | Programming | Beginner |
Po wykonaniu UPDATE bez WHERE:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Absolwent |
| 2 | Maria Chi | 22 | Mathematics | Absolwent |
| 3 | Eva Gram | 19 | Programming | Absolwent |
😬 Widzisz? Wszystkie statusy zostały podmienione. Taki błąd może być nieodwracalny, zwłaszcza bez backupu. Dlatego WHERE to twój ziomek!
Specyfika i pułapki
Chociaż operator WHERE jest mega przydatny, początkujący często popełniają błędy:
- Brak warunku: zapomnisz o
WHEREi wszystkie wiersze zostaną zmienione. - Zły warunek: jeśli napiszesz np.
age = 19zamiastage < 19, możesz zmienić nie te dane, co trzeba. - Złożone warunki: źle ustawione priorytety (
ANDiOR) mogą dać nieoczekiwane efekty. Używaj nawiasów dla jasności:DELETE FROM students WHERE (age > 18 AND course = 'Programming') OR course = 'Mathematics';
Staraj się pisać zapytania tak, żeby były maksymalnie czytelne dla ciebie i twoich ziomków z zespołu.
Teraz już wiesz, jak używać WHERE do bezpiecznej i pewnej aktualizacji oraz usuwania danych. To narzędzie to twój najlepszy kumpel w pracy z bazami danych. I pamiętaj: lepiej sprawdzić warunek dwa razy, niż potem ratować dane!
GO TO FULL VERSION