Jak połączyć wyniki z kilku tabel SQL (wskazówka: istnieją trzy sposoby)
Wiele razy w relacyjnej bazie danych znajdują się informacje, które chcesz pokazać w zapytaniu więcej niż jeden stół. To nasuwa pytanie „Jak połączyć wyniki z więcej niż jednej tabeli?”
Wszystkie przykłady w tej lekcji są oparte na programie Microsoft SQL Server Management Studio i bazie danych AdventureWorks2012. Możesz zacząć korzystać z tych bezpłatnych narzędzia korzystające z mojego Przewodnika Pierwsze kroki Korzystanie z SQL Server.
W jaki sposób mogę łączyć wyniki z więcej niż jednego zapytania?
SQL nie byłby zbyt przydatnym językiem, gdyby nie nie zapewnia łatwego sposobu łączenia wyników z więcej niż jednego zapytania. Na szczęście istnieją trzy główne sposoby łączenia danych z wielu tabel. Omówimy je tutaj pokrótce i udostępnimy linki do bardziej szczegółowych artykułów.
Trzy główne sposoby łączenia danych
Dane w tabelach relacyjnej bazy danych są zorganizowane w wiersze i kolumny. Badając sposoby łączenia danych, pamiętaj, że wynikiem końcowym będzie dodać więcej kolumn do wyniku, być może z innej powiązanej tabeli lub wierszy, pobierając zestaw wierszy z dwóch lub więcej tabel s.
Kiedy większość ludzi uczy się łączyć dane, o których się dowiaduje:
- JOIN – Możesz użyć łączenia, aby połączyć kolumny z jednego lub więcej zapytań w jeden wynik.
- UNION – użyj Unions i innych operatorów zbiorów, aby połączyć wiersze z jednego lub więcej zapytań w jeden wynik.
- Zapytania podrzędne – czasami nazywane zapytaniami zagnieżdżonymi, można ich użyć do przeprowadzenia oddzielnego wyszukiwania w baza danych pokazała wyniki mogą być użyte w innym zapytaniu.
Połączenia
Lubię myśleć o złączeniach jako o kleju, który ponownie łączy bazę danych. Relacyjne bazy danych są zwykle znormalizowane, aby ułatwić przechowywanie danych i poprawić wydajność, ale efektem końcowym jest podzielenie informacji na wiele tabel. Możesz użyć Łączenia, aby ponownie połączyć te informacje w format bardziej czytelny dla człowieka. Dane są ponownie łączone przez dopasowanie kolumn z każdej tabeli.
We wszystkich przypadkach łączenia wymagają dwóch głównych składników: dwóch tabel i warunku łączenia. Tabele są tym, czego użyjemy do ściągnięcia wierszy i kolumn, a warunek złączenia to sposób, w jaki zamierzamy dopasować kolumny między tabelami.
Przykład JOIN
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
Istnieją dwa główne typy sprzężeń. Łączenia wewnętrzne i łączenia zewnętrzne.
Łączenia wewnętrzne zwracają wynikowy wiersz tylko wtedy, gdy warunek sprzężenia pasuje do obu tabel. Złączenia wewnętrzne są używane głównie do dopasowania klucza podstawowego jednej tabeli do klucza obcego w innej.
Drugi typ sprzężenia to sprzężenie zewnętrzne. Łączenia zewnętrzne zawsze zwracają co najmniej jeden wiersz dla tabeli głównej, nazywanej tabelą lewą lub prawą, oraz wartości null w odpowiednich kolumnach niepasującej kolumny. Złączenia zewnętrzne są przydatne do znajdowania niezgodnych danych.
Należy pamiętać, że łączenia mogą zwracać więcej wierszy niż istnieje w dowolnej tabeli razem wziętej. Połączenia zwracają kombinacje dopasowań. Jeśli połączysz dwie tabele, jedną zawierającą 5 wierszy, a drugą 10, wynik może zawierać od 0 do 50 wierszy w zależności od warunku łączenia.
Unions
UNION to używane do łączenia wierszy dwóch lub więcej zapytań w jeden wynik. Związek nazywany jest operatorem zbioru.
Istnieją pewne specjalne warunki, które muszą wystąpić, aby związek działał. Po pierwsze, każde zapytanie musi mieć taką samą liczbę kolumn. Po drugie, typy danych w tych kolumnach muszą być zgodne. Ogólnie rzecz biorąc, każde zapytanie musi zwracać tę samą liczbę i typ kolumn.
Praktycznym przykładem sumy jest sytuacja, gdy dwie tabele zawierają numery części i chcesz utworzyć połączoną listę dla katalogu. Możesz wybrać, czy wynik końcowy ma być unikalną listą dla połączonego zapytania, albo jeśli użyjesz UNION ALL, aby zwrócić wszystkie wiersze z każdej tabeli.
Przykład UNION
SELECT C.NameFROM Production.ProductCategory AS CUNIONSELECT S.NameFROM Production.ProductSubcategory AS S
Oprócz Union istnieje kilka innych przydatnych operatorów zestawów:
- INTERSECT – Możesz użyć tego, aby zwrócić tylko wiersze, które są wspólne dla dwóch tabel.
- EXCEPT – możesz użyć tego do zwrócenia wierszy, które istnieją w jednej tabeli, ale nie znajdują się w innej.
W miarę uczenia się więcej SQL, znajdziesz że można używać złączeń do pisania równoważnych instrukcji dla Intersect i Except, ale nie ma odpowiedników dla Union.
Podzapytania
Podzapytania są czasami nazywane zapytaniami zagnieżdżonymi. Są to zapytania zdefiniowane w innych zapytaniach. Podzapytania mogą być mylące. Myślę, że wiele z tego wynika z faktu, że mogą być używane w wielu miejscach w instrukcji SQL select i do kilku celów!
Na przykład, oto kilka obszarów, w których możesz zobaczyć podzapytanie:
- klauzula SELECT – służy do zwracania wartości. Na przykład, jeśli odpytujesz tabelę sprzedaży, możesz uwzględnić łączną sprzedaż, zwracając sumę wszystkich sprzedaży z podzapytania.
- Klauzula WHERE – podzapytania mogą być używane w klauzuli where w porównaniach. Możesz ustawić porównanie, aby porównać sprzedaż z ogólną średnią. Ogólna średnia zostanie zwrócona z podzapytania. Możesz również używać podzapytań w operatorach członkostwa, takich jak IN. Zamiast na stałe zakodować klauzulę in, możesz użyć podzapytania, aby uczynić ją bardziej dynamiczną.
- Klauzula HAVING – Pojedyncza wartość z podzapytania jest uwzględniana w porównaniach klauzul HAVING.
Przykładowe podzapytanie
SELECT SalesOrderID, LineTotal, (SELECT AVG(LineTotal) FROM Sales.SalesOrderDetail) AS AverageLineTotalFROM Sales.SalesOrderDetail
W przypadku użycia w klauzulach wyboru i operatorach porównania, takich jak równe, większe niż i mniejsze niż , podzapytanie może zwrócić tylko jeden wiersz. Jeśli zostanie użyte w połączeniu z operatorem członkostwa, takim jak IN, zapytanie może zwrócić jeden lub więcej wierszy.