Zapisz się na nasz newsletter
Otrzymuj regularne aktualizacje, specjalne oferty i porady od ekspertów, które pomogą Ci osiągnąć więcej w krótszym czasie.
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.
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.

MySQL — Jak zacząć? Darmowy e-book
Praktyczny przewodnik po świecie SQL. Poznaj typy danych, zapytania SELECT, JOIN, funkcje agregujące i nie tylko.
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ń.



