SQL i PostgreSQL dla developera
Relacyjna baza danych nie jest tylko miejscem do zapisywania rekordów. Kluczowe są model danych, constraints, transakcje, indeksy i sposób wykonywania zapytań. Ten materiał skupia się na SQL i PostgreSQL z perspektywy developera.
Stan na wrzesień 2026: PostgreSQL 18 jest najnowszą stabilną główną linią, a PostgreSQL 19 pozostaje w fazie beta. Przykłady niżej celowo opierają się głównie na mechanizmach, które nie wymagają konkretnego wydania.
Powiązane tematy: API i integracje systemów, Go - czytanie kodu, Node.js, Python - podstawy oraz Testowanie oprogramowania.
1. Model relacyjny
Dane przechowujesz w tabelach.
Przykład:
users
id | email | name
orders
id | user_id | total
Relacja:
users.id ← orders.user_id
2. PostgreSQL
Instalacja Debian:
sudo apt install postgresql
sudo systemctl enable --now postgresql
Wejście:
sudo -u postgres psql
3. Baza i użytkownik
CREATE DATABASE appdb;
CREATE USER appuser WITH PASSWORD 'strong-password';
GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;
4. Tabela
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
5. INSERT
INSERT INTO users (email, name)
VALUES ('user@example.com', 'Anna');
Zwrócenie rekordu:
INSERT INTO users (email, name)
VALUES ('a@example.com', 'A')
RETURNING id;
6. SELECT
SELECT * FROM users;
Wybrane kolumny:
SELECT id, email FROM users;
Warunek:
SELECT * FROM users
WHERE id = 42;
7. ORDER BY i LIMIT
SELECT *
FROM users
ORDER BY created_at DESC
LIMIT 20;
8. UPDATE
UPDATE users
SET name = 'Anna K.'
WHERE id = 42;
9. DELETE
DELETE FROM users
WHERE id = 42;
Zawsze sprawdź WHERE.
10. Foreign key
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
total NUMERIC(12,2) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
11. JOIN
SELECT
orders.id,
users.email,
orders.total
FROM orders
JOIN users ON users.id = orders.user_id;
LEFT JOIN:
SELECT users.*, orders.id
FROM users
LEFT JOIN orders ON orders.user_id = users.id;
12. GROUP BY
SELECT user_id, COUNT(*), SUM(total)
FROM orders
GROUP BY user_id;
13. NULL
Nie porównuj:
field = NULL
Używaj:
field IS NULL
field IS NOT NULL
14. Constraints
Przydatne:
PRIMARY KEY
FOREIGN KEY
UNIQUE
NOT NULL
CHECK
DEFAULT
Przykład:
price NUMERIC CHECK (price >= 0)
15. Indeksy
CREATE INDEX idx_orders_user_id
ON orders(user_id);
Indeks przyspiesza odczyt kosztem: - miejsca, - wolniejszych zapisów.
Nie indeksuj wszystkiego bez potrzeby.
16. EXPLAIN
EXPLAIN SELECT * FROM orders WHERE user_id = 42;
Z wykonaniem:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42;
17. Transakcje
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
Błąd:
ROLLBACK;
18. ACID - skrót
- Atomicity,
- Consistency,
- Isolation,
- Durability.
W praktyce: transakcja ma zachowywać integralność danych.
19. Upsert
INSERT INTO users (email, name)
VALUES ('a@example.com', 'A')
ON CONFLICT (email)
DO UPDATE SET name = EXCLUDED.name;
20. JSONB
PostgreSQL potrafi przechowywać JSON:
metadata JSONB
Nie zastępuj nim całego modelu relacyjnego tylko dlatego, że jest wygodny.
21. Backup
pg_dump appdb > appdb.sql
Custom format:
pg_dump -Fc appdb > appdb.dump
Restore:
pg_restore -d appdb appdb.dump
22. psql - podstawy
\l list databases
\c db connect
\dt tables
\d users describe table
\q quit
23. Connection string
postgresql://appuser:password@localhost:5432/appdb
Hasła trzymaj w secrets/env, nie w repo.
24. Migracje
Zmiany schematu powinny być wersjonowane.
Przykład:
001_create_users.sql
002_create_orders.sql
003_add_status_to_orders.sql
25. Co trzeba umieć
- SELECT/INSERT/UPDATE/DELETE,
- JOIN,
- GROUP BY,
- indeksy,
- constraints,
- transakcje,
- backup/restore,
- podstawy migracji.
Oficjalne źródła
- PostgreSQL documentation: https://www.postgresql.org/docs/current/
- SQL commands: https://www.postgresql.org/docs/current/sql-commands.html
- psql: https://www.postgresql.org/docs/current/app-psql.html
- Backup and restore: https://www.postgresql.org/docs/current/backup.html
- PostgreSQL release news: https://www.postgresql.org/about/news/