sobota,
SQL: Implicit join
Złączenie tabel w bazie danych bez bezpośredniego użycia klauzuli JOIN jest znane jako złączenie niejawne (ang. implicit join). To podejście polega na łączeniu tabel za pomocą klauzuli WHERE, gdzie określa się warunki, które muszą być spełnione przez połączone wiersze z obu tabel. Zapytania implicit join są powszechnie wspierane przez większość współczesnych systemów zarządzania bazami danych (DBMS), takich jak MySQL/MariaDB, PostgreSQL, Microsoft SQL Server, Oracle, SQLite i itp.
Przykładem złączenia niejawnego jest użycie zapytania, które wybiera dane z dwóch tabel, a następnie używa klauzuli WHERE do określenia, jak wiersze z tych tabel powinny być ze sobą powiązane. Mimo że nie używa się słowa kluczowego JOIN, efekt jest podobny do złączenia jawnych (explicit joins) wykorzystujących JOIN. Jest to metoda często stosowana w starszych systemach baz danych lub przez osoby przyzwyczajone do starszych konwencji pisania zapytań SQL. Współczesne praktyki i standardy SQL zalecają używanie jawnych JOIN-ów, ponieważ są one zazwyczaj bardziej czytelne i mogą być lepiej optymalizowane przez silniki baz danych.
Ogólny przykład
Keśli chcesz połączyć tabelę A z tabelą B, bazując na wspólnym kluczu id, możesz to zrobić w następujący sposób:
SELECT A.*, B.*
FROM A, B
WHERE A.id = B.id;
Ten kod spowoduje, że każdy wiersz z tabeli A zostanie sparowany z każdym wierszem z tabeli B, a następnie zostaną wyfiltrowane te pary, które spełniają warunek A.id = B.id.
Przykłady zapytań
Tabele
Zaprojektujmy dwie proste tabele, które będą dobre do zilustrowania przykładu łączenia bez użycia JOIN. Załóżmy, że mamy tabelę Pracownicy
i tabelę Dzialy
. Tabela Pracownicy
zawiera informacje o pracownikach, a tabela Dzialy
o działach, w których pracują.
Tabela Pracownicy
PracownikID
(klucz główny) – unikalny identyfikator pracownika.Imie
– imię pracownika.Nazwisko
– nazwisko pracownika.DzialID
– identyfikator działu, w którym pracownik jest zatrudniony. Odnosi się doDzialID
w tabeliDzialy
.
Tabela Dzialy
DzialID
(klucz główny) – unikalny identyfikator działu.NazwaDzialu
– nazwa działu.
Przykładowe schematy dla obu tabel:
CREATE TABLE Pracownicy (
PracownikID INT PRIMARY KEY,
Imie VARCHAR(100),
Nazwisko VARCHAR(100),
DzialID INT
);
CREATE TABLE Dzialy (
DzialID INT PRIMARY KEY,
NazwaDzialu VARCHAR(100)
);
W tych tabelach DzialID
w tabeli Pracownicy
jest kluczem obcym, który odnosi się do DzialID
w tabeli Dzialy
. Możemy użyć tych tabel do zilustrowania łączenia bez użycia JOIN, łącząc je na podstawie wspólnego DzialID
. Poniżej znajdziesz kilka przykładów zapytań SQL, które łączą tabele Pracownicy
i Dzialy
bez użycia JOIN, korzystając z wcześniej omówionej metody. Założono, że obie tabele zawierają już jakieś dane.
Wybór wszystkich pracowników wraz z nazwami ich działów
SELECT Pracownicy.Imie, Pracownicy.Nazwisko, Dzialy.NazwaDzialu
FROM Pracownicy, Dzialy
WHERE Pracownicy.DzialID = Dzialy.DzialID;
Wybór pracowników pracujących w określonym dziale (np. dziale o ID 1)
SELECT Pracownicy.Imie, Pracownicy.Nazwisko
FROM Pracownicy, Dzialy
WHERE Pracownicy.DzialID = Dzialy.DzialID AND Dzialy.DzialID = 1;
Wybór nazwisk pracowników wraz z nazwami ich działów, ale tylko dla pracowników o imieniu 'Jan'
SELECT Pracownicy.Nazwisko, Dzialy.NazwaDzialu
FROM Pracownicy, Dzialy
WHERE Pracownicy.DzialID = Dzialy.DzialID AND Pracownicy.Imie = 'Jan';
Wybór wszystkich działów i ilości pracowników w każdym dziale
SELECT Dzialy.NazwaDzialu, COUNT(Pracownicy.PracownikID) as LiczbaPracownikow
FROM Pracownicy, Dzialy
WHERE Pracownicy.DzialID = Dzialy.DzialID
GROUP BY Dzialy.NazwaDzialu;
Wybór pracowników, którzy nie są przypisani do żadnego działu (zakładając, że DzialID może być NULL)
SELECT Pracownicy.Imie, Pracownicy.Nazwisko
FROM Pracownicy
WHERE Pracownicy.DzialID NOT IN (SELECT DzialID FROM Dzialy);