Skip to content Skip to sidebar Skip to footer

Podstawy SQL dla Ferryt Developerów: przydatne kwerendy SQL w pracy z danymi dla Ferryt Developerów

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

kolumnatyp danychopis
klient_idINTKlucz główny (unikalne ID klienta)
imieVARCHAR(50)Imię klienta
nazwiskoVARCHAR(50)Nazwisko klienta
data_urodzeniaDATEData urodzenia

Tabela zobowiazania

kolumnatyp danychopis
zobowiazanie_idINTKlucz główny (unikalne ID zobowiązania)
klient_idINTKlucz obcy odnoszący się do tabeli klienci
suma_zobowiazanDECIMAL(15, 2)Kwota zobowiązania
data_poczatkuDATEData rozpoczęcia zobowiązania

Tabela splaty

kolumnatyp danychopis
splata_idINTKlucz główny (unikalne ID spłaty)
zobowiazanie_idINTKlucz obcy odnoszący się do tabeli zobowiazania
kwota_splatyDECIMAL(15, 2)Kwota spłaty
data_splatyDATEData 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:
  1. COUNT(): Funkcja COUNT() 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 aliasowi AS liczba_klientow, ta kolumna w wynikach będzie miała bardziej czytelną nazwę.
  2. SUM(): Funkcja SUM() sumuje wartości w kolumnie. W tym przykładzie sumujemy wszystkie kwoty zobowiązań z tabeli zobowiazania. Alias AS laczna_kwota_zobowiazan sprawia, że wynik tej operacji będzie wyświetlany pod przyjazną nazwą.
  3. AVG(): Funkcja AVG() oblicza średnią wartość w kolumnie. Tutaj liczymy średnią kwotę zobowiązań dla wszystkich klientów. Alias AS srednia_kwota_zobowiazan pozwala na nadanie tej kolumnie bardziej intuicyjnej nazwy.
  4. AS: Klauzula AS jest 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:
  1. GROUP BY k.miasto: Klauzula GROUP BY grupuje dane według kolumny miasto. Dzięki temu zapytanie zwróci wyniki zgrupowane dla każdego miasta.
  2. COUNT(k.klient_id): Funkcja COUNT() 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.
  3. Aliasowanie z AS: Użycie AS liczba_klientow pozwala 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

Leave a comment