SQL (Structured Query Language) to język programowania służący do komunikacji z relacyjnymi bazami danych, pozwalający na pobieranie, dodawanie, modyfikowanie i usuwanie informacji. Najważniejsze komendy dla początkujących to SELECT do wyciągania danych, INSERT do wprowadzania nowych rekordów, UPDATE do ich edycji oraz DELETE do kasowania. Cała reszta to po prostu dodatki ułatwiające pracę z tą wielką czwórką. Prawda jest zresztą absolutnie taka, że bez znajomości podstaw SQL jesteś w branży IT po prostu ślepy. Zależysz od innych. Musisz prosić programistów o każdy najdrobniejszy raport.
Większość ludzi myśli, że bazy danych to czarna magia zarezerwowana dla administratorów z dwudziestoletnim stażem. To błąd. Podstawy SQL opanujesz w jeden weekend. Zrozumienie składni zajmuje kilka godzin. Potem zostaje już tylko praktyka. Wczoraj siedziałem nad logami systemowymi do trzeciej nad ranem, bo nowy analityk w zespole zapomniał o jednym małym warunku w zapytaniu. Zaciągnął do pamięci operacyjnej dwa miliony wierszy naraz. Serwer stanął w płomieniach. Kto pisze takie rzeczy w środku dnia roboczego? My. Ludzie popełniają błędy. Dlatego musisz wiedzieć, co robisz, zanim wciśniesz Enter.
Czym dokładnie jest relacyjna baza danych i jak to działa na co dzień?
Zamiast gadać o wielkich korporacjach i globalnych systemach, spójrzmy na osiedlowy warsztat samochodowy na wrocławskich Krzykach. Mają tam prosty program do obsługi klientów. Pod spodem siedzi relacyjna baza danych. Działa to jak zbiór arkuszy w Excelu, które potrafią ze sobą rozmawiać. Masz tabelę z klientami. Masz tabelę z samochodami. Masz tabelę z naprawami. Każda tabela ma kolumny określające typ informacji i wiersze, w których siedzą konkretne dane.
Relacyjność polega na tym, że nie dublujesz informacji. Jan Kowalski jest wpisany do bazy tylko raz. Otrzymuje swój unikalny numer, tak zwany klucz główny (Primary Key). Kiedy mechanik dodaje nową naprawę, nie wpisuje znowu imienia i nazwiska Jana. Wpisuje po prostu jego numer. To jest klucz obcy (Foreign Key). Dzięki temu poprawa nazwiska klienta w jednym miejscu automatycznie aktualizuje je w całym systemie. Zero bałaganu.
Większość firm używa systemów RDBMS (Relational Database Management System) takich jak PostgreSQL, MySQL czy Microsoft SQL Server. Różnią się detalami. Różnią się wydajnością. Składnia podstawowych zapytań pozostaje jednak w zdecydowanej większości identyczna. Uczysz się raz, używasz wszędzie.
Jakie są najważniejsze komendy SQL do zarządzania danymi?
Zaczynamy od konkretów. Baza danych bez możliwości wyciągania z niej informacji jest bezużyteczna. Do zarządzania informacjami używamy podzbioru poleceń zwanego DML (Data Manipulation Language). Zobaczmy, jak to wygląda w praktyce.
- SELECT: To jest twój chleb powszedni. Używasz tego, żeby pobrać dane z tabeli. Możesz wyciągnąć wszystko, a możesz wybrać tylko konkretne kolumny, posortować je od największej do najmniejszej i odfiltrować tylko te rekordy, które pasują do twojego raportu dla szefa.
- INSERT: Dodaje nowe wiersze.
- UPDATE: Nadpisuje istniejące wartości.
- DELETE: Usuwa rekordy. Absolutnie niebezpieczne narzędzie.
Zastanawiacie się zresztą, dlaczego tak często słyszy się o wyciekach danych albo awariach systemów księgowych? Sam się nad tym borykałem dzisiaj u siebie w biurze. Zrobiliśmy na wdrożeniu szybki skrypt czyszczący stare logi, potem zawiesiło się połączenie z serwerem, więc wprowadzono poprawkę palcem po wodzie pisane przed samym poniedziałkiem. Ktoś odpalił DELETE bez warunku filtrującego. Tabela wyparowała. Odkręcanie tego zajęło nam dobre dwa dni z backupów. To był koszmar. Zawsze sprawdzaj zapytania na środowisku testowym.
W jaki sposób wyciągnąć pierwsze dane przy użyciu SELECT?
Budowa zapytania jest prosta. Mówisz bazie, co chcesz dostać i skąd ma to wziąć.
SELECT imie, nazwisko, miasto FROM klienci;
Powyższe polecenie wyciągnie trzy kolumny z tabeli o nazwie klienci. Jeśli chcesz pobrać absolutnie wszystkie kolumny, używasz gwiazdki. Gwiazdka to symbol oznaczający „wszystko”.
SELECT * FROM klienci;
Używanie gwiazdki w środowisku produkcyjnym to zły pomysł. Obciąża sieć i bazę. Pobieraj tylko to, czego faktycznie potrzebujesz. Programiści często wrzucają gwiazdkę z lenistwa, a potem aplikacja ładuje się piętnaście sekund. Wybieraj konkretne kolumny. Twój serwer ci podziękuje.
Jak filtrować wyniki zapytania za pomocą klauzuli WHERE?
Rzadko potrzebujesz całej tabeli. Zazwyczaj szukasz konkretnych informacji. Chcesz znaleźć klientów z Warszawy. Albo zamówienia o wartości powyżej tysiąca złotych. Do tego służy słowo WHERE.
SELECT nazwa_firmy, nip FROM kontrahenci WHERE miasto = 'Warszawa';
Możesz łączyć warunki. Używasz do tego słów AND oraz OR.
SELECT imie, nazwisko FROM pracownicy WHERE dzial = 'IT' AND pensja > 8000;
Baza danych przejdzie przez każdy wiersz w tabeli pracownicy. Sprawdzi dział. Sprawdzi pensję. Jeśli oba warunki są spełnione, zwróci wynik. To prosta, brutalna logika maszynowa. Nie ma tu miejsca na interpretacje.
Co zrobić, gdy chcemy posortować lub pogrupować wyniki?
Surowe dane rzucone na ekran trudno się czyta. Musisz nadać im strukturę. Służy do tego polecenie ORDER BY. Domyślnie sortuje rosnąco. Jeśli chcesz malejąco, dopisujesz słowo DESC.
SELECT tytul, cena FROM ksiazki ORDER BY cena DESC;
Prawdziwa zabawa zaczyna się przy grupowaniu. GROUP BY pozwala ci agregować dane. Wyobraź sobie, że masz tabelę ze sprzedażą z całego roku. Chcesz wiedzieć, ile zarobiłeś w poszczególnych miesiącach. Używasz funkcji agregującej SUM i grupujesz po miesiącu.
SELECT miesiac, SUM(kwota) FROM sprzedaz GROUP BY miesiac;
Baza zbierze wszystkie transakcje ze stycznia, zsumuje je i wypluje jeden wiersz. Potem zrobi to samo dla lutego. To podstawa jakiejkolwiek analityki biznesowej.
Jak łączyć dane z różnych tabel? Poznaj potęgę JOIN
To jest moment, w którym wielu początkujących odpada. Zupełnie niepotrzebnie. Łączenie tabel to po prostu dopasowywanie klocków na podstawie wspólnego elementu.
Mamy tabelę UZYTKOWNICY. Mamy tabelę ZAMOWIENIA. W tabeli zamówień nie ma nazwisk, jest tylko id_uzytkownika. Chcemy wygenerować raport, który pokaże nazwisko i numer zamówienia obok siebie. Używamy INNER JOIN.
SELECT UZYTKOWNICY.nazwisko, ZAMOWIENIA.numer_zamowienia
FROM UZYTKOWNICY
INNER JOIN ZAMOWIENIA ON UZYTKOWNICY.id = ZAMOWIENIA.id_uzytkownika;
Baza szuka pasujących do siebie identyfikatorów w obu tabelach i skleja je w jeden wiersz wynikowy. INNER JOIN zwraca tylko te rekordy, które mają dopasowanie po obu stronach. Jeśli użytkownik nie ma zamówień, nie pokaże się w wyniku.
Jeśli chcesz pokazać wszystkich użytkowników, nawet tych bez zamówień, używasz LEFT JOIN. Wtedy baza wyświetli nazwisko, a w miejscu numeru zamówienia wstawi wartość NULL (czyli pustkę). Chociaż prawdę mówiąc brakuje nam często twardych danych o zachowaniu starych systemów, więc wydaje się to tylko jedną z możliwych opcji przy projektowaniu struktury raportowania. Czasami w starych bazach Oracle używało się dziwnych operatorów plusa w nawiasach, ale dzisiaj standard ANSI załatwia sprawę wszędzie.
Modyfikacja danych: Jak bezpiecznie używać INSERT, UPDATE i DELETE?
Odczytywanie danych jest bezpieczne. Nic nie zepsujesz. Zmiana danych to inna bajka. Tu musisz mieć pełną kontrolę.
Wrzucanie nowych danych robimy poleceniem INSERT INTO. Wskazujesz tabelę, wymieniasz kolumny w nawiasie, a potem podajesz wartości.
INSERT INTO produkty (nazwa, cena, stan_magazynowy) VALUES ('Laptop X', 4500, 10);
Modyfikacja wymaga polecenia UPDATE. I tu pojawia się najważniejsza zasada w całej karierze bazodanowca. Nigdy, przenigdy nie uruchamiaj UPDATE bez klauzuli WHERE. Jeśli napiszesz po prostu UPDATE pracownicy SET pensja = 10000;, to właśnie dałeś podwyżkę każdemu pracownikowi w firmie, od prezesa po stażystę na portierni.
Poprawna forma wymaga wskazania konkretnego rekordu:
UPDATE pracownicy SET pensja = 10000 WHERE id_pracownika = 154;
To samo dotyczy usuwania. DELETE FROM tabela usuwa wszystko. DELETE FROM tabela WHERE id = 5 usuwa tylko jeden konkretny wiersz. Zmieniliśmy te zasady na robocie u nas w dziale. Zablokowaliśmy możliwość robienia UPDATE i DELETE bez WHERE na poziomie sterowników bazy. Uratowało nam to skórę już kilka razy.
Czy indeksy w tabelach są naprawdę potrzebne?
Indeksy przyspieszają wyszukiwanie. Wyobraź sobie książkę telefoniczną bez ułożenia alfabetycznego. Żeby znaleźć Nowaka, musisz przeczytać każdą stronę po kolei. Baza danych robi to samo. Nazywa się to Full Table Scan. Trwa wieki przy milionach rekordów.
Kiedy nałożysz indeks na kolumnę z nazwiskiem, baza tworzy pod spodem specjalną strukturę drzewiastą. Zamiast czytać całą tabelę, od razu skacze do odpowiedniego miejsca. Zapytanie, które mieliło się minutę, nagle wykonuje się w kilka milisekund. Nie indeksuj jednak wszystkiego. Każdy nowy indeks spowalnia operacje INSERT i UPDATE, bo baza musi ten indeks na bieżąco aktualizować przy każdej zmianie danych.
| Typ zapytania | Szybkość bez indeksu | Szybkość z indeksem |
|---|---|---|
| Wyszukiwanie po nazwisku (SELECT) | Bardzo wolno | Błyskawicznie |
| Dodawanie nowego klienta (INSERT) | Błyskawicznie | Nieco wolniej |
| Aktualizacja danych (UPDATE) | Szybko | Wolniej, wymaga przebudowy |
Dobre praktyki pisania zapytań SQL
Formatowanie kodu ma znaczenie. SQL wybacza brak wcięć i pozwala pisać wszystko w jednej długiej linii. Nie rób tego. Szanuj ludzi, którzy będą czytać ten kod po tobie. Używaj dużych liter dla komend SQL (SELECT, FROM, WHERE), a małych dla nazw tabel i kolumn. Dziel zapytanie na logiczne wiersze.
Używaj aliasów. Jeśli nazwa tabeli to „historia_transakcji_finansowych_2024”, nie przepisuj jej w każdym warunku. Nadaj jej krótki alias „htf”.
Pisz komentarze. Jeśli robisz skomplikowanego JOINa, by obejść jakiś błąd w strukturze danych, napisz o tym. Dwa myślniki -- to początek komentarza w SQL. Zostaw ślad dla potomnych.
Twoje kolejne kroki w świecie baz danych
Zostawmy teorię w spokoju. Czytanie o SQL nie nauczy cię SQL. Musisz to poczuć pod palcami. Ściągnij darmowego PostgreSQL, zainstaluj DBeaver, załóż prostą tabelę i zacznij pisać zapytania. Zepsuj coś celowo. Zobacz, jak baza rzuca błędem składni. Napraw to. Odpal konsolę i napisz swoje pierwsze zapytanie już teraz. Nikt nie zrobi tego za ciebie.
Często zadawane pytania (FAQ)
- Czy SQL jest trudny do nauki dla początkujących?
Nie. Podstawowa składnia SQL (SELECT, INSERT, UPDATE, DELETE) jest bardzo intuicyjna i przypomina prosty język angielski. Opanowanie podstaw zajmuje zazwyczaj kilka dni intensywnej praktyki. - Jaki program do bazy danych wybrać na start?
PostgreSQL lub MySQL to najlepsze darmowe opcje. Do zarządzania bazą i pisania zapytań świetnie sprawdza się darmowy program DBeaver lub pgAdmin. - Co to jest klucz główny (Primary Key)?
To unikalny identyfikator każdego wiersza w tabeli. Żadne dwa rekordy nie mogą mieć tego samego klucza głównego. Najczęściej jest to po prostu automatycznie rosnący numer ID. - Czym różni się DELETE od TRUNCATE?
DELETE usuwa wiersze jeden po drugim i pozwala na użycie warunku WHERE. TRUNCATE natychmiastowo czyści całą tabelę z danych, nie pozwala na filtrowanie i działa znacznie szybciej, ale nie można go łatwo cofnąć. - Dlaczego moje zapytanie SELECT działa bardzo wolno?
Zazwyczaj wynika to z braku odpowiednich indeksów na kolumnach używanych w klauzuli WHERE, pobierania zbyt dużej ilości danych (używanie SELECT *) lub błędnie napisanych połączeń JOIN. - Czy muszę znać SQL jeśli chcę zostać analitykiem danych?
Tak. Jest to absolutny wymóg na rynku pracy. Większość danych firmowych leży w relacyjnych bazach danych, a SQL to jedyny bezpośredni sposób, by je stamtąd wyciągnąć do analizy.
Bibliografia i źródła
1. Ministerstwo Cyfryzacji – https://www.gov.pl/web/cyfryzacja
2. Naukowa i Akademicka Sieć Komputerowa – https://www.nask.pl
3. Polska Agencja Rozwoju Przedsiębiorczości – https://www.parp.gov.pl
4. Główny Urząd Statystyczny – https://stat.gov.pl
