Tech Handbook Null Yard

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/