SQLShack (Polski)

Jeśli chcesz uzyskać coś znaczącego z danych , prawie zawsze będziesz musiał dołączyć do wielu stołów. W tym artykule pokażemy, jak to zrobić, używając różnych typów połączeń. Aby to osiągnąć, połączymy INNER JOIN i LEFT JOIN. A więc zacznijmy.

Model

Na poniższym obrazku możesz zobaczyć istniejący model. Składa się z 6 tabel i już mniej więcej opisaliśmy go w poprzednich artykułach.

Mimo to, nawet bez opisu, jeśli baza danych jest modelowana i prezentowana w dobry sposób (mądry dobór nazw, stosowanie konwencji nazewnictwa, przestrzeganie tych samych reguł w całym modelu, linie / relacje w schemacie nie nakładają się bardziej niż potrzeba), powinieneś umieć podsumować, gdzie można znaleźć potrzebne dane. Ma to kluczowe znaczenie, ponieważ zanim dołączysz do wielu tabel, musisz najpierw zidentyfikować te tabele.

Porozmawiamy o konwencji nazewnictwa i poradach, jak myśleć podczas pisania zapytań SQL, w dalszej części tego seria. Na razie żyjmy z faktem, że ten model jest dość prosty i możemy to zrobić dość łatwo.

Co wiemy do tej pory?

W tej serii omówiono:

  • Podstawy związane z instrukcją SQL SELECT, oraz
  • Porównanie INNER JOIN i LEFT JOIN

Wykorzystamy wiedzę z obu tych artykułów i połącz je, aby napisać bardziej złożone instrukcje SELECT, które będą łączyć wiele tabel.

Połącz wiele tabel za pomocą funkcji INNER JOIN

Pierwszym przykładem, który przeanalizujemy, jest to, jak pobrać dane z wielu tabel przy użyciu tylko INNER JOIN. W każdym przykładzie zajmiemy się definicją problemu, który musimy rozwiązać, oraz zapytaniem, które spełnia swoje zadanie. Zacznijmy więc od pierwszego problemu.

# 1 Musimy wymienić wszystkie połączenia wraz z ich godziną rozpoczęcia i zakończenia. Dla każdego połączenia chcemy wyświetlić wynik, a także imię i nazwisko pracownika, który wykonał ten telefon. Posortujemy wywołania rosnąco według czasu rozpoczęcia.

Zanim napiszemy zapytanie, zidentyfikujemy tabele, których musimy użyć. Aby to zrobić, musimy określić, które tabele zawierają potrzebne nam dane i je uwzględnić. Powinniśmy również uwzględnić wszystkie tabele na drodze między tymi tabelami – tabele, które nie zawierają potrzebnych danych, ale służą jako relacja między tabelami, które je zawierają (tak nie jest w tym przypadku).

Zapytanie, które wykonuje zadanie, podano poniżej:

Wynik zapytania podano poniżej:

Jest kilka rzeczy, na które chciałbym zwrócić uwagę:

  • Tabele, do których dołączyliśmy, są tutaj, ponieważ dane których potrzebujemy znajduje się w tych 3 tabelach
  • Za każdym razem, gdy wspominam dowolny atrybut z dowolnej tabeli, używam formatu nazwa_tabeli.nazwa_atrybutu (np. pracownik.first_name). Chociaż nie jest to potrzebne, jest to dobra praktyka, ponieważ czasami 2 lub więcej tabel w tym samym zapytaniu może używać tych samych nazw atrybutów, co prowadziłoby do błędu.
  • Użyliśmy INNER JOIN 2 razy w kolejności dołączyć do 3 stołów. Spowoduje to zwrócenie tylko wierszy zawierających pary w innej tabeli
  • Jeśli używasz tylko INNER JOIN do łączenia wielu tabel, kolejność tych tabel w połączeniach nie jest ważna. Jedyną ważną rzeczą jest użycie odpowiednich warunków łączenia po „ON” (dołączanie za pomocą kluczy obcych)

Ponieważ wszystkie połączenia miały powiązanego pracownika i wynik połączenia, otrzymalibyśmy ten sam wynik, gdyby użyliśmy LEFT JOIN zamiast INNER JOIN.

Dołączanie do wielu tabel za pomocą LEFT JOIN

Pisanie zapytań używających LEFT JOIN nie różni się zbytnio od pisania zapytań za pomocą WEWNĘTRZNE JOINY. Wynik byłby oczywiście inny (przynajmniej w przypadkach, gdy niektóre rekordy nie mają pary w innych tabelach).

To jest problem, który chcemy rozwiązać.

# 2 Wymień wszystkie hrabstwa i klientów powiązanych z tymi krajami. Dla każdego kraju wyświetl nazwę w języku angielskim, nazwa miasta, w którym znajduje się klient, oraz nazwa tego klienta. Zwróć nawet kraje bez powiązanych miast i klientów.

Tabele zawierające potrzebne nam dane znajdują się na poniższym obrazku:

Najpierw szybko sprawdź co jest cd z tych 3 tabel.

Możemy zauważyć dwie ważne rzeczy:

  • Chociaż każde miasto ma powiązany kraj, nie wszystkie kraje mają powiązane miasta (Hiszpania & Rosja ich nie ma)
  • To samo dotyczy klientów.Każdy klient ma zdefiniowaną wartość city_id, ale używane są tylko 3 miasta (Berlin, Zagrzeb & Nowy Jork)

Najpierw zapiszmy zapytanie przy użyciu INNER JOIN:

Wynik zapytania pokazano na poniższym obrazku:

Mamy 7 hrabstw i 6 miast w naszej bazie danych, ale nasze zapytanie zwraca tylko 4 wiersze. Wynika to z faktu, że w naszej bazie danych mamy tylko 4 klientów. Każdy z tych 4 jest powiązany z jego miastem, a miasto z krajem. Tak więc INNER JOIN wyeliminował wszystkie te kraje i miasta bez klientów. Ale jak uwzględnić je również w wyniku?

Aby to zrobić, użyjemy LEFT JOIN. Po prostu zamienimy wszystkie „INNER” na „LEFT”, aby nasze zapytanie wyglądało następująco:

Wynik jest pokazany na poniższym obrazku:

Możesz łatwo zauważyć, że teraz mamy wszystkie kraje, nawet te bez żadnego powiązanego miasta (Rosja & Hiszpania), a także wszystkie miasta, nawet te bez klientów (Warszawa, Belgrad & Los Angeles). Pozostałe 4 wiersze są takie same, jak w zapytaniu używającym INNER JOIN.

LEFT JOIN – kolejność tabel ma znaczenie

Chociaż kolejność JOIN w INNER JOIN nie jest ważna, to samo nie oznacza LEFT JOIN. Kiedy używamy LEFT JOIN w celu dołączenia do wielu tabel, należy pamiętać, że to sprzężenie obejmie wszystkie wiersze z tabeli po LEWEJ stronie JOIN. Zmieńmy układ poprzedniego zapytania:

Na początku można by było łatwo powiedzieć, że to zapytanie i poprzednie są takie same (jest to prawdą w przypadku korzystania z INNER JOIN). Użyliśmy tych samych tabel, LEFT JOIN i tych samych warunków łączenia. Przyjrzyjmy się najpierw wynikowi:

Więc co się tutaj stało? Dlaczego mamy 4 wiersze (te same 4, które mieliśmy, gdy użyliśmy INNER JOIN)?

Odpowiedź jest prosta i jest związana z działaniem LEFT JOIN. Pobiera pierwszą tabelę (klienta) i łączy wszystkie jej wiersze (4 z nich) z kolejną tabelą (miasto). Wynikiem tego są 4 rzędy, ponieważ klient może należeć tylko do 1 miasta. Następnie łączymy te 4 wiersze z następną tabelą (krajem) i znowu mamy 4 wiersze, ponieważ miasto może należeć tylko do 1 kraju.

Powód, dla którego nie dołączyliśmy do tych 3 tabel w tym sposób jest podany w tekście przykładu # 2. Zapytanie jest napisane w taki sposób, że zwraca 4 wiersze, które byłyby odpowiedzią na następujące: Zwracane nazwy wszystkich klientów oraz miasta i kraje, w których się znajdują. Zwracają nawet klientów bez powiązanych miast i krajów.

  • Uwaga: Kiedy używasz LEFT JOIN, kolejność tabel w tej instrukcji jest ważna i zapytanie zwróci inny wynik, jeśli zmienisz tę kolejność. Kolejność w rzeczywistości zależy od tego, co chcesz zwrócić jako wynik.

Dołącz do wielu tabel używając obu – INNER JOIN & LEFT JOIN

Jest to również możliwe. Przejdźmy ponownie do przykładu.

# 3 Zwróć listę wszystkich krajów i miast, które mają parę (wyklucz kraje, do których nie ma odniesienia w żadnym mieście). Na takie pary zwracają się wszyscy klienci. Zwróć parzyste pary nie mające ani jednego klienta.

Zapytanie, które wykonuje to zadanie:

Wynik zapytania jest przedstawiony na poniższym obrazku:

Możesz łatwo zauważyć, że nie mamy krajów bez powiązanych miast (były to Hiszpania & Rosja). INNER JOIN wyeliminował te rzędy. Mimo to mamy cytaty bez klientów (Belgrad, Los Angeles & Warszawa). Wynika to z faktu, że użyliśmy LEFT JOIN między tabelami miasto i klient.

Wniosek

Gdy musisz dołączyć do wielu stołów, masz INNER & LEFT JOIN do Twojej dyspozycji (RIGHT JOIN jest rzadko używany i można go łatwo zastąpić LEFT JOIN). To, które połączenie, którego użyjesz, zależy bezpośrednio od zadania, które musisz rozwiązać, i poczujesz to po drodze. W kolejnych artykułach omówimy, jak myśleć i organizować się, gdy trzeba pisać bardziej złożone zapytania.

Spis treści

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

Naucz się SQL: INSERT INTO TABLE

Naucz się SQL: klucz podstawowy

Naucz się SQL: klucz obcy

Naucz się SQL: SELECT instrukcja

Learn SQL: INNER JOIN vs LEFT JOIN

Learn SQL: SQL Scripts

Learn SQL: Typy relacji

Naucz się SQL: łączenie wielu tabel

Naucz się SQL: funkcje agregujące

Naucz się SQL: jak napisać złożony SELECT Zapytanie

Nauka języka SQL: baza danych INFORMATION_SCHEMA

Nauka języka 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

Nauka języka SQL: widoki SQL

Nauka języka SQL: wyzwalacze SQL

Nauka języka SQL: ćwiczenie zapytań SQL

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

Nauka języka SQL: ręczne tworzenie raportu za pomocą zapytań SQL

Nauka języka SQL: Funkcje daty i czasu SQL Server

Learn SQL: tworzenie raportów SQL Server przy użyciu funkcji daty i czasu

Learn SQL: SQL Server Pivot Tables

Nauka SQL: eksport SQL Server do Excela

Nauka SQL: Wprowadzenie do pętli SQL Server

Nauka SQL: SQL Server Cursors

Naucz się SQL: Najważniejsze wskazówki dotyczące usuwania i aktualizowania danych w języku SQL

Naucz się języka SQL: Konwencje nazewnictwa

Naucz się języka SQL: Zadania związane z SQL

Learn SQL: Non-Equi Joins in SQL Server

Learn SQL: SQL Injection

  • 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 zapominajmy 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 *