Jedną z największych zalet korzystania z relacyjnych baz danych, takich jak MySQL, jest to, że ich relacyjna struktura umożliwia łatwe przechowywanie informacji i wykonywanie zapytań w wielu tabelach.
Przyjrzyjmy się, jak pobrać dokładnie potrzebne dane z wielu tabel bazy danych i różne dostępne sprzężenia, które pozwalają uzyskać dokładne wyniki.
Zainicjuj przykładową bazę danych
Nie jest to wymagane, ale jeśli chcesz postępować zgodnie z przykładami w tym artykule, możesz zainicjować przykładową bazę danych lokalnie za pomocą poniższych poleceń terminala:
git clone https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampledb
mysql> WYBIERZ LICZBĘ (*) OD klientów;
Powinieneś otrzymać wynik stwierdzający, że w pliku jest 2000 wierszy klienci stół.
Domyślnie / INNER Dołącz
Domyślne łączenie używane w Bazy danych MySQL nazywa się złączeniem WEWNĘTRZNYM i jest najbardziej powszechne i proste. To sprzężenie zwraca wszystkie rekordy, dla których istnieją zgodne rekordy w obu tabelach, i odrzuca wszystkie inne rekordy.
Java udostępnia JDBC jako część Java SDK. W tym artykule przyjrzyjmy się szczegółom łączenia się z bazą danych MySQL i wykonywania z nią zapytań.
Na przykład, jeśli chcesz zobaczyć imię i nazwisko klienta oraz kwotę i datę zamówienia dla wszystkich zamówień większych niż 1000 USD, możesz użyć następującej instrukcji SQL:
WYBIERZ
c.id, c.first_name, c.last_name, o.amount, o.created_at
OD
klienci c, zamówienia o
GDZIE
o.customer_id = c.id AND o.amount> = 1000;
Kilka uwag dotyczących powyższego zapytania:
- Wybieranych jest pięć różnych kolumn, trzy z tabeli klientów i dwie z tabeli zamówień.
- W klauzuli FROM dwie tabele są zdefiniowane, ale zakończone są literami „c” i „o”. Te po prostu określają aliasy w SQL, mogą być dowolne i służą do skracania zapytania SQL.
- Plik o.customer_id = c.id jest aspektem łączenia zapytania i zapewnia odpowiednią korelację między klientami a zamówieniami.
Poniżej przedstawiono inny i technicznie bardziej poprawny składniowo sposób pisania tego samego zapytania:
WYBIERZ
c.id, c.first_name, c.last_name, o.amount, o.created_at
OD
klienci c INNER JOIN zamówienia o
NA
customer_id = c.id
GDZIE
o.amount> = 1000;
Powyższe zapytanie wydaje się być trochę łatwiejsze do odczytania, ponieważ można łatwo zobaczyć połączenie między klientami a tabelą zamówień. Jednak pod każdym względem te dwa zapytania są takie same i dadzą dokładnie te same rekordy.
LEFT łączy
Łączenia po lewej stronie zwracają wszystkie rekordy z lewej tabeli, które również pasują do rekordów z prawej tabeli, i odrzucają wszystkie inne rekordy. Na przykład, jeśli chcesz zobaczyć łączną kwotę sprzedaży dla każdego produktu w bazie danych, możesz spróbować użyć zapytania takiego jak:
WYBIERZ
p.name, sum (item.amount) AS tamount
OD
zamowienia pozycja LEWA DOŁĄCZ produkty p
NA
item.product_id = p.id
GROUP BY item.product_id ZAMÓWIENIE PRZEZ tamount DESC
Daje to ładny widok z dwiema kolumnami, pokazujący nazwę produktu z całkowitą kwotą sprzedaży i działa zgodnie z oczekiwaniami. Zapytanie przeszło przez wszystkie produkty w tabeli order_items, połączyło je z rekordami w tabeli products i zwróciło całkowitą kwotę sprzedaży każdego z nich.
RIGHT łączy
Korzystając z powyższego przykładu, zwróć uwagę na fakt, że powyższe zapytanie zwróciło tylko 19 rekordów, podczas gdy w bazie danych znajdują się łącznie 22 produkty. Dzieje się tak, ponieważ zapytanie rozpoczęło się od tabeli orders_items i zostało połączone z tabelą products, a ponieważ niektóre produkty nigdy nie zostały zamówione, w pliku order_items nie ma zapisów dotyczących tych produktów stół.
Co się stanie, jeśli chcesz otrzymać listę wszystkich produktów z kwotami sprzedaży, w tym produkty, które nie zostały zamówione? Wypróbuj prawidłowe sprzężenie za pomocą następującego zapytania:
WYBIERZ
p.name, sum (item.amount) AS tamount
OD
order_items pozycja PRAWO DOŁĄCZ produkty p
NA
item.product_id = p.id
GROUP BY p.id ZAMÓWIENIE PRZEZ tamount DESC
Tak jest lepiej, a zapytanie zwraca teraz pełne 22 produkty, przy czym trzy z nich mają wartość zero. Dzieje się tak, ponieważ zamiast używać orders_items jako tabeli podstawowej, która łączy się z tabelą products, prawe sprzężenie odwraca zamówienie i łączy tabelę products z tabelą orders_items.
Wiele połączeń w zapytaniu
Czasami trzeba połączyć trzy lub więcej tabel, aby uzyskać określony zestaw wyników.
Na przykład, może potrzebujesz listy wszystkich klientów, którzy kupili kuchenkę mikrofalową (identyfikator produktu nr 1), wraz z ich nazwiskami i datą zamówienia. Wymaga to SELECT w trzech tabelach, które można wykonać za pomocą dwóch sprzężeń z następującym zapytaniem:
WYBIERZ
c.first_name, c.last_name, o.amount, o.created_at
OD
klienci c INNER JOIN zamówienia o
NA
c.id = o.customer_id INNER JOIN order_items item
NA
item.order_id = o.id
GDZIE
item.product_id = 1 ZAMÓWIENIE PRZEZ o.created_at;
To zapytanie zwraca wszystkie 426 zamówienia mikrofalówki i działa zgodnie z oczekiwaniami. Najpierw dopasowuje wszystkich klientów do ich odpowiednich zamówień, a następnie dalsze zapytania, które wynikają z dopasowywanie wszystkich zamówień tylko do tych w tabeli orders_items, które zawierają produkt mikrofalowy (id # 1).
Nigdy nie używaj zapytań podrzędnych z klauzulami IN
Na marginesie, należy za wszelką cenę unikać używania zapytań podrzędnych w zapytaniach SQL, takich jak:
SELECT first_name, last_name OD klientów WHERE id IN (SELECT customer_id FROM zamówienia WHERE status = 'zatwierdzone' ORAZ kwota <100);
Zapytania, takie jak powyższe, są bardzo nieefektywne, wymagają dużej liczby zasobów i należy ich unikać w miarę możliwości. Zamiast tego użyj odpowiednich połączeń, jak opisano w powyższych sekcjach. Na przykład powyższe zapytanie należy przepisać jako:
SELECT c.first_name, c.last_name OD klientów c LEFT JOIN zamówienia o ON o.customer_id = c.id WHERE o.status = 'Approved' AND o.amount <100;
Oszczędź czas dzięki połączeniom SQL
Mam nadzieję, że ten artykuł pomoże Ci pokazać moc relacyjnych baz danych, takich jak MySQL, i jak je budować Zapytania SQL które pobierają rekordy z wielu tabel w ramach jednego zapytania przy użyciu sprzężeń, umożliwiając uzyskanie dokładnych żądanych wyników.
Nauczyłeś się trzech różnych łączeń w SQL, jak tworzyć aliasy nazw kolumn i tabel, używać wielu łączeń w jednym zapytaniu i dlaczego należy unikać zapytań podrzędnych. Nigdy więcej nie próbuj ręcznie skompilować różnych zestawów danych w jeden i zacznij używać złączeń, aby zaimponować współpracownikom i zaoszczędzić czas.
Dokumenty Google to teraz potęga biurowa. Z pomocą tych dodatków możesz nadać swoim Dokumentom Google ładny i stylowy wygląd.
- Programowanie
- SQL
- Baza danych
Zapisz się do naszego newslettera
Dołącz do naszego biuletynu, aby otrzymywać wskazówki techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!
Jeszcze jeden krok…!
Potwierdź swój adres e-mail w wiadomości e-mail, którą właśnie wysłaliśmy.