Zostań lepszym w SQL — bez nudy
Zapisz się na newsletter i otrzymaj praktyczne ćwiczenia SQL, wskazówki do rozmów rekrutacyjnych i skrót do kursu SkumajBazy.
W tym artykule zobaczysz, jak zainstalować PostgreSQL na Windows, macOS i Linux, utworzyć użytkownika i pierwszą bazę, połączyć się przez konsolę psql lub narzędzie graficzne, a następnie wykonać swoje pierwsze zapytania SELECT. Na koniec znajdziesz zestaw prostych ćwiczeń, dzięki którym od razu zaczniesz działać w praktyce.
Sprawdź, gdzie AI realnie pomoże w Twojej firmie
Bezpłatna rozmowa diagnostyczna online. Jeden konkretny proces albo problem, zero sprzedażowej prezentacji.
Wybierz dogodny termin bezpłatnej rozmowy (30 min).
Umów bezpłatną rozmowęDlaczego warto uczyć się PostgreSQL
PostgreSQL to stabilny, zgodny ze standardem SQL system transakcyjny z silnym naciskiem na spójność danych. Oferuje transakcje ACID, zaawansowane indeksy (B-tree, GIN, GiST, BRIN), widoki materializowane, funkcje okna, CTE i mocne ograniczenia integralności. Dzięki temu nadaje się zarówno do systemów operacyjnych 24/7, jak i analityki.
Jest rozszerzalny: typy JSONB, pełnotekstowe wyszukiwanie, rozszerzenia (np. PostGIS), funkcje w PL/pgSQL i innych językach. Działa na Windows, macOS i Linux, co ułatwia pracę zespołów wieloplatformowych.
Instalacja PostgreSQL na Windows, macOS i Linux
Windows: pobierz instalator ze strony postgresql.org, uruchom, wybierz wersję (np. 16), ustaw hasło dla użytkownika systemowego postgres i zainstaluj pgAdmin. Po instalacji upewnij się, że usługa działa (Services → PostgreSQL) i nasłuchuje na porcie 5432.
macOS: najprościej użyć Postgres.app lub Homebrew: brew install postgresql@16, następnie brew services start postgresql@16. Sprawdź, że psql --version zwraca poprawną wersję i że katalog danych został zainicjalizowany.
Linux: na Debian/Ubuntu użyj apt install postgresql, na Fedora/CentOS/RHEL dnf/yum install postgresql-server i zainicjalizuj bazę (na RHEL/Fedora postgresql-setup --initdb). Uruchom i włącz usługę (systemctl start postgresql, systemctl enable postgresql). Jeśli planujesz połączenia zdalne, skonfiguruj postgresql.conf (listen_addresses) i pg_hba.conf.
Tworzenie użytkownika i bazy danych
Po instalacji zalecane jest utworzenie oddzielnej roli (użytkownika) i pierwszej bazy. Poniższy przykład tworzy rolę z możliwością logowania, bazę z kodowaniem UTF-8 i przekazuje własność roli.
SQL1 2 3 4 5 6 7 8 9 10 11-- Zaloguj się jako superuser (np. postgres) i wykonaj: CREATE ROLE app_user LOGIN PASSWORD 'silne_haslo'; -- alias: CREATE USER CREATE DATABASE app_db OWNER app_user ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0; -- Opcjonalnie: podstawowe uprawnienia po połączeniu do app_db: GRANT CONNECT ON DATABASE app_db TO app_user;
Domyślna metoda uwierzytelniania to SCRAM-SHA-256. Nie cytuj nazw ról, aby uniknąć wrażliwości na wielkość liter. Więcej o uprawnieniach i rolach znajdziesz w: Użytkownicy, role i uprawnienia w PostgreSQL.
Korzystanie z psql i narzędzi graficznych
psql to konsola kliencka. Połącz się: psql -U app_user -d app_db -h localhost -p 5432. Przydatne metakomendy: \l (listuj bazy), \du (role), \dt (tabele), \dn (schematy), \c app_db (przełącz bazę), \? (pomoc). Zmieniaj tryb wyjścia \x on dla szerokich tabel.
GUI: pgAdmin (w zestawie z instalatorem), DBeaver, TablePlus, DataGrip. Do utworzenia połączenia podaj host, port, bazę, użytkownika i metodę SSL. GUI nie zastępuje psql, ale przyspiesza podgląd schematu i wykonywanie prostych zapytań.
Tworzenie pierwszej tabeli i wstawianie danych
Zdefiniuj tabelę z kluczem głównym, ograniczeniami i sensownymi typami danych. Poniżej przykład prostej tabeli klientów.
SQL1 2 3 4 5 6 7 8 9 10 11 12-- Połączony jako app_user do app_db: CREATE TABLE customers ( id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, email text NOT NULL UNIQUE CHECK (position('@' IN email) > 1), full_name text NOT NULL, created_at timestamptz NOT NULL DEFAULT now() ); INSERT INTO customers (email, full_name) VALUES ('anna@example.com', 'Anna Kowalska'), ('jan@example.pl', 'Jan Nowak'), ('zoe@example.net', 'Zoe Nowak');
Dobór typów ma znaczenie dla wydajności i walidacji (np. numeric vs integer, timestamptz vs timestamp). Porównanie typów znajdziesz w: Typy danych w SQL: porównanie PostgreSQL i MySQL.
Pierwsze zapytania SELECT i filtrowanie
Zacznij od prostych kwerend z filtrowaniem, sortowaniem i ograniczeniem liczby wierszy. Używaj ILIKE do wyszukiwania bez rozróżniania wielkości liter.
SQL1 2 3 4 5 6 7 8 9 10 11 12-- Ostatnie konta z domeną .pl SELECT id, email, created_at FROM customers WHERE email ILIKE '%.pl' ORDER BY created_at DESC LIMIT 5; -- Szybkie agregacje SELECT date_trunc('day', created_at) AS day, count(*) AS customers_per_day FROM customers GROUP BY 1 ORDER BY 1;
Kolejne kroki (JOIN, WHERE, GROUP BY) opisuję tu: Podstawy SQL: SELECT, WHERE, JOIN, GROUP BY.
Typowe błędy po instalacji
psql: command not found – dopisz katalog bin do PATH lub uruchom psql pełną ścieżką. Connection refused – usługa nie działa, zły port, firewall lub listen_addresses nie obejmuje żądanego interfejsu. Password authentication failed – zła rola/hasło, brak uprawnień w pg_hba.conf (użyj host ... scram-sha-256).
FATAL: database "user" does not exist – psql domyślnie łączy bazę o nazwie użytkownika; podaj -d app_db lub utwórz bazę. Permission denied – brak GRANT na schemat/tabelę; przydziel GRANT USAGE ON SCHEMA public TO app_user; GRANT SELECT, INSERT ON TABLE .... Problemy z polskimi znakami – twórz bazy w UTF-8 i ustaw client_encoding = 'UTF8'.
Zanim zaczniesz migracje i testy, skonfiguruj podstawowe kopie zapasowe (pg_dump/pg_restore): Backup i odzyskiwanie danych w PostgreSQL.
Mini zestaw ćwiczeń
- Utwórz rolę
shop_useri bazęshop_db, ustaw hasło i przekaz właścicielstwo roli. Połącz się psql jakoshop_user. - Zdefiniuj tabele:
products(id identity, name text not null, price numeric(10,2) check (price > 0)),orders(id identity, customer_email text not null, created_at timestamptz default now()),order_items(order_id bigint references orders(id), product_id bigint references products(id), qty int check (qty > 0), primary key(order_id, product_id)). - Wstaw po kilka rekordów do każdej tabeli (różne ceny, różne daty).
- Napisz zapytania: 1) produkty droższe niż 100, 2) suma wartości zamówień z ostatnich 7 dni, 3) lista zamówień z łączną kwotą (JOIN + GROUP BY), 4) top 3 produktów po sprzedaży.
- Zaktualizuj ceny wszystkich produktów o +5% i sprawdź, które przekroczyły 200. Usuń wiersz w
order_itemsi zweryfikuj spójność. - Dodaj indeks na
orders(created_at)i przetestuj plan zapytania z filtrem daty (EXPLAIN ANALYZE).
Kurs SkumajBazy — Czas w końcu nauczyć się SQLa
Kompleksowy kurs SQL dla programistów, analityków i wszystkich, którzy chcą efektywnie pracować z danymi. Od podstaw do zaawansowanych zapytań.
- ✓24 lekcje wideo + 80 ćwiczeń
- ✓Realne bazy z e-commerce
- ✓Społeczność i code-review



