SQLShack (Polski)

INNER JOIN vs LEFT JOIN, czyli pytanie. Dzisiaj pokrótce wyjaśnimy, w jaki sposób używane są oba te typy złączeń i jaka jest różnica. Omówimy ten temat ponownie później, kiedy rozszerzymy nasz model i będziemy mogli pisać znacznie bardziej złożone zapytania.

Zmiany w danych

Zanim porównamy INNER JOIN z LEFT JOIN, zobaczmy, co obecnie wiemy. Do tej pory w tej serii wyjaśniliśmy podstawy bazy danych – jak tworzyć bazę danych i tabele, jak wypełniać tabele danymi i sprawdzać, co jest w nich przechowywane, za pomocą prostych zapytań. W poprzednim artykule dołączyliśmy nawet do dwóch tabel. Teraz jesteśmy gotowi na następny krok.

Ale zanim przejdziemy do tego, dokonajmy tylko jednej drobnej zmiany nasze dane. Dodamy 2 wiersze do tabeli krajów, używając następujących poleceń INSERT INTO:

Teraz sprawdzimy zawartość obu tabel:

Możesz łatwo zauważyć, że mamy 2 nowe wiersze w kraju tabeli, jeden dla Hiszpanii i jeden dla Rosji. Ich identyfikatory to 6 i 7. Zwróć także uwagę, że w tabeli miast nie ma identyfikatora kraju o wartości 6 lub 7. Oznacza to po prostu, że w naszej bazie danych nie ma miasta z Rosji lub Hiszpanii. Wykorzystamy ten fakt później.

WEWNĘTRZNE JOIN

Omówmy te dwa zapytania:

Wynik, który zwracają, jest przedstawiony na poniższym obrazku:

Oba zapytania zwracają dokładnie ten sam wynik. Nie jest to przypadek, ale wynika z faktu, że jest to to samo zapytanie zapisane na dwa różne sposoby. Oba sposoby są poprawne i możesz użyć dowolnego z nich.

W pierwszym zapytaniu wymieniliśmy wszystkie tabele, których używamy w części FROM zapytania (FROM country, city), a następnie przeszliśmy z łączeniem warunek w części WHERE zapytania (WHERE city.country_id = country.id). W przypadku gdybyśmy zapomnieli zapisać ten warunek łączenia, otrzymalibyśmy iloczyn kartezjański obu tabel.

W drugim zapytaniu mamy tylko jedną tabelę w części FROM zapytania (FROM country) i wtedy mamy drugą tabelę i warunek JOIN w części JOIN zapytania (INNER JOIN city ON city.country_id = country.id).

Chociaż oba zapytania są dobrze napisane, sugerowałbym, że zawsze używasz INNER JOIN zamiast wyświetlać tabele i łączyć je w części WHERE zapytania. Jest kilka powodów:

  • Czytelność jest znacznie lepsza, ponieważ używana tabela i powiązany warunek JOIN są w tym samym linia. Możesz łatwo sprawdzić, czy pominąłeś warunek JOIN, czy nie.
  • Jeśli chcesz użyć innych JOIN później (LEFT lub RIGHT), nie możesz tego zrobić (łatwo), chyba że użyłeś wcześniej INNER JOIN to

Teraz skomentujmy, jakie zapytania faktycznie zwróciły:

  • Wszystkie pary krajów i miast, które są powiązane (za pomocą klucza obcego)
  • Nie mamy 2 krajów na liście (Hiszpania i Rosja), ponieważ nie mają one żadnego powiązanego miasta w tabeli miast

LEFT JOIN

Powtórzę – „Nie mamy 2 krajów na liście (Hiszpanii i Rosji), ponieważ nie mają one żadnego powiązanego miasta w tabeli miast”. To okaże się kluczowe przy porównywaniu INNER JOIN i LEFT JOIN.

W niektórych przypadkach chcemy mieć nawet te rekordy w naszych wynikach. Na przykład chcesz po prostu zobaczyć w wyniku, że te kraje nie mają powiązanych rekordów w innej tabeli. Może to być częścią jakiejś kontroli, a może po prostu liczenia przypadków itp. Bez względu na motywację tego pragnienia, technicznie powinniśmy być w stanie to zrobić. I my jesteśmy. W bazach danych LEFT JOIN robi dokładnie to.

Wynik LEFT JOIN będzie taki sam jak wynik INNER JOIN + będziemy mieć wiersze z „lewej” tabeli, bez pary w „właściwy” stół. Użyjemy tego samego zapytania INNER JOIN i po prostu zamienimy słowo INNER na LEFT. Oto wynik:

Możesz łatwo zauważyć, że mamy 2 więcej wierszy w porównaniu z wynikiem INNER JOIN zapytanie. To są wiersze dla Rosji i Hiszpanii. Ponieważ oba nie mają powiązanego miasta, wszystkie atrybuty miasta w tych dwóch wierszach mają wartości NULL (nie są zdefiniowane). To jest największa różnica w porównaniu INNER JOIN i LEFT JOIN.

PRAWY DOŁĄCZ

Przynajmniej usłyszysz o PRAWYM DOŁĄCZENIU. Jest rzadko używany, ponieważ zwraca ten sam wynik, co LEFT JOIN. Z drugiej strony zapytania używające LEFT JOIN są znacznie łatwiejsze do odczytania, ponieważ po prostu podajemy tabele jedna po drugiej.

Jest to odpowiednik poprzedniego zapytania używającego PRAWEGO JOIN:

Możesz zauważyć, że zwracane wartości są takie same, tylko w tym przypadku wartości z tabeli miasta znajdują się w pierwszych 5 kolumnach, a kraj- powiązane wartości są po nich.

INNER JOIN vs LEFT JOIN

INNER JOIN vs LEFT JOIN?Właściwie to wcale nie jest pytanie. Użyjesz INNER JOIN, gdy chcesz zwrócić tylko rekordy mające parę po obu stronach, a użyjesz LEFT JOIN, gdy będziesz potrzebować wszystkich rekordów z „lewej” tabeli, bez względu na to, czy mają one parę w „prawej” tabeli albo nie. Jeśli potrzebujesz wszystkich rekordów z obu tabel, bez względu na to, czy mają parę, musisz użyć CROSS JOIN (lub zasymulować to za pomocą LEFT JOIN i UNION). Więcej na ten temat w kolejnych artykułach.

Spis treści

Naucz się języka SQL: CREATE DATABASE & CREATE TABLE Operations

Nauka SQL: WSTAWIANIE DO TABELI

Nauka języka SQL: klucz podstawowy

Nauka SQL: klucz obcy

Learn SQL: instrukcja SELECT

Learn SQL: INNER JOIN vs LEFT JOIN

Learn SQL: SQL Scripts

Learn SQL: Typy relacji

Learn SQL: Dołącz do wielu tabel

Learn SQL: Aggregate Functions

Learn SQL: Jak napisać złożone zapytanie SELECT

Naucz się SQL: Baza danych INFORMATION_SCHEMA

Naucz się SQL: Typy danych SQL

Nauka języka SQL: teoria zbiorów

Nauka języka SQL: funkcje zdefiniowane przez użytkownika

Nauka języka SQL: procedury składowane zdefiniowane przez użytkownika

Naucz się SQL: widoki SQL

Naucz się SQL: wyzwalacze SQL

Naucz się SQL: ćwicz zapytania SQL

Nauka języka SQL: przykłady zapytań SQL

Nauka języka SQL: ręczne tworzenie raportu przy użyciu zapytań SQL

Naucz się SQL: funkcje daty i czasu w SQL Server

Naucz się SQL: twórz raporty SQL Server przy użyciu funkcji daty i czasu

Learn SQL: tabele przestawne SQL Server

Learn SQL: eksport SQL Server do Excela

Learn SQL: wprowadzenie do pętli SQL Server

Nauka języka SQL: kursory w SQL Server

Nauka języka SQL: najważniejsze wskazówki dotyczące usuwania i aktualizacji danych w języku SQL

Nauka języka SQL: konwencje nazewnictwa

Learn SQL: zadania związane z SQL

Learn SQL: Non-Equi Joings in SQL Server

Learn SQL: SQL Wstrzyknięcie

  • Autor
  • Najnowsze posty
Emil jest specjalistą od baz danych z ponad 10-letnim doświadczeniem we wszystkim związanym z bazami danych. Przez lata pracował w branży informatycznej i finansowej, a teraz pracuje jako wolny strzelec.
Jego przeszłe i obecne zadania obejmują różne dziedziny, od projektowania i kodowania baz danych po nauczanie, doradztwo i pisanie o bazach danych. Nie zapomnij też, BI, tworzenie algorytmów, szachy, filatelistyka, 2 psy, 2 koty, 1 żona, 1 dziecko …
Możesz go znaleźć na LinkedIn
Wyświetl wszystkie posty Emila Drkusica

Najnowsze posty Emila Drkusica (zobacz wszystkie)
  • Learn SQL: SQL Injection – 2 listopada 2020 r.
  • Learn SQL: Non-Equi Joins in SQL Server – 29 września 2020 r.
  • Learn SQL: Praca związana z SQL – 1 września 2020 r.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *