Przejdź do treści

Centrum Kształcenia Zawodowego i Ustawicznego w Mrągowie

SQL: Implicit join

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ę do DzialID w tabeli Dzialy.

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 PracownicyDzialy 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);

Artykuł: Slackware

Slackware

Artykuł: Virtual Desktop Infrastructure

Virtual Desktop Infrastructure

Artykuł: Wirtualizacja: Overcommitment

Wirtualizacja: Overcommitment

Artykuł: Marc Andreessen

Marc Andreessen

Artykuł: Zakończenie staży

Zakończenie staży

Nasze technikum

Technik informatyk

Szkoły dla dorosłych

Nasza szkoła

Pełna oferta edukacyjna

Oferta szkoły