Podstawy SQL: SELECT, INSERT, UPDATE, DELETE

Witaj z powrotem.
W poprzedniej lekcji uczyłeś się o bazach danych i tabelach.
Dowiedziałeś się, że baza danych zawiera tabele.
Tabele zawierają wiersze i kolumny.
Wiersze są rekordami.
Kolumny opisują dane.
Bardzo uporządkowane.
Bardzo PostgreSQL.
Dzisiaj uczymy się czterech podstawowych akcji, których będziesz używać cały czas:
SELECT;INSERT;UPDATE;DELETE.
To są główne komendy do pracy z danymi.
Pozwalają ci:
- czytać dane;
- dodawać dane;
- zmieniać dane;
- usuwać dane.
To często nazywa się CRUD.
CRUD oznacza:
Create
Read
Update
Delete
Nie jest to najpiękniejsze słowo.
Brzmi jak coś pod starą klawiaturą.
Ale jest bardzo ważne.
Prawie każda aplikacja robi CRUD.
Blog.
Sklep.
Task manager.
System rezerwacji.
Dashboard.
Nawet elegancka nowoczesna aplikacja z animacjami i emocjonalnymi gradientami prawdopodobnie robi CRUD gdzieś w tle.
Bazy danych są skromne.
Ale potężne.
Czego Się Nauczysz
W tej lekcji nauczysz się:
- jak czytać wiersze przez
SELECT; - jak wybierać konkretne kolumny;
- jak dodawać wiersze przez
INSERT; - jak wstawiać wiele wierszy;
- jak zmieniać wiersze przez
UPDATE; - dlaczego
WHEREjest ekstremalnie ważne; - jak usuwać wiersze przez
DELETE; - jak unikać niebezpiecznych błędów początkujących;
- jak ćwiczyć CRUD na prawdziwej tabeli.
Na końcu tej lekcji będziesz umieć pracować z danymi w tabeli PostgreSQL.
Nie tylko tworzyć tabele.
Naprawdę ich używać.
Tutaj baza danych zaczyna wyglądać jak żywa.
Trochę strasznie.
Ale żywa.
Przygotuj Bazę Danych
Otwórz PostgreSQL:
sudo -iu postgres psql
Połącz się z bazą danych z poprzednich lekcji:
\c learning_postgresql
Jeśli nie masz tej bazy danych, utwórz ją:
CREATE DATABASE learning_postgresql;
Potem połącz się:
\c learning_postgresql
Teraz potrzebujemy tabeli do ćwiczeń.
Użyjemy tabeli o nazwie products.
Jeśli już istnieje, możesz ją najpierw usunąć:
DROP TABLE IF EXISTS products;
Potem utwórz ją:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
category VARCHAR(100),
price INTEGER,
available BOOLEAN
);
Ta tabela przechowuje produkty.
Każdy produkt ma:
id;name;category;price;available.
Prosto.
Czytelnie.
Gotowe do działania.
Tabela stoi tam jakby mówiła:
Proszę, daj mi dane.
Bardzo uprzejmie.
Na razie.
INSERT: Dodawanie Danych
INSERT dodaje nowe wiersze do tabeli.
Przykład:
INSERT INTO products (name, category, price, available)
VALUES ('Laptop', 'Electronics', 900, true);
PostgreSQL powinien powiedzieć:
INSERT 0 1
To znaczy, że jeden wiersz został dodany.
Teraz dodaj więcej produktów:
INSERT INTO products (name, category, price, available)
VALUES ('Mouse', 'Electronics', 25, true);
INSERT INTO products (name, category, price, available)
VALUES ('Keyboard', 'Electronics', 70, false);
INSERT INTO products (name, category, price, available)
VALUES ('Desk Chair', 'Furniture', 150, true);
Teraz mamy dane.
Prawdziwe wiersze.
Tabela nie jest już pusta.
Tabela bez danych jest jak sklep z półkami, ale bez produktów.
Technicznie gotowy.
Emocjonalnie smutny.
Składnia INSERT
Podstawowa struktura wygląda tak:
INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);
Dla naszej tabeli:
INSERT INTO products (name, category, price, available)
VALUES ('Monitor', 'Electronics', 250, true);
Ważne:
Wartości tekstowe używają pojedynczych cudzysłowów:
'Monitor'
'Electronics'
Liczby nie używają cudzysłowów:
250
Boolean używa:
true
false
PostgreSQL jest surowy.
Jeśli napiszesz tekst bez cudzysłowów, nie zgadnie.
PostgreSQL nie robi emocjonalnej interpretacji.
On robi strukturę.
Dlatego go lubimy.
Przeważnie.
Wstawianie Wielu Wierszy
Możesz wstawić wiele wierszy naraz.
Przykład:
INSERT INTO products (name, category, price, available)
VALUES
('Notebook', 'Office', 5, true),
('Pen', 'Office', 2, true),
('Desk Lamp', 'Furniture', 45, true);
To jest przydatne, gdy chcesz dodać kilka wierszy razem.
Teraz przeczytaj tabelę:
SELECT * FROM products;
Powinieneś zobaczyć wszystkie produkty.
Jeśli ich nie widzisz, sprawdź:
- czy połączyłeś się z właściwą bazą danych?
- czy utworzyłeś tabelę?
- czy zapomniałeś średnika?
- czy PostgreSQL pokazał błąd?
PostgreSQL zwykle mówi prawdę.
Czasem brutalnie.
SELECT: Czytanie Danych
SELECT czyta dane z tabeli.
Najprostsze zapytanie:
SELECT * FROM products;
To znaczy:
Daj mi wszystkie kolumny ze wszystkich produktów.
* oznacza wszystkie kolumny.
To jest przydatne do nauki.
Ale w prawdziwych aplikacjach często lepiej wybierać tylko kolumny, których potrzebujesz.
Przykład:
SELECT name, price FROM products;
To pokazuje tylko:
name;price.
Dużo czyściej.
PostgreSQL lubi precyzyjne prośby.
Ludzie też.
Zwykle.
SELECT z Konkretnymi Kolumnami
Spróbuj:
SELECT name FROM products;
To zwraca tylko nazwy produktów.
Spróbuj:
SELECT name, category FROM products;
To zwraca nazwy i kategorie produktów.
Spróbuj:
SELECT name, price, available FROM products;
To zwraca nazwy, ceny i dostępność.
Nie zawsze potrzebujesz wszystkiego.
Jeśli potrzebujesz tylko nazw produktów, poproś tylko o nazwy produktów.
Nie proś o całą szafę bazy danych.
Baza danych nie jest twoją emocjonalną walizką.
SELECT z ORDER BY
Możesz sortować wyniki przez ORDER BY.
Przykład:
SELECT name, price FROM products
ORDER BY price;
To sortuje produkty po cenie od najniższej do najwyższej.
Aby sortować od najwyższej do najniższej:
SELECT name, price FROM products
ORDER BY price DESC;
DESC oznacza descending.
Jest też ASC dla ascending:
SELECT name, price FROM products
ORDER BY price ASC;
Ascending jest domyślne.
Więc to:
ORDER BY price
jest tym samym co:
ORDER BY price ASC
Sortowanie jest przydatne.
Zwłaszcza gdy twoje dane przestają być małe i słodkie.
SELECT z WHERE
WHERE filtruje wiersze.
Przykład:
SELECT * FROM products
WHERE category = 'Electronics';
To znaczy:
Daj mi produkty, gdzie kategoria to Electronics.
Inny przykład:
SELECT * FROM products
WHERE available = true;
To pokazuje tylko dostępne produkty.
Kolejny:
SELECT * FROM products
WHERE price > 100;
To pokazuje produkty z ceną większą niż 100.
Ważna uwaga dla MDX i dokumentacji:
Kiedy piszesz operatory takie jak >, <, >=, <= w zwykłym tekście, wkładaj je w backticks.
W blokach SQL są w porządku.
MDX jest wrażliwy.
Jak PostgreSQL, ale z większym frontendowym dramatem.
WHERE Jest Ważne
WHERE jest ekstremalnie ważne.
Mówi PostgreSQL, które wiersze chcesz.
Bez WHERE komendy często wpływają na wszystkie wiersze.
To jest w porządku dla:
SELECT * FROM products;
Ale niebezpieczne dla:
UPDATE products
SET price = 1;
To aktualizuje każdy produkt.
Wszystkie ceny stają się 1.
Gratulacje.
Zniszczyłeś sklep.
Bardzo hojnie.
Bardzo źle.
Zawsze myśl przed uruchomieniem UPDATE albo DELETE.
Szczególnie bez WHERE.
UPDATE: Zmienianie Danych
UPDATE zmienia istniejące wiersze.
Przykład:
UPDATE products
SET price = 950
WHERE name = 'Laptop';
To zmienia cenę Laptopa.
Teraz sprawdź:
SELECT * FROM products
WHERE name = 'Laptop';
Powinieneś zobaczyć zaktualizowaną cenę.
Podstawowa struktura:
UPDATE table_name
SET column_name = new_value
WHERE condition;
Przykład:
UPDATE products
SET available = true
WHERE name = 'Keyboard';
To sprawia, że Keyboard jest dostępny.
Dobrze.
Klawiatura wróciła do społeczeństwa.
Aktualizacja Wielu Kolumn
Możesz aktualizować wiele kolumn naraz.
Przykład:
UPDATE products
SET price = 80,
available = true
WHERE name = 'Keyboard';
To aktualizuje:
price;available.
Zawsze używaj WHERE, chyba że naprawdę chcesz zaktualizować każdy wiersz.
A jeśli naprawdę chcesz zaktualizować każdy wiersz, zatrzymaj się i pomyśl jeszcze raz.
Potem może to zrób.
Ale ostrożnie.
Z kawą.
I backupami.
Niebezpieczny Błąd z UPDATE
Niebezpieczne:
UPDATE products
SET price = 10;
To aktualizuje wszystkie produkty.
Każdy produkt kosztuje teraz 10.
Laptop?
10.
Mouse?
10.
Desk Chair?
10.
Gratulacje, wynalazłeś bankructwo.
Poprawnie:
UPDATE products
SET price = 10
WHERE name = 'Pen';
Klauzula WHERE cię ratuje.
WHERE nie jest dekoracją.
To pas bezpieczeństwa.
Używaj go.
DELETE: Usuwanie Danych
DELETE usuwa wiersze z tabeli.
Przykład:
DELETE FROM products
WHERE name = 'Pen';
To usuwa produkt o nazwie Pen.
Teraz sprawdź:
SELECT * FROM products;
Pen powinien zniknąć.
Bez pożegnania.
Bez ceremonii.
Po prostu SQL.
Podstawowa struktura:
DELETE FROM table_name
WHERE condition;
Jeszcze raz:
Używaj WHERE.
Proszę.
Niebezpieczny Błąd z DELETE
Niebezpieczne:
DELETE FROM products;
To usuwa wszystkie wiersze z tabeli.
Tabela nadal istnieje.
Ale wszystkie dane zniknęły.
Pusta.
Cicha.
Jak lodówka po wizycie nastolatków.
Poprawnie:
DELETE FROM products
WHERE name = 'Notebook';
To usuwa tylko Notebook.
Przed usunięciem dobrze jest przetestować warunek przez SELECT.
Przykład:
SELECT * FROM products
WHERE name = 'Notebook';
Jeśli wynik jest poprawny, wtedy uruchom:
DELETE FROM products
WHERE name = 'Notebook';
Ten nawyk może uratować cię przed bólem.
Poważnym bólem.
Bólem bazodanowym.
SELECT Przed UPDATE albo DELETE
Dobry nawyk:
Przed tym:
UPDATE products
SET price = 100
WHERE category = 'Office';
Uruchom to:
SELECT * FROM products
WHERE category = 'Office';
Przed tym:
DELETE FROM products
WHERE available = false;
Uruchom to:
SELECT * FROM products
WHERE available = false;
Najpierw sprawdź wiersze.
Potem aktualizuj albo usuwaj.
To nie jest paranoja.
To profesjonalizm.
Profesjonaliści baz danych to po prostu ludzie, którzy nauczyli się strachu w uporządkowany sposób.
RETURNING
PostgreSQL ma przydatną funkcję o nazwie RETURNING.
Może pokazać wiersze dotknięte przez INSERT, UPDATE albo DELETE.
Przykład:
INSERT INTO products (name, category, price, available)
VALUES ('Webcam', 'Electronics', 60, true)
RETURNING *;
To wstawia wiersz i od razu go pokazuje.
Przykład z update:
UPDATE products
SET price = 65
WHERE name = 'Webcam'
RETURNING *;
Przykład z delete:
DELETE FROM products
WHERE name = 'Webcam'
RETURNING *;
RETURNING jest bardzo przydatne.
Pozwala zobaczyć, co się stało.
PostgreSQL mówi:
Oto co zmieniłem.
Bardzo uprzejmie.
Lekko dramatycznie.
NULL w INSERT
Jeśli kolumna pozwala na NULL, możesz ją pominąć podczas wstawiania.
Przykład:
INSERT INTO products (name, price, available)
VALUES ('Mystery Box', 99, false);
Tutaj nie podaliśmy category.
Jeśli category pozwala na NULL, PostgreSQL to zaakceptuje.
Sprawdź:
SELECT * FROM products
WHERE name = 'Mystery Box';
Powinieneś zobaczyć pustą wartość kategorii.
To jest NULL.
NULL oznacza brakującą wartość.
Nie zero.
Nie pusty string.
Brakującą.
SQL traktuje braki poważnie.
Jak detektyw.
Sprawdź Tabelę
Na tym etapie uruchom:
SELECT * FROM products;
Powinieneś mieć kilka wierszy.
Spróbuj:
SELECT name, price FROM products
ORDER BY price DESC;
Spróbuj:
SELECT * FROM products
WHERE available = true;
Spróbuj:
SELECT * FROM products
WHERE category = 'Electronics';
To jest praktyka.
A praktyka to miejsce, gdzie SQL staje się normalny.
Na początku SQL wydaje się dziwny.
Potem pewnego dnia piszesz:
SELECT * FROM products WHERE available = true;
i brzmi naturalnie.
To znaczy, że baza danych cię zaakceptowała.
Może.
Typowe Błędy
Zapomnienie Średnika
Źle:
SELECT * FROM products
Poprawnie:
SELECT * FROM products;
Jeśli psql dalej czeka, prawdopodobnie zapomniałeś ;.
PostgreSQL się nie zawiesił.
Czeka, aż skończysz zdanie.
Bardzo formalnie.
Zapomnienie Cudzysłowów dla Tekstu
Źle:
WHERE name = Laptop;
Poprawnie:
WHERE name = 'Laptop';
Tekst potrzebuje pojedynczych cudzysłowów.
Nazwy kolumn nie.
Ta różnica ma znaczenie.
PostgreSQL nie zgaduje.
To baza danych, nie twoja babcia.
UPDATE Bez WHERE
Niebezpieczne:
UPDATE products
SET available = false;
To sprawia, że wszystkie produkty są niedostępne.
Poprawnie:
UPDATE products
SET available = false
WHERE name = 'Keyboard';
WHERE ratuje dane.
Szanuj WHERE.
DELETE Bez WHERE
Niebezpieczne:
DELETE FROM products;
To usuwa wszystkie wiersze.
Poprawnie:
DELETE FROM products
WHERE name = 'Keyboard';
Przed usuwaniem uruchom SELECT z tym samym warunkiem.
To silny nawyk.
Zachowaj go.
Praktyka
Stwórz tabelę o nazwie tasks.
CREATE TABLE tasks (
id SERIAL PRIMARY KEY,
title VARCHAR(150) NOT NULL,
status VARCHAR(50),
priority INTEGER
);
Wstaw zadania:
INSERT INTO tasks (title, status, priority)
VALUES ('Learn SELECT', 'open', 1);
INSERT INTO tasks (title, status, priority)
VALUES ('Practice INSERT', 'open', 2);
INSERT INTO tasks (title, status, priority)
VALUES ('Be careful with DELETE', 'open', 3);
Przeczytaj wszystkie zadania:
SELECT * FROM tasks;
Zaktualizuj jedno zadanie:
UPDATE tasks
SET status = 'done'
WHERE title = 'Learn SELECT';
Usuń jedno zadanie:
DELETE FROM tasks
WHERE title = 'Practice INSERT';
Przeczytaj ponownie:
SELECT * FROM tasks;
To daje ci pełną praktykę CRUD.
Mała tabela.
Duża lekcja.
Mini Wyzwanie
Stwórz tabelę o nazwie customers.
Powinna mieć:
id;name;email;city;active.
Wstaw przynajmniej pięciu klientów.
Potem napisz zapytania, które:
- pokazują wszystkich klientów;
- pokazują tylko imiona i emaile;
- pokazują tylko aktywnych klientów;
- aktualizują miasto jednego klienta;
- dezaktywują jednego klienta;
- usuwają jednego klienta.
Przed każdym UPDATE albo DELETE najpierw uruchom SELECT z tym samym WHERE.
To jest nawyk.
Nie opcja.
No dobrze, technicznie opcja.
Ale kask też jest opcją.
Rozumiesz.
Podsumowanie
Dzisiaj nauczyłeś się:
INSERTdodaje wiersze;SELECTczyta wiersze;UPDATEzmienia wiersze;DELETEusuwa wiersze;WHEREfiltruje wiersze;ORDER BYsortuje wyniki;RETURNINGpokazuje dotknięte wiersze;- wartości tekstowe potrzebują pojedynczych cudzysłowów;
- booleany używają
truealbofalse; UPDATEbezWHEREzmienia wszystkie wiersze;DELETEbezWHEREusuwa wszystkie wiersze;- sprawdzanie przez
SELECTprzedUPDATEalboDELETEto profesjonalny nawyk.
To jedna z najważniejszych lekcji w kursie.
Dzięki tym czterem komendom możesz wykonywać podstawową pracę prawie każdej aplikacji z bazą danych.
Tworzyć dane.
Czytać dane.
Zmieniać dane.
Usuwać dane.
Proste słowa.
Duża odpowiedzialność.
PostgreSQL daje ci moc.
Używaj jej ostrożnie.
Zwłaszcza obok DELETE.
Następna Lekcja
W następnej lekcji nauczymy się typów danych i ograniczeń.
Zobaczymy:
INTEGER;VARCHAR;TEXT;BOOLEAN;DATE;NOT NULL;UNIQUE;- podstawowe zasady dla bezpieczniejszych tabel.
Bo bazy danych to nie tylko storage.
To także strażnicy struktury.
Surowi strażnicy.
Ze średnikami.