Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wydajność MySQL:wprowadzenie do JOIN w SQL

W tym artykule poznamy podstawy łączenia tabel w SQL. Poznamy lewe, prawe, wewnętrzne i zewnętrzne JOIN i podamy przykłady ich użycia.

Dane w RDBMS (Relational Database Management System) są pogrupowane w tabele. Tabele te mają sztywną definicję rodzaju danych, które mogą być w nich przechowywane. Aby połączyć różne tabele, a tym samym różne typy danych, które mogą być ze sobą powiązane, użyjemy klauzuli JOIN.

Rodzaje sprzężeń

Istnieją cztery podstawowe typy JOIN:INNER, OUTER, LEFT i RIGHT. Łącząc dwie tabele, każda z nich zwróci inny podzbiór odpowiednich tabel w zależności od warunku w klauzuli ON.

  • SPRZĘŻENIA LEWE i PRAWE wykonują podobne zadanie. Obydwa zwracają całość jednej tabeli z informacją związaną z drugą tabelą.
  • Łączenia WEWNĘTRZNE i ZEWNĘTRZNE wykonują bardzo różne zadania. INNER JOIN daje bardzo ograniczony wynik, podczas gdy OUTER zwraca kompletny zestaw danych.
Uwaga:w chwili pisania tego artykułu MariaDB i MySQL nie obsługują złączy OUTER JOIN. Podamy jednak przykład sposobu na uzyskanie tego wyniku w inny sposób.

W tym przykładzie korzystamy z przykładu działu sprzedaży w tym samouczku, zatrudniającego trzy tabele:sprzedawcy, zamówienia i klienci.

Tabela sprzedawców będzie miała trzy kolumny:identyfikator, nazwa i stawka prowizji.

Następnie tabela zamówień będzie zawierać cztery kolumny:identyfikator zamówienia, całkowity koszt zamówienia, klienta i, jeśli jest dostępny, sprzedawcę.

Tabela klientów będzie zawierać dwie kolumny:identyfikator i podstawowe informacje kontaktowe.

Tak więc mamy teraz wiele tabel informacji, które są przydatne dla różnych osób na różne sposoby. Korzystając z tych trzech tabel (sprzedawcy, zamówienia i klient), przedstawimy przykłady użyteczności każdego z JOIN.

LEWY DOŁĄCZ

Prawdopodobnie najczęściej używanym typem JOIN jest LEFT JOIN. Jeśli pomyślisz o połączeniu dwóch tabel, ta wymieniona w klauzuli FROM znajduje się po lewej stronie. Ten wymieniony w klauzuli JOIN znajduje się po prawej stronie. W przypadku LEFT JOIN każdy wiersz z tabeli LEFT (lub FROM) jest zwracany w wyniku i jest łączony z odpowiadającymi mu wierszami z tabeli RIGHT (lub JOIN), które odpowiadają klauzuli ON.

Pamiętaj, że niektóre wiersze po LEWEJ mogą nie zawierać pasujących danych po PRAWEJ. W takim przypadku pola, które zostałyby wypełnione z PRAWEJ tabeli w wyniku, zostaną wypełnione wartością NULL.

Ponadto, jeśli wiele wierszy w PRAWEJ tabeli pasuje do wierszy z LEWEJ tabeli, wiele wierszy zostanie uwzględnionych w zestawie wyników. Diagram Venna pokazuje, jak wyglądałoby LEFT JOIN:

Dyrektor Marketingu poprosi Cię o raport ze wszystkich zamówień z podziałem na klientów. W tym celu możesz użyć LEFT JOIN:

SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;

To zapytanie prosi o wszystkie dane w tabeli „zamówienia” połączone z wierszami w tabeli „klient”, gdzie identyfikator klienta jest równy identyfikatorowi klienta w zamówieniu. Wynik wyglądałby tak:

Zauważ, że dla klienta Widgets LLC są trzy wpisy, ponieważ mieli trzy zamówienia. Jolly Inc. złożyło dwa zamówienia, a Acme Inc złożyło jedno. Cheapo nie pojawia się na tej liście, ponieważ nie złożono żadnych zamówień.

PRAWY DOŁĄCZ

RIGHT JOIN jest bardzo podobne do LEFT JOIN, z tą różnicą, że zwraca każdy wiersz z tabeli RIGHT (JOIN) i tylko odpowiadające mu wiersze z tabeli LEFT (FROM). Ponownie, jeśli w tabeli LEFT nie ma danych, te kolumny zostaną wypełnione wartościami NULL.

Jeśli w LEWEJ tabeli znajduje się wiele wierszy, w zestawie wyników będzie wiele wierszy. Jego diagram Venna wyglądałby tak:

Jeśli kierownictwo chce raportu z KAŻDYM klientem; nawet jeśli nie złożyli zamówienia, moglibyśmy użyć WŁAŚCIWEGO DOŁĄCZENIA.

SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;

Ponownie zaczynamy od tabeli „zamówienia” i ŁĄCZYMY ją z tabelą klienta. Ponieważ użyliśmy RIGHT JOIN, otrzymamy co najmniej jeden wiersz dla każdego wpisu w tabeli RIGHT (JOIN), klient. Jeśli istnieje zgodność między customer.id i orders.customer_id, informacje są wypełniane.  Wyniki obejmują Cheapo Co z wartościami NULL w kolumnach zamówienia:

DOŁĄCZENIE WEWNĘTRZNE

INNER JOIN zwraca tylko te wiersze z każdej kolumny, które pasują do klauzuli ON. Jeśli nie ma dopasowania po PRAWEJ, wiersze z LEWEJ są wykluczone i na odwrót. Diagram Venna dla ZŁĄCZENIA WEWNĘTRZNEGO wygląda tak:

To jest chwilówka i dział płac musi wiedzieć, ile prowizji ma wypłacić. W tym celu będą musieli znać zamówienia złożone przez każdego sprzedawcę. Pamiętaj, że nie wszystkie zamówienia przeszły przez sprzedawcę, więc nie przejmujemy się nimi. W tym celu możemy użyć DOŁĄCZENIA WEWNĘTRZNEGO:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Ponownie zaczynamy od tabeli zamówień. Tym razem dołączamy do stołu handlowców. Jeśli istnieje wpis w tabeli zamówień, który pasuje do wpisu w tabeli salespeople, wiersz zostanie uwzględniony. Zamiast wypełniać niedopasowane wiersze wartościami NULL, wiersze te są ignorowane w wynikach.

Należy pamiętać, że każemy bazie danych zwracać nie tylko kwotę sprzedaży i stawkę prowizji, ale także naliczoną prowizję. Wyniki wyglądałyby tak:

POŁĄCZENIE ZEWNĘTRZNE

ZŁĄCZENIE ZEWNĘTRZNE zwraca wszystko, niezależnie od tego, czy jest dopasowanie. Jeśli połączysz wyniki LEWEJ i PRAWEJ DOŁĄCZENIA, otrzymasz ZEWNĘTRZNE DOŁĄCZENIE. Diagram Venna dla ZŁĄCZENIA ZEWNĘTRZNEGO wygląda tak:

Teraz jest koniec miesiąca i kierownik sprzedaży chce znać WSZYSTKIE sprzedaże, a także wszystkie wypłacone prowizje. W tym celu użyjemy ZŁĄCZENIA ZEWNĘTRZNEGO:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Podobnie jak raport płacowy, zaczynamy od zamówień i DOŁĄCZAMY do sprzedawców. Różnica polega na tym, że przy OUTER JOIN otrzymasz wyniki z obu tabel LEFT i RIGHT z wpisanym NULL tam, gdzie nie ma odpowiadającego dopasowania. Wyniki wyglądają tak:

Teraz pamiętaj, że powiedzieliśmy, że MariaDB i MySQL nie obsługują OUTER JOIN. Powiedzieliśmy również, że jeśli dodasz LEFT JOIN do RIGHT JOIN, otrzymasz OUTER JOIN. Sztuczka w tych dwóch systemach polega właśnie na tym. Osiągamy to dzięki klauzuli UNION. Dodaje wyniki jednego zapytania do drugiego:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Wyniki wyglądałyby tak:

WIELE POŁĄCZEŃ

JOIN pozwala również na połączenie więcej niż dwóch stołów. Jeśli potrzebujemy pełnego raportu sprzedaży z informacjami o klientach i sprzedawcach, po prostu wykonujemy na końcu kolejne JOIN.

SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;

W tym przykładzie zaczynamy od tabeli zamówień i łączymy ją z tabelą sprzedawców, podobnie jak wcześniej. Następnym krokiem jest DOŁĄCZENIE stołu do stołu klienta. Spowoduje to wypełnienie wszystkich informacji, które można połączyć z tabelą zamówień.

Ten artykuł jest krótkim wprowadzeniem i nie stanowi wyczerpującej dyskusji o tym, jak można używać JOIN w SQL.

Kliknij poniżej, aby skorzystać z tego wygodnego kuponu już dziś!

Liquid Web posiada jedne z najpotężniejszych serwerów baz danych w branży. Serwery te mogą być wykorzystywane do prowadzenia od najmniejszych firm domowych do największych klastrów wielobazowych dla korporacji na skalę korporacyjną.

Zadzwoń do nas pod numer 800.580.4985 lub otwórz czat lub bilet, aby porozmawiać z jednym z naszych doświadczonych doradców ds. rozwiązań lub hostingu, aby dowiedzieć się, jak możesz skorzystać z tych technik już dziś!

Nawigacja po seriach<
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak importować / przywracać tabele MySql za pomocą PHP

  2. Co to jest CHAR_LENGTH() w MySQL?

  3. Przechowywanie i wyświetlanie ciągu Unicode (हिन्दी) przy użyciu PHP i MySQL

  4. Czy mogę połączyć wiele wierszy MySQL w jedno pole?

  5. Jak stworzyć bazę danych MySQL i ustawić uprawnienia