Wstęp: Od prostego pytania do precyzyjnego śledztwa
Witaj w drugiej części podróży po świecie SQL. W poprzedniej lekcji zrobiliśmy najważniejszy, pierwszy krok: nauczyliśmy się prosić bazę danych o pokazanie nam zawartości jej „segregatorów” za pomocą SELECT
i FROM
. Wyświetlaliśmy całe tabele lub wybrane kolumny.
Dzisiaj pójdziemy o krok dalej. W karate nie chodzi tylko o to, by uderzyć, ale by trafić w konkretny punkt. W SQL nie chodzi tylko o to, by zobaczyć dane, ale by zobaczyć dokładnie te dane, których potrzebujemy. Nauczymy się sztuki filtrowania, a potem zrobimy coś naprawdę potężnego – połączymy informacje z dwóch różnych tabel.
Część 1: WHERE
– Twój filtr do danych
Wyobraź sobie, że nasza tabela Customers
z poprzedniej lekcji ma tysiące wpisów. Wyświetlanie ich wszystkich mija się z celem, jeśli interesuje nas tylko jeden, konkretny klient lub klienci z jednego miasta.
Do tego właśnie służy klauzula WHERE
. To jest warunek, który muszą spełnić dane, aby zostały wyświetlone. To jak powiedzieć swojemu asystentowi: „Pokaż mi listę klientów, ale tylko tych, którzy są z Londynu„.
Wróćmy do naszego narzędzia online: SQL Tryit Editor – W3Schools
Pamiętasz nasze ostatnie zapytanie? SELECT * FROM Customers;
Teraz dodajmy do niego warunek. Chcemy zobaczyć klientów tylko z Londynu. Zrobimy to tak:
SQL
SELECT * FROM Customers WHERE City = 'London';
Uruchom to zapytanie. Zobacz, co się stało? Lista została przefiltrowana. Widzisz tylko te wiersze, w których kolumna City
ma wartość London
.

Rozkład na części:
WHERE
– czyli Gdzie: to słowo kluczowe, które rozpoczyna blok warunku. Zawsze piszemy je poFROM
.City = 'London'
– to jest nasz warunek. Składa się z trzech części:- Nazwa kolumny (
City
), którą sprawdzamy. - Operator porównania (
=
), w tym przypadku „jest równe”. - Wartość, z którą porównujemy (
'London'
).
- Nazwa kolumny (
Ważna uwaga: Zauważ, że tekst 'London’ umieściłem w pojedynczych cudzysłowach (' '
). W SQL każdy fragment tekstu (nazywany stringiem) musimy w ten sposób oznaczyć. Liczby natomiast piszemy bez cudzysłowów.
Sprawdźmy to na tabeli Products
. Znajdźmy produkty, które kosztują mniej niż 20:
SQL
SELECT * FROM Products WHERE Price < 20;

Proste, prawda? Możesz używać różnych operatorów:
=
– równa się>
– większe niż<
– mniejsze niż>=
– większe lub równe<=
– mniejsze lub równe<>
– różne od
Poćwicz sam: Spróbuj znaleźć pracowników (Employees
), którzy mają EmployeeID
większe od 5.
Ale to nie wszystko. Te operatory są matematyczne. Jeśli chcesz wyszukać dane tekstowe, i wybrać no wszystkie miasta zaczynające się, albo zawierające jakiś tekst, to wtedy używamy operatora LIKE – czyli jak.
SQL
SELECT * FROM Customers WHERE City like '%id%';
Powyżej znajdziemy wszystkie, gdzie w słowie miasto występuje id a znak procenta oznacza, dowolne inne znaki w dowolnej długości.

Czy, chcemy miasta zaczynające się od litery K?: City LIKE 'K%’;

A kończące się na K?: LIKE '%k’;

Z WHERE (=, <, <=,>,>=, <>) i LIKE będziecie korzystać bardzo często!
Część 2: JOIN
– Gdy jeden segregator to za mało
Do tej pory pracowaliśmy w obrębie jednej tabeli – jednego „segregatora”. To wygodne, ale w rzeczywistości dane są często powiązane i przechowywane w różnych miejscach. To co łączy te arkusze w różnych segregatorach to relacje pomiędzy nimi.
DLATEGO TE BAZY NAZYWAJAJĄ SIĘ RELACYJNYMI!
Wyobraźmy sobie prosty scenariusz: Mamy segregator Customers
(Klienci) i osobny segregator Orders
(Zamówienia). W segregatorze Orders
jest zapisane, kto złożył zamówienie, ale tylko pod postacią numeru ID klienta (CustomerID
). Pełna nazwa tego klienta jest w segregatorze Customers
.
Skomplikowane?
Zobacz, nie tak bardzo

W zamówieniach mam numerek który wskazuje na klienta. to jego ID czyli unikalny numer.
Każdy rekord, czyli wiersz w bazie, zazwyczaj ma taką unikalną wartość. A tu właśnie mamy relację, gdzie jeden klient, ma wiele zamówień. ten z numerem 2 ma na tej liście jedno, ale już 4 ma dwa zamówienia a 5 aż trzy.
Co jeśli chcemy zobaczyć listę zamówień, ale obok każdego numeru zamówienia chcemy widzieć pełną nazwę klienta, a nie tylko jego ID? Musimy zajrzeć do obu segregatorów jednocześnie.
Do tego właśnie służy JOIN
– połącz albo złącz.
Zobaczmy, jak to wygląda w praktyce. Chcemy wyświetlić numer zamówienia (OrderID
) z tabeli Orders
oraz nazwę klienta (CustomerName
) z tabeli Customers
.
SQL
SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

Uruchom to zapytanie. Wynik może Cię zaskoczyć. Otrzymaliśmy nową, wirtualną tabelę z dwiema kolumnami, które pochodzą z dwóch różnych źródeł!
I teraz mnie zapytasz, co to jest to INNER.
Na razie, żeby nie było za dużo i za szybko wiedz tylko, iż narzędzie na W3shools używa bardzo prostej, i starej bazy gdzie pewne rzeczy trzeba pisać wprost. INNER jest typem połączenia dwóch tabel, który we wszystkich współczesnych bazach jest domyślny, i pisze się samo JOIN. a więc w MS SQL, PosgreSQL, ORACLE, MYSQL a nawet SQLite nie musisz pisać INNER przed JOIN:)
Rozłóżmy to potężne polecenie na spokojnie:
SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
- Mówimy, co chcemy zobaczyć. Ponieważ bierzemy dane z dwóch tabel, to trzeba wskazać o kolumnę z której tabeli nam chodzi(
NazwaTabeli.NazwaKolumny
). (ps. Można a nawet trzeba to sobie upraszać, ale o tym później)
- Mówimy, co chcemy zobaczyć. Ponieważ bierzemy dane z dwóch tabel, to trzeba wskazać o kolumnę z której tabeli nam chodzi(
FROM Orders
- Zaczynamy od naszej głównej tabeli, czyli
Orders
.
- Zaczynamy od naszej głównej tabeli, czyli
- INNER
JOIN Customers
- Mówimy SQL: „A teraz dołącz do tego dane z tabeli
Customers
„.
- Mówimy SQL: „A teraz dołącz do tego dane z tabeli
ON Orders.CustomerID = Customers.CustomerID
- To najważniejsza część. To jest instrukcja łączenia. Mówimy: „Połącz wiersz z tabeli
Orders
z wierszem z tabeliCustomers
TYLKO WTEDY, GDY wartość w kolumnieCustomerID
jest w obu wierszach identyczna”. Gdyby nie to, połączyły by się wszystkie kolumny z innymi kolumnami z drugiej tabeli i był by disaster.
- To najważniejsza część. To jest instrukcja łączenia. Mówimy: „Połącz wiersz z tabeli
JOIN
na początku może wydawać się skomplikowany. To normalne. Najważniejsze jest zrozumienie koncepcji: szukamy wspólnego punktu zaczepienia (klucza) między dwiema tabelami, aby móc połączyć zawarte w nich informacje.
Podsumowanie i zadanie na dziś
Dziś opanowaliśmy dwie niezwykle potężne koncepcje:
- Filtrowanie danych za pomocą
WHERE
, aby znaleźć dokładnie to, czego szukamy. - Łączenie tabel za pomocą
JOIN...ON
, aby czerpać informacje z wielu źródeł jednocześnie.
To fundamenty, na których opiera się 90% codziennej pracy z danymi.
Twoje zadanie na dziś: Korzystając z poznanej wiedzy, spróbuj napisać zapytanie, które wyświetli nazwy produktów (ProductName
) oraz nazwy dostawców (SupplierName
), którzy je dostarczają. Podpowiedź: potrzebne tabele to Products
i Suppliers
. Jaka kolumna może być ich wspólnym „kluczem”?
Daj znać w komentarzach, jak Ci poszło!
0 komentarzy