SQL (Structured Query Language) to standardowy język służący do zarządzania danymi w relacyjnych bazach danych. W pracy z danymi, gdzie liczy się precyzja, wydajność i bezpieczeństwo, znajomość SQL jest kluczowa. Na platformie Ferryt, która wykorzystuje SQL Server (T-SQL), developerzy pracujący z danymi muszą znać podstawowe operacje SQL, takie jak wybieranie, filtrowanie, łączenie danych, a także zagadnienia związane z kluczami głównymi i obcymi.
W tym artykule omówimy podstawy SQL na przykładzie tabel związanych z danymi klientów bankowych oraz ich zobowiązaniami. Wyjaśnimy, czym są klucze, jak zbudowane są tabele oraz jak tworzyć proste i bardziej złożone kwerendy.
Struktura tabel: klucze główne i obce
Zanim przejdziemy do pisania zapytań SQL, ważne jest zrozumienie, jak zbudowane są tabele w relacyjnej bazie danych. Tabele składają się z kolumn, a każda kolumna ma określony typ danych (np. INT, VARCHAR, DATE). Relacyjne bazy danych opierają się na kluczach, które pozwalają na tworzenie relacji między tabelami.
- Klucz główny (Primary Key): Unikalna kolumna (lub zestaw kolumn), która jednoznacznie identyfikuje każdy rekord w tabeli.
- Klucz obcy (Foreign Key): Kolumna, która odnosi się do klucza głównego w innej tabeli, tworząc relację między dwiema tabelami.
Przykładowe tabele w kontekście bankowym mogą wyglądać następująco:
Tabela klienci
| kolumna | typ danych | opis |
|---|---|---|
klient_id | INT | Klucz główny (unikalne ID klienta) |
imie | VARCHAR(50) | Imię klienta |
nazwisko | VARCHAR(50) | Nazwisko klienta |
data_urodzenia | DATE | Data urodzenia |
Tabela zobowiazania
| kolumna | typ danych | opis |
|---|---|---|
zobowiazanie_id | INT | Klucz główny (unikalne ID zobowiązania) |
klient_id | INT | Klucz obcy odnoszący się do tabeli klienci |
suma_zobowiazan | DECIMAL(15, 2) | Kwota zobowiązania |
data_poczatku | DATE | Data rozpoczęcia zobowiązania |
Tabela splaty
| kolumna | typ danych | opis |
|---|---|---|
splata_id | INT | Klucz główny (unikalne ID spłaty) |
zobowiazanie_id | INT | Klucz obcy odnoszący się do tabeli zobowiazania |
kwota_splaty | DECIMAL(15, 2) | Kwota spłaty |
data_splaty | DATE | Data dokonania spłaty |

Podstawy zapytania SQL: SELECT
Podstawową operacją w SQL jest wybieranie danych z tabeli za pomocą komendy SELECT. Na przykład, jeśli chcemy pobrać informacje o wszystkich klientach, możemy użyć prostego zapytania:
SELECT klient_id, imie, nazwisko, data_urodzenia
FROM dbo.klienci;
Wynikiem tego zapytania będzie lista wszystkich klientów z ich ID, imieniem, nazwiskiem i datą urodzenia.
Alternatywnie, zamiast wymieniać wszystkie kolumny, możemy skorzystać z zapisu SELECT *, który automatycznie wybiera wszystkie kolumny z tabeli:
SELECT *
FROM dbo.klienci;
Chociaż zapis SELECT * jest wygodny, należy używać go ostrożnie, szczególnie w środowiskach produkcyjnych, ponieważ może prowadzić do nieoptymalnych wyników (np. pobierania niepotrzebnych danych, co obciąża bazę). Dlatego w bardziej złożonych zapytaniach lepiej jest jawnie określać kolumny, które są nam potrzebne.
Jeśli chcesz odczytywać dane z tabel bez blokowania rekordów, co może być przydatne w przypadku dużych baz danych lub zapytań raportowych, możesz użyć opcji WITH (NOLOCK). Pozwala to uniknąć blokad, które mogą występować w bazie danych, kiedy inne procesy modyfikują te same dane.
Na przykład, aby pobrać informacje o wszystkich klientach bez blokowania tabeli:
SELECT *
FROM dbo.klienci WITH (NOLOCK);
Użycie klauzuli WITH (NOLOCK) może przyspieszyć działanie zapytań odczytujących duże ilości danych, jednak warto pamiętać, że powoduje to odczyt danych, które mogą być niezatwierdzone (tzw. dirty reads), co może prowadzić do pracy na niepełnych lub tymczasowych danych.
Filtrowanie danych: WHERE
Aby zawęzić wyniki do określonych rekordów, używamy klauzuli WHERE. Na przykład, jeśli chcemy znaleźć tylko tych klientów, którzy urodzili się przed 1999 rokiem, możemy użyć następującego zapytania:
SELECT klient_id, imie, nazwisko, data_urodzenia
FROM dbo.klienci
WHERE data_urodzenia < '1999-01-01';
Wynikiem tego zapytania będzie lista klientów urodzonych przed 1 stycznia 1999 roku, zawierająca ich ID, imię, nazwisko oraz datę urodzenia.
Możemy także łączyć kilka warunków za pomocą operatorów logicznych takich jak AND oraz OR.
Na przykład, jeśli chcemy znaleźć klientów, którzy urodzili się przed 1999 rokiem i mają na imię „Jan”, możemy użyć następującego zapytania:
SELECT klient_id, imie, nazwisko, data_urodzenia
FROM dbo.klienci
WHERE data_urodzenia < '1999-01-01'
AND imie = 'Jan';
W tym przypadku oba warunki muszą być spełnione: klient musi być urodzony przed 1999 rokiem i mieć na imię „Jan”.
Z kolei, jeśli chcemy znaleźć klientów, którzy urodzili się przed 1999 rokiem lub mają na imię „Jan”, możemy zastosować operator OR:
SELECT klient_id, imie, nazwisko, data_urodzenia
FROM dbo.klienci
WHERE data_urodzenia < '1999-01-01'
OR imie = 'Jan';
Wynikiem tego zapytania będzie lista klientów, którzy spełniają przynajmniej jeden z tych warunków: urodzili się przed 1999 rokiem lub mają na imię „Jan” (albo spełniają oba te warunki jednocześnie).
Operator LIKE pozwala na filtrowanie danych na podstawie wzorców.
Jest szczególnie przydatny, gdy chcemy wyszukać dane zawierające określony ciąg znaków. Możemy używać symbolu procenta (%) jako wieloznacznika, który reprezentuje dowolny ciąg znaków.
Na przykład, jeśli chcemy znaleźć wszystkich klientów, których imię zaczyna się na literę „J”, możemy użyć następującego zapytania:
SELECT klient_id, imie, nazwisko, data_urodzenia
FROM dbo.klienci
WHERE imie LIKE 'J%';
Wynikiem tego zapytania będzie lista klientów, których imiona zaczynają się na literę „J” (np. Jan, Jakub, Joanna).
Możemy również szukać klientów, których nazwisko zawiera konkretne litery, np. „ski”:
SELECT klient_id, imie, nazwisko, data_urodzenia
FROM dbo.klienci
WHERE nazwisko LIKE '%ski';
W tym przypadku symbol % po lewej stronie oznacza, że przed „ski” może występować dowolny ciąg znaków, więc zapytanie zwróci wszystkich klientów z nazwiskami kończącymi się na „ski” (np. Kowalski, Nowoski).
Łączenie danych: JOIN i podzapytania (Subqueries)
W relacyjnych bazach danych często musimy łączyć informacje z różnych tabel. W SQL do tego celu służy klauzula JOIN. Przykładowo, możemy połączyć tabelę klienci z tabelą zobowiazania, aby uzyskać pełne dane o klientach oraz ich zobowiązaniach.
SELECT k.klient_id, k.imie, k.nazwisko, z.suma_zobowiazan
FROM dbo.klienci k
JOIN dbo.zobowiazania z ON k.klient_id = z.klient_id;
W tym przykładzie łączymy tabelę klienci z tabelą zobowiazania za pomocą kolumny klient_id, która jest kluczem głównym w tabeli klienci i kluczem obcym w tabeli zobowiazania.
Alternatywnie, można zapisać to zapytanie, używając podzapytania (subquery). Zamiast bezpośrednio łączyć dwie tabele, możemy najpierw wybrać zobowiązania w podzapytaniu, a następnie połączyć te dane z tabelą klienci:
SELECT k.klient_id, k.imie, k.nazwisko,
(SELECT z.suma_zobowiazan
FROM dbo.zobowiazania z
WHERE z.klient_id = k.klient_id) AS suma_zobowiazan
FROM dbo.klienci k;
W tym przypadku podzapytanie wybiera suma_zobowiazan dla każdego klienta z tabeli zobowiazania, bazując na klient_id. Taki sposób zapisu może być przydatny w sytuacjach, gdzie potrzebujemy bardziej złożonych warunków lub selekcji danych w podzapytaniu.
Oba podejścia pozwalają na łączenie danych z różnych tabel, jednak JOIN jest zazwyczaj bardziej wydajnym i preferowanym rozwiązaniem w przypadku prostych relacji między tabelami. Podzapytania (subqueries) są użyteczne w bardziej złożonych scenariuszach, gdzie wymagane są dodatkowe warunki lub agregacje danych w wewnętrznym zapytaniu
Warto dodać, że istnieją również bardziej zaawansowane typy połączeń (JOIN), takie jak LEFT JOIN, RIGHT JOIN, FULL JOIN oraz CROSS JOIN, które pozwalają na różne sposoby łączenia danych. W tym artykule skupiamy się na podstawach i nie będziemy poruszać bardziej zaawansowanych połączeń, jednak są one istotne przy pracy z bardziej złożonymi strukturami danych.

Agregacja danych: SUM, COUNT, AVG oraz aliasowanie kolumn: AS
Agregacja danych w SQL pozwala na wykonywanie operacji takich jak sumowanie, liczenie liczby rekordów czy obliczanie średnich wartości. W tym celu możemy użyć funkcji takich jak SUM(), COUNT() oraz AVG(). Dodatkowo, używając klauzuli AS, możemy nadać kolumnom aliasy (czyli alternatywne nazwy), które ułatwiają zrozumienie wyników zapytań.
Załóżmy, że chcemy wyciągnąć informacje o liczbie klientów, ich sumarycznych zobowiązaniach oraz średniej kwocie zobowiązań na klienta, a także zastosować aliasy, aby nasze wyniki były bardziej czytelne.
SELECT
COUNT(k.klient_id) AS liczba_klientow, -- Liczba wszystkich klientów
SUM(z.suma_zobowiazan) AS laczna_kwota_zobowiazan, -- Sumaryczna kwota zobowiązań wszystkich klientów
AVG(z.suma_zobowiazan) AS srednia_kwota_zobowiazan -- Średnia kwota zobowiązań na klienta
FROM
dbo.klienci k
JOIN
dbo.zobowiazania z ON k.klient_id = z.klient_id;
Omówienie:
COUNT(): FunkcjaCOUNT()zlicza liczbę rekordów. W tym przypadku liczymy, ilu jest klientów (klient_id). Wynik zapytania będzie zawierał liczbę klientów, a dzięki aliasowiAS liczba_klientow, ta kolumna w wynikach będzie miała bardziej czytelną nazwę.SUM(): FunkcjaSUM()sumuje wartości w kolumnie. W tym przykładzie sumujemy wszystkie kwoty zobowiązań z tabelizobowiazania. AliasAS laczna_kwota_zobowiazansprawia, że wynik tej operacji będzie wyświetlany pod przyjazną nazwą.AVG(): FunkcjaAVG()oblicza średnią wartość w kolumnie. Tutaj liczymy średnią kwotę zobowiązań dla wszystkich klientów. AliasAS srednia_kwota_zobowiazanpozwala na nadanie tej kolumnie bardziej intuicyjnej nazwy.AS: KlauzulaASjest używana do nadawania kolumnom aliasów, czyli alternatywnych nazw, które będą widoczne w wynikach zapytania. Jest to szczególnie przydatne, gdy chcemy, aby wyniki były bardziej zrozumiałe dla osób, które je przeglądają (np. w raportach). Aliasowanie nie zmienia struktury bazy danych, a jedynie nazwę kolumny w wynikach zapytania.
Agregacja danych z użyciem funkcji takich jak SUM, COUNT, oraz AVG umożliwia analizę danych na bardziej ogólnym poziomie, np. obliczanie całkowitych kwot lub średnich. Użycie aliasów z klauzulą AS pozwala nadać bardziej czytelne nazwy wynikowym kolumnom, co ułatwia interpretację rezultatów zapytań.
Grupowanie danych: GROUP BY
Klauzula GROUP BY pozwala na grupowanie danych według określonej kolumny, a w połączeniu z funkcją COUNT() możemy policzyć, ile rekordów (np. ilu klientów) przypada na każdą grupę. Poniżej przedstawiamy przykład, który pokazuje, jak policzyć liczbę klientów w każdym mieście.
Załóżmy, że mamy tabelę klienci w której znajduje się kolumna miasto i chcemy zobaczyć, ile klientów pochodzi z każdego miasta:
SELECT
k.miasto, -- Miasto klientów
COUNT(k.klient_id) AS liczba_klientow -- Liczba klientów w danym mieście
FROM
dbo.klienci k
GROUP BY
k.miasto; -- Grupowanie według kolumny "miasto"
Omówienie:
GROUP BY k.miasto: KlauzulaGROUP BYgrupuje dane według kolumnymiasto. Dzięki temu zapytanie zwróci wyniki zgrupowane dla każdego miasta.COUNT(k.klient_id): FunkcjaCOUNT()liczy, ile rekordów (czyli ilu klientów) znajduje się w każdej grupie (w każdym mieście). Wynik tej funkcji pokazuje liczbę klientów w każdym mieście.- Aliasowanie z
AS: UżycieAS liczba_klientowpozwala nadać kolumnie wynikowej bardziej czytelną nazwę, dzięki czemu w wynikach zapytania kolumna zawierająca liczbę klientów będzie miała nazwęliczba_klientow.
Wynikiem tego zapytania będzie tabela, w której dla każdego miasta wyświetlona zostanie liczba klientów. Dzięki temu możemy łatwo zobaczyć, ile klientów mieszka w każdym z miast, co może być przydatne do analiz biznesowych lub raportów.

Sortowanie danych: ORDER BY
Klauzula ORDER BY w SQL pozwala na sortowanie wyników zapytania na podstawie jednej lub kilku kolumn. Możemy sortować dane w kolejności rosnącej (ASC) lub malejącej (DESC). Używanie ORDER BY w połączeniu z klauzulą GROUP BY umożliwia sortowanie wyników grupowania według określonych kryteriów.
Załóżmy, że chcemy uzyskać informacje o liczbie klientów w każdym mieście, a następnie posortować wyniki, aby pokazać miasta z największą liczbą klientów na górze listy. W tym celu użyjemy klauzuli GROUP BY do grupowania danych według miasta, a następnie ORDER BY, aby posortować wyniki według liczby klientów w kolejności malejącej.
SELECT
k.miasto, -- Miasto klientów
COUNT(k.klient_id) AS liczba_klientow -- Liczba klientów w danym mieście
FROM
dbo.klienci k
GROUP BY
k.miasto -- Grupowanie według kolumny "miasto"
ORDER BY
liczba_klientow DESC; -- Sortowanie według liczby klientów w kolejności malejącej
Wynikiem tego zapytania będzie tabela, w której miasta będą uporządkowane według liczby klientów, z miastami o największej liczbie klientów na czołowej pozycji
Ograniczanie wyników: TOP
Klauzula TOP w SQL umożliwia ograniczenie liczby zwracanych rekordów. Jest to przydatne, gdy nie potrzebujemy wszystkich wyników zapytania, a jedynie określoną ich liczbę. Klauzula TOP może być stosowana do wybierania pierwszych rekordów na podstawie wyników posortowanych według określonych kryteriów.
Załóżmy, że chcemy wybrać tylko 5 klientów z tabeli klienci:
SELECT TOP 5
klient_id, imie, nazwisko, miasto
FROM
dbo.klienci;
Gdy pracujesz z dużymi zbiorami danych, testując zapytania, warto ograniczyć liczbę zwracanych rekordów za pomocą TOP. Pomaga to w szybszym uzyskaniu wyników bez przeciążania bazy danych.
Podsumowanie
W artykule omówiliśmy podstawowe aspekty składni SQL oraz techniki efektywnego wykorzystania kwerend w pracy z danymi na platformie Ferryt. Zrozumienie i umiejętne korzystanie z podstawowych komend SQL jest kluczowe w efektywnej pracy z danymi.
Klauzule SELECT, WHERE, GROUP BY, ORDER BY, oraz funkcje agregujące, takie jak SUM, COUNT i AVG, pozwalają na precyzyjne filtrowanie, grupowanie i analizowanie danych. Dodanie klauzuli TOP oraz umiejętność łączenia tabel przy użyciu JOIN wzbogacają możliwości zapytań SQL, umożliwiając jeszcze bardziej zaawansowaną manipulację i analizę danych.
6 Comments
angie
Super wstępniak, czekam na kontynuację i bardziej zaawansowane tematy!
Radoslaw Siekierzynski
Literówka w tytule do poprawienia – „kwerendy” – zabrakło y
Przemysław Dziabas
Poprawione 😉
marta.wegrzyn
To ja dam taki tip dla wszystkich nowych pracowników zaczynających – podpytajcie nowych kolegów gdzie mają udostępniony zestaw najczęściej używanych zapytań, bo każdy ma jakiś zestaw najczęściej wykorzystywanych zapytań do bazy. Ewentualnie samemu sobie utworzyć taką bazę pytań zebranych od współpracowników. Bardzo ułatwia to pracę.
Michał Banaszyk
Świetny artykuł! Bardzo pomocne przykłady kwerend w codziennej pracy z SQL
Elzbieta Karolewska
Super zestawienie zapytań SQL.