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
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
- 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.