Lekcja 9: Łączenie Tabel — Sztuka SQL-owego Swatania!


Lesson 9

Lekcja 9: Łączenie Tabel — Sztuka SQL-owego Swatania!

Witaj ponownie, miłośniku baz danych! Dziś zanurzymy się w świat joinów — SQL-owy sposób na to, by przedstawić tabele sobie nawzajem, niczym zręczny swat, który wie dokładnie, które tabele są sobie przeznaczone. Niezależnie od tego, czy dopasowujesz pracowników do działów, czy bohaterów do ich epickich zadań, opanowanie joinów sprawi, że Twoje zapytania PostgreSQL będą działać jak symfonia relacji.

Czas zacząć swatanie Twoich danych!

Czym Jest Join?

Join w SQL to jak randka w ciemno między dwoma tabelami. Prośba do PostgreSQL, by połączył ze sobą powiązane dane, sprawiając, że wiersze jednej tabeli zostaną dopasowane do wierszy innej, na podstawie wspólnej wartości (takiej jak ID, nazwa, albo miłość do kotów… choć pewnie to po prostu ID).

Istnieje kilka typów joinów, każdy z własnym “charakterem relacji” — od harmonijnego inner join po bardziej skomplikowane outer joiny. Poznajmy je bliżej!

1. Inner Join — Idealna Para

Inner join to SQL-owy odpowiednik znalezienia idealnej pary na pierwszej randce. Zwraca tylko te wiersze, gdzie obie tabele mają pasujące wartości w określonych kolumnach. Jeśli nie ma dopasowania, te wiersze zostają wykluczone.

W skrócie: “Macie coś wspólnego? Świetnie, jesteście parą!”

SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;

W tym zapytaniu PostgreSQL pokaże tylko tych pracowników, którzy mają przypisany dział. Brak działu? Brak wyniku!

2. Left Join (czyli Left Outer Join) — Hojny Przyjaciel

Left join to jak ten przyjaciel, który zawsze pilnuje, żeby nikt nie został sam. Zwraca wszystkie wiersze z lewej tabeli (tej, którą wymieniasz pierwszą), nawet jeśli nie ma pasujących wierszy w tabeli prawej. Gdy nie ma dopasowania, PostgreSQL grzecznie wypełnia luki wartością NULL.

Krótko mówiąc: “Nieważne, co robi prawa tabela — ja zabieram wszystkie wiersze z lewej!”

SELECT bohaterowie.name, misje.quest_name
FROM bohaterowie
LEFT JOIN misje
ON bohaterowie.quest_id = misje.id;

Dzięki temu zapytaniu, nawet jeśli bohater nie ma jeszcze przypisanej misji, pojawi się na liście, z pustym miejscem zamiast nazwy misji (tak, to trochę jak w smutnej piosence o samotności).

3. Right Join (czyli Right Outer Join) — Wspierający Brat

Right join to brat left join’a, tylko z odwróconymi rolami. Zwraca wszystkie wiersze z prawej tabeli, nawet jeśli w lewej nie ma pasujących wierszy. Więc jeśli prawa tabela ma dodatkowe wiersze, które nie pasują do lewej, nadal zostaną uwzględnione.

To jak powiedzieć: “Hej, prawa tabelo, mamy Cię, co by się nie działo.”

SELECT misje.quest_name, bohaterowie.name
FROM misje
RIGHT JOIN bohaterowie
ON misje.id = bohaterowie.quest_id;

Tutaj, nawet jeśli misja jeszcze nie została przypisana bohaterowi, pojawi się na liście. Może czeka na swojego odważnego bohatera?

4. Full Outer Join — Otwarte Zaproszenie

Full outer join to SQL-owa wersja otwartej imprezy dla wszystkich. Zwraca wszystkie wiersze, gdzie jest dopasowanie w którejkolwiek z tabel, a gdy dopasowania brak, PostgreSQL po prostu wypełnia NULL. Wszyscy są zaproszeni, niezależnie od tego, czy znaleźli partnera, czy nie.

W skrócie: “Wszyscy wchodzą! Jeśli jest dopasowanie — super, jeśli nie — też dobrze.”

SELECT bohaterowie.name, misje.quest_name
FROM bohaterowie
FULL OUTER JOIN misje
ON bohaterowie.quest_id = misje.id;

Z tym zapytaniem dostaniesz wszystkich bohaterów i wszystkie misje, nawet jeśli niektórzy bohaterowie czekają na wielką przygodę, a niektóre misje desperacko szukają bohatera. Idealne połączenie dla fantazyjnego biura podróży!

Łączenie Większej Liczby Tabel

Czemu kończyć na dwóch tabelach? Czasami SQL chce być swatem dla więcej niż jednej pary. Gdy potrzebujesz połączyć trzy lub więcej tabel, PostgreSQL chętnie Ci pomoże. Wystarczy kontynuować łańcuch joinów!

SELECT bohaterowie.name, misje.quest_name, królestwa.kingdom_name
FROM bohaterowie
JOIN misje ON bohaterowie.quest_id = misje.id
JOIN królestwa ON bohaterowie.kingdom_id = królestwa.id;

Tutaj łączysz bohaterów, ich misje i królestwa, z których pochodzą — niczym organizowanie królewskiego wydarzenia z odpowiednimi zaproszeniami!

Self Join — Kiedy Tabele Prowadzą Rozmowę Same ze Sobą

Self join to SQL-owy sposób na “samodialog”. Łączysz tabelę samą с собою, zwykle чтобы сравнить строки в той же таблице. Wyobraź sobie tabelę misji, gdzie każda misja ma swoje następne zadanie — możesz użyć self join, aby zobaczyć, które misje są ze sobą powiązane.

SELECT z1.quest_name AS misja_pierwsza, z2.quest_name AS misja_następna
FROM misje z1
JOIN misje z2 ON z1.następna_misja_id = z2.id;

Tutaj PostgreSQL połączy каждую миссию с её продолжением, tworząc piękny список эпических приключений, которые продолжаются одна за другой!

Cross Join — Wszyscy Zaproszeni!

Cross join to SQL-owy odpowiednik wrzucenia wszystkich do jednego pokoju и наблюдения, что будет. Он łączy każdą строку lewej таблицы с każдой строкой правой таблицы — результат może быть… dużим. Ты получаешь все возможные комбинации, co czasami jest przydatne, ale częściej powoduje хаос.

SELECT bohaterowie.name, bronie.weapon_name
FROM bohaterowie
CROSS JOIN bronie;

Теперь у тебя каждый bohater с каждой возможной bronią — мечта wojownika lub база данных na грани срыва!

Czego Dzisiaj Się Nauczyliśmy?

Dziś nauczyliśmy się, jak łączyć tabele i tworzyć harmonijne relacje za pomocą:

  • Inner join: Gdzie przetrwają tylko idealne pary.
  • Left i right join: Bo czasami fajnie mieć ulubieńców.
  • Full outer join: Kiedy chcesz zaprosić wszystkich, nawet tych, którzy nie pasują.
  • Self join: Kiedy tabele chcą porozmawiać same ze sobą.
  • Cross join: Bo czasami chaos to zabawa!

Co Dalej?

W następnym odcinku zagłębimy się w Funkcje Okienne — elegancki sposób na liczenie sum, rankingów i wiele więcej! Przygotuj się na aktualizację swoich zapytań na poziomie królewskiego traktowania.


A teraz naprzód, i niech Twoje joiny zawsze łączą odpowiednie tabele!