SQLite Połącz: Naturalne lewe zewnętrzne, wewnętrzne, krzyżowe z tabelami

⚡ Inteligentne podsumowanie

SQLite Klauzule JOIN łączą wiersze z dwóch lub więcej tabel za pomocą instrukcji INNER JOIN, JOIN USING, NATURAL JOIN, LEFT OUTER JOIN i CROSS JOIN, umożliwiając dopasowywanie powiązanych rekordów według współdzielonych kolumn i odczytywanie danych ze znormalizowanej bazy danych.

  • 🔗 Klauzula dołączenia: Klauzula JOIN łączy dwie lub więcej tabel lub podzapytań w ramach wspólnej kolumny zdefiniowanej za pomocą warunku ON lub USING.
  • 🎯 POŁĄCZENIE WEWNĘTRZNE: Funkcja INNER JOIN zwraca tylko wiersze, dla których warunek połączenia jest spełniony w obu tabelach, ignorując wiersze, które nie pasują.
  • 🧩 UŻYCIE I NATURALNOŚĆ: JOIN USING nazywa jedną wspólną kolumnę, podczas gdy NATURAL JOIN automatycznie dopasowuje każdą kolumnę o identycznej nazwie.
  • ↩️ LEWE POŁĄCZENIE ZEWNĘTRZNE: LEFT OUTER JOIN zachowuje każdy wiersz tabeli po lewej stronie i wypełnia niepasujące kolumny tabeli po prawej stronie wartościami NULL.
  • ✖️. POŁĄCZENIE KRZYŻOWE: CROSS JOIN zwraca iloczyn kartezjański, parując każdy wiersz tabeli po lewej stronie z każdym wierszem tabeli po prawej stronie.
  • 🤖 Pomoc AI: Narzędzia AI do konwersji tekstu na SQL i GitHub Copilot generują SQLite Zapytania JOIN z poziomu komunikatów w języku zwykłym.

SQLite Dołącz do rejestru

SQLite obsługuje różne typy SQL Złączenia, takie jak INNER JOIN, LEFT OUTER JOIN i CROSS JOIN. Każdy typ JOIN jest używany w innej sytuacji, jak zobaczymy w tym samouczku.

Wprowadzenie do SQLite DOŁĄCZ do klauzuli

Podczas pracy z bazą danych zawierającą wiele tabel często konieczne jest pobranie danych z tych wielu tabel.

Za pomocą klauzuli JOIN możesz połączyć dwie lub więcej tabel lub podzapytań, łącząc je. Możesz także zdefiniować, według której kolumny chcesz połączyć tabele i według jakich warunków.

Każda klauzula JOIN musi mieć następującą składnię:

SQLite JOIN Składnia klauzuli

Każda klauzula łączenia zawiera:

  • Tabela lub podzapytanie będące lewą tabelą; tabela lub podzapytanie przed klauzulą ​​łączenia (po lewej stronie).
  • Operator JOIN – określ typ połączenia (INNER JOIN, LEFT OUTER JOIN lub CROSS JOIN).
  • JOIN-constraint – po określeniu tabel lub podkwerend do złączenia należy określić ograniczenie złączenia, które będzie warunkiem, na podstawie którego zostaną wybrane pasujące wiersze spełniające ten warunek, w zależności od typu złączenia.

Należy pamiętać, że dla wszystkich następujących SQLite Przykłady tabel JOIN: należy uruchomić sqlite3.exe i nawiązać połączenie z przykładową bazą danych w sposób przepływowy:

Krok 1) W tym kroku otwórz Mój komputer i przejdź do następującego katalogu „C:\sqlite”, a następnie otwórz „sqlite3.exe“:

Otwórz sqlite3.exe z katalogu sqlite

Krok 2) Otwórz bazę danych „TutorialsSampleDB.db” za pomocą następującego polecenia:

Otwórz bazę danych TutorialsSampleDB

Teraz możesz uruchomić dowolny typ zapytania w bazie danych.

SQLite INNER JOIN

SQLite WEWNĘTRZNE POŁĄCZENIE Diagram Venna

Operacja INNER JOIN zwraca tylko wiersze spełniające warunek połączenia i eliminuje wszystkie pozostałe wiersze, które nie spełniają warunku połączenia.

Przykład

W poniższym przykładzie połączymy dwie tabele „Students” i „Departments” za pomocą DepartmentId, aby uzyskać nazwę wydziału dla każdego studenta, w następujący sposób:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Wyjaśnienie kodu

Połączenie INNER JOIN działa w następujący sposób:

  • W klauzuli Select możesz wybrać dowolne kolumny z dwóch tabel, do których istnieją odniesienia.
  • Klauzula INNER JOIN jest zapisywana po pierwszej tabeli, do której odwołuje się klauzula „From”.
  • Następnie warunek złączenia jest określony za pomocą ON.
  • Dla tabel, do których istnieją odniesienia, można określić aliasy.
  • Słowo WEWNĘTRZNE jest opcjonalne, możesz po prostu napisać DOŁĄCZ.

Wydajność

Operacja INNER JOIN generuje rekordy z obu tabel – studentów i wydziałów – które spełniają warunek „Students.DepartmentId = Departments.DepartmentId”. Niedopasowane wiersze zostaną zignorowane i nie zostaną uwzględnione w wyniku.

SQLite Przykładowy wynik INNER JOIN

Dlatego w wyniku tego zapytania zwrócono tylko 8 studentów z 10 wydziałów informatyki, matematyki i fizyki. Natomiast studenci „Jena” i „George” nie zostali uwzględnieni, ponieważ ich identyfikatory wydziału są zerowe i nie pasują do kolumny „departmentId” w tabeli „departments”. Poniżej:

SQLite INNER JOIN dopasowane wiersze

SQLite DOŁĄCZ… KORZYSTAJĄC

INNER JOIN można zapisać przy użyciu klauzuli „USING”, aby uniknąć nadmiarowości, więc zamiast pisać „ON Students.DepartmentId = Departments.DepartmentId”, możesz po prostu napisać „USING(DepartmentID)”.

Możesz użyć opcji „JOIN .. USING” zawsze, gdy kolumny, które będziesz porównywać w warunku łączenia, mają tę samą nazwę. W takich przypadkach nie ma potrzeby ich powtarzania z warunkiem włączenia i wystarczy podać nazwy kolumn i SQLite to wykryje.

Różnica pomiędzy INNER JOIN i JOIN... UŻYCIE:

W przypadku polecenia „JOIN … USING” nie należy pisać warunku łączenia, wystarczy wpisać kolumnę łączenia, która jest wspólna dla obu łączonych tabel. Zamiast pisać tabela1 „INNER JOIN table2 ON table1.cola = table2.cola” zapisujemy to tak: „table1 JOIN table2 USING(cola)”.

Przykład

W poniższym przykładzie połączymy dwie tabele „Students” i „Departments” za pomocą DepartmentId, aby uzyskać nazwę wydziału dla każdego studenta, w następujący sposób:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments USING(DepartmentId);

Wyjaśnienie

  • W przeciwieństwie do poprzedniego przykładu, nie napisaliśmy „ON Students.DepartmentId = Departments.DepartmentId”. Napisaliśmy po prostu „USING(DepartmentId)”.
  • SQLite automatycznie wnioskuje o warunkach łączenia i porównuje DepartmentId z obu tabel – Students i Departments.
  • Możesz użyć tej składni zawsze, gdy dwie porównywane kolumny mają tę samą nazwę.

Wydajność

Da to dokładnie taki sam wynik, jak w poprzednim przykładzie:

SQLite Przykładowy wynik połączenia JOIN SHIN

SQLite NATURALNE POŁĄCZENIE

NATURAL JOIN jest podobny do JOIN…USING, z tą różnicą, że automatycznie sprawdza równość wartości każdej kolumny istniejącej w obu tabelach.

Różnica pomiędzy INNER JOIN i NATURAL JOIN:

  • W przypadku INNER JOIN należy określić warunek złączenia, którego sprzężenie wewnętrzne używa do połączenia dwóch tabel. Natomiast w przypadku sprzężenia naturalnego nie tworzy się warunku złączenia. Wystarczy wpisać nazwy dwóch tabel bez żadnego warunku. Następnie sprzężenie naturalne automatycznie sprawdzi równość wartości dla każdej kolumny w obu tabelach. Spojrzenie naturalne automatycznie wnioskuje o warunku złączenia.
  • W NATURAL JOIN wszystkie kolumny z obu tabel o tej samej nazwie zostaną ze sobą dopasowane. Na przykład, jeśli mamy dwie tabele z dwiema wspólnymi nazwami kolumn (w obu tabelach te dwie kolumny istnieją pod tą samą nazwą), wówczas połączenie naturalne połączy dwie tabele poprzez porównanie wartości obu kolumn, a nie tylko jednej kolumna.

Przykład

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
Natural JOIN Departments;

Wyjaśnienie

  • Nie musimy pisać warunku łączenia z nazwami kolumn (jak w przypadku INNER JOIN). Nie musieliśmy nawet ani razu wpisywać nazwy kolumny (jak w przypadku JOIN USING).
  • Połączenie naturalne przeskanuje obie kolumny z dwóch tabel. Wykryje, że warunek powinien składać się z porównania DepartmentId z obu tabel Studenci i Wydziały.

Wydajność

Połączenie NATURAL JOIN da dokładnie taki sam wynik, jak w przypadku połączeń INNER JOIN i JOIN USING, ponieważ w naszym przykładzie wszystkie trzy zapytania są równoważne. Jednak w niektórych przypadkach wynik połączenia wewnętrznego będzie inny niż połączenia naturalnego. Na przykład, jeśli istnieje więcej tabel o tych samych nazwach, połączenie naturalne dopasuje wszystkie kolumny do siebie. Natomiast połączenie wewnętrzne dopasuje tylko kolumny w warunku połączenia.

SQLite Przykładowy wynik NATURAL JOIN

SQLite LEWE POŁĄCZENIE ZEWNĘTRZNE

Standard SQL definiuje trzy typy połączeń zewnętrznych: LEFT, RIGHT i FULL, ale SQLite obsługuje tylko naturalne LEWE ŁĄCZENIE ZEWNĘTRZNE.

W przypadku LEFT OUTER JOIN wszystkie wartości kolumn wybranych z tabeli po lewej stronie zostaną uwzględnione w wyniku zapytania. Oznacza to, że niezależnie od tego, czy wartość spełnia warunek połączenia, czy nie, zostanie ona uwzględniona w wyniku.

Zatem jeśli lewa tabela ma „n” wierszy, wyniki zapytania również będą miały „n” wierszy. Jednak w przypadku wartości kolumn pochodzących z prawej tabeli, jeśli jakakolwiek wartość nie spełnia warunku łączenia, będzie zawierała wartość „null”.

Otrzymasz więc liczbę wierszy odpowiadającą liczbie wierszy w lewym połączeniu. Dzięki temu otrzymasz pasujące wiersze z obu tabel (jak wyniki INNER JOIN) oraz niepasujące wiersze z lewej tabeli.

Przykład

W poniższym przykładzie spróbujemy połączyć dwie tabele „Studenci” i „Wydziały” za pomocą „LEFT JOIN”:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students             -- this is the left table
LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Wyjaśnienie

  • SQLite Składnia LEFT JOIN jest taka sama jak składnia INNER JOIN; piszesz LEFT JOIN pomiędzy dwiema tabelami, a następnie warunek łączenia pojawia się po klauzuli ON.
  • Pierwsza tabela po klauzuli from jest tabelą po lewej stronie. Natomiast druga tabela określona po naturalnym LEFT JOIN jest tabelą prawą.
  • Klauzula OUTER jest opcjonalna; LEWY naturalny OUTER JOIN jest taki sam jak LEWY JOIN.

Wydajność

Jak widać, uwzględniono wszystkie wiersze z tabeli „studenci”, co daje łącznie 10 studentów. Nawet jeśli czwarty i ostatni student, Jena i George, mają identyfikatory wydziałów, których nie ma w tabeli „Departamenty”, również są uwzględniane.

W takich przypadkach wartość departmentName zarówno dla Jeny, jak i George'a będzie równa „null”, ponieważ tabela departments nie zawiera wartości departmentName odpowiadającej wartości departmentId.

SQLite Przykładowy wynik LEWEGO POŁĄCZENIA ZEWNĘTRZNEGO

Wyjaśnijmy poprzednie zapytanie, wykorzystując połączenie lewe, bardziej szczegółowo, korzystając z diagramów Venna:

SQLite LEWE POŁĄCZENIE ZEWNĘTRZNE Diagram Venna

LEFT JOIN zwróci nazwiska wszystkich studentów z tabeli „students”, nawet jeśli student ma identyfikator wydziału, który nie występuje w tabeli „departments”. Zatem zapytanie nie zwróci tylko pasujących wierszy, jak w przypadku INNER JOIN, ale także dodatkową część, która zawiera niepasujące wiersze z lewej tabeli, czyli tabeli „students”.

Należy pamiętać, że imię i nazwisko ucznia, które nie ma pasującego wydziału, będzie miało wartość „null” w nazwie wydziału, ponieważ nie ma dla niego pasującej wartości, a te wartości są wartościami w niepasujących wierszach.

SQLite KRZYŻ DOŁĄCZ

POŁĄCZENIE KRZYŻOWE daje iloczyn kartezjański dla wybranych kolumn dwóch połączonych tabel, poprzez dopasowanie wszystkich wartości z pierwszej tabeli do wszystkich wartości z drugiej tabeli.

Zatem dla każdej wartości w pierwszej tabeli otrzymasz „n” dopasowań z drugiej tabeli, gdzie n to liczba wierszy drugiej tabeli.

W przeciwieństwie do INNER JOIN i LEFT OUTER JOIN w przypadku CROSS JOIN nie trzeba określać warunku połączenia, ponieważ SQLite nie jest to potrzebne do CROSS JOIN.

SQLite spowoduje utworzenie logicznego zestawu wyników poprzez połączenie wszystkich wartości z pierwszej tabeli ze wszystkimi wartościami z drugiej tabeli.

Na przykład, jeśli wybierzesz kolumnę z pierwszej tabeli (colA) i inną kolumnę z drugiej tabeli (colB), kolumna colA zawiera dwie wartości (1,2), a kolumna colB również zawiera dwie wartości (3,4).

Następnie wynikiem CROSS JOIN będą cztery wiersze:

  • Dwa wiersze poprzez połączenie pierwszej wartości z colA, która wynosi 1, z dwiema wartościami colB (3,4), które będą wynosić (1,3), (1,4).
  • Podobnie, dwa wiersze łączą drugą wartość z kolumny colA, która wynosi 2 z dwiema wartościami kolumny colB (3,4), które wynoszą (2,3), (2,4).

Przykład

W poniższym zapytaniu spróbujemy wykonać połączenie CROSS JOIN pomiędzy tabelami Students i Departments:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
CROSS JOIN Departments;

Wyjaśnienie

  • W SQLite wybierz z wielu tabel, właśnie wybraliśmy dwie kolumny „nazwa studenta” z tabeli studentów i „nazwa wydziału” z tabeli wydziałów.
  • W przypadku połączenia krzyżowego nie określiliśmy żadnego warunku połączenia, jedynie połączyliśmy dwie tabele za pomocą połączenia krzyżowego CROSS JOIN w środku.

Wydajność

Jak widać, wynik to 40 wierszy; 10 wartości z tabeli students dopasowanych do 4 departments z tabeli departments. Jak następuje:

  • Cztery wartości dla czterech wydziałów z tabeli wydziałów odpowiadają pierwszemu studentowi Michelowi.
  • Cztery wartości dla czterech wydziałów z tabeli wydziałów dopasowano do drugiego studenta, Johna.
  • Cztery wartości dla czterech wydziałów z tabeli wydziałów dopasowano do trzeciego studenta, Jacka… i tak dalej.

SQLite Przykładowy wynik połączenia krzyżowego

FAQ

SQLite dodano obsługę RIGHT JOIN i FULL OUTER JOIN w wersji 3.39.0, wydanej w 2022 r. W starszych kompilacjach emulację RIGHT JOIN można uzyskać za pomocą zamianyping tabele w LEFT JOIN i FULL OUTER JOIN poprzez połączenie dwóch LEFT JOIN za pomocą UNION.

Samosprzężenie łączy tabelę ze sobą za pomocą aliasów, więc jedna kopia działa jako lewa tabela, a druga jako prawa. Jest to przydatne do porównywania wierszy w tej samej tabeli, na przykład dopasowując pracowników do ich przełożonych.

Tak. Łączysz kilka klauzul JOIN w jednym SELECT, z których każda ma swój własny warunek ON lub USING, na przykład FROM A JOIN B ON … JOIN C ON …. SQLite łączy tabele od lewej do prawej w jeden połączony zestaw wyników.

Samo napisanie polecenia JOIN jest takie samo jak napisanie polecenia INNER JOIN w SQLiteOba zachowują tylko wiersze spełniające warunek ON lub USING, więc wiersze niepasujące są pomijane. Słowo kluczowe INNER jest opcjonalne, co sprawia, że ​​JOIN i INNER JOIN są zamienne.

Utworzenie indeksu w kolumnach używanych w warunku połączenia pozwala SQLite Dopasuj wiersze bez skanowania całych tabel, co przyspiesza łączenia w dużych zbiorach danych. Indeksowanie kolumn z kluczem obcym i uruchamianie narzędzia ANALYZE w celu odświeżenia statystyk dodatkowo poprawia wydajność zapytań łączenia.

Połączenie wewnętrzne INNER JOIN zwraca tylko wiersze, które pasują do siebie w obu tabelach. Połączenie zewnętrzne LEFT JOIN zwraca każdy wiersz z tabeli po lewej stronie oraz pasujące wiersze z tabeli po prawej stronie, wypełniając niepasujące kolumny po prawej stronie wartością NULL. Zatem połączenie LEFT JOIN nigdy nie usuwa wierszy z tabeli po lewej stronie.

Tak. Asystenci AI przetwarzający tekst na SQL zamieniają zapytania w języku zwykłym na SQLite Instrukcje INNER, LEFT, NATURAL i CROSS JOIN. Podanie nazw tabel, nazw kolumn i relacji zwiększa dokładność, a każde wygenerowane połączenie powinno zostać sprawdzone i przetestowane przed uruchomieniem na rzeczywistych danych.

Drugi pilot GitHub wskazuje SQLite Zapytania JOIN w tekście w edytorach takich jak VS Code, uzupełniając klauzule INNER JOIN, LEFT JOIN oraz ON lub USING. Odczytuje pobliskie schematy i komentarze, więc jego sugestie wykorzystują rzeczywiste nazwy tabel i kolumn.

Podsumuj ten post następująco: