Jak kombinuji výsledky z několika tabulek SQL (nápověda: existují tři způsoby)
V relační databázi jsou mnohokrát informace, které chcete ve svém dotazu zobrazit, více než jedna tabulka. To vyvolává otázku „Jak kombinujete výsledky z více než jedné tabulky?“
Všechny příklady této lekce jsou založeny na Microsoft SQL Server Management Studio a databázi AdventureWorks2012. Můžete začít používat tyto bezplatné nástroje využívající mou příručku Začínáme používat SQL Server.
Jaké jsou způsoby, jak mohu kombinovat výsledky z více než jednoho dotazu?
SQL by nebyl velmi užitečným jazykem, kdyby nebyl Neposkytujeme snadný způsob, jak kombinovat výsledky z více než jednoho dotazu. Naštěstí existují tři hlavní způsoby, jak kombinovat data z více tabulek. Zde si je krátce projdeme a poskytneme odkazy na podrobnější články.
Tři hlavní způsoby, jak kombinovat data
Data v tabulkách relační databáze jsou uspořádána do řádků a sloupců. Když zkoumáme způsoby, jak kombinovat data, mějte na paměti, že konečným výsledkem bude buď přidejte do výsledku více sloupců, možná z jiné související tabulky, nebo řádků, a to tak, že vezmete sadu řádků ze dvou nebo více tabulek s.
Když se většina lidí naučí kombinovat data, o kterých se dozví:
- JOIN – Spojením můžete spojit sloupce z jednoho nebo více dotazů do jednoho výsledku.
- UNION – Použijte Unions a další operátory sady ke kombinování řádků z jednoho nebo více dotazů do jednoho výsledku.
- Sub dotazy – Někdy se jim říká vnořené dotazy, lze je použít k samostatnému vyhledávání v databáze ukázala, že výsledky lze použít v jiném dotazu.
Spojení
Rád bych uvažoval o spojích jako o lepidle, které dává databázi dohromady. Relační databáze se obvykle normalizují, aby se data snáze udržovala a zlepšoval výkon, ale konečným výsledkem je informace rozdělená do mnoha tabulek. Pomocí spojení můžete tyto informace znovu zkombinovat do formátu, který je lépe čitelný člověku. Data jsou rekombinována odpovídajícími sloupci z každé tabulky.
Ve všech případech vyžadují spojení dvě hlavní složky: dvě tabulky a podmínku spojení. Tabulky jsou tím, co použijeme k vytažení řádků a sloupců a podmínkou spojení je, jak hodláme shodu sloupců mezi tabulkami.
Příklad JOIN
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
Existují dva hlavní typy spojení. Vnitřní spojení a vnější spojení.
Vnitřní spojení vrátí výsledný řádek, pouze pokud se podmínka spojení shoduje v obou tabulkách. Vnitřní spojení se používají hlavně k porovnání primárního klíče jedné tabulky s cizím klíčem v jiné.
Druhým typem spojení je vnější spojení. Vnější spojení vždy vrátí alespoň jeden řádek pro hlavní tabulku, označovaný jako levá nebo pravá tabulka, a hodnoty null v příslušných sloupcích neodpovídajícího sloupce. Vnější spojení jsou užitečná pro hledání neodpovídajících dat.
Je důležité si uvědomit, že spojení mohou vracet více řádků, než kolik existuje v obou tabulkách dohromady. Spojení vrátí kombinace zápasů. Pokud spojíte dvě tabulky, jednu obsahující 5 řádků a druhou 10, může výsledek obsahovat kdekoli od 0 do 50 řádků v závislosti na podmínkách spojení.
Odbory
UNION is slouží ke sloučení řádků dvou nebo více dotazů do jednoho výsledku. Spojení se nazývá operátor množiny.
Aby spojení mohlo fungovat, musí se vyskytnout některé speciální podmínky. Nejprve musí mít každý dotaz stejný počet sloupců. Za druhé, datové typy těchto sloupců musí být kompatibilní. Obecně řečeno, každý dotaz musí vracet stejný počet a typ sloupců.
Praktickým příkladem sjednocení je, když dvě tabulky obsahují čísla dílů a chcete vytvořit kombinovaný seznam pro katalog. Můžete se rozhodnout, že konečným výsledkem bude jedinečný výpis pro kombinovaný dotaz, nebo pokud použijete UNION ALL, vrátí všechny řádky z každé tabulky.
Příklad UNION
SELECT C.NameFROM Production.ProductCategory AS CUNIONSELECT S.NameFROM Production.ProductSubcategory AS S
Kromě Unionu existuje několik dalších užitečných operátorů množin:
- INTERSECT – Tuto funkci můžete použít pouze k vrácení řádků, které jsou společné mezi dvěma tabulkami.
- EXCEPT – Můžete jej použít k vrácení řádků, které existují v jedné tabulce, ale v jiné se nenacházejí.
Jak se budete dále učit více SQL, najdete že můžete použít spojení k zápisu ekvivalentních příkazů pro Intersect a Except, ale pro Union neexistují žádné ekvivalenty.
Poddotazy
Poddotazy se někdy nazývají vnořené dotazy. Jsou to dotazy definované uvnitř jiných dotazů. Poddotazy mohou být matoucí. Myslím, že hodně z toho vyplývá ze skutečnosti, že je lze použít na mnoha místech v příkazu SQL select, a to z několika důvodů!
Například zde jsou některé oblasti, kde se může zobrazit poddotaz:
- klauzule SELECT – slouží k vrácení hodnoty. Například pokud dotazujete na tabulku prodejů, můžete zahrnout celkové tržby vrácením součtu všech prodejů z poddotazu.
- Klauzule WHERE – Poddotazy lze použít v klauzuli where ve srovnání. Můžete nastavit srovnání a porovnat prodej s celkovým průměrem. Celkový průměr by se vrátil z poddotazu. Můžete také použít poddotazy v operátorech členství, jako je IN. Spíše než pevné zakódování klauzule in můžete použít poddotaz, aby byl dynamičtější.
- Klauzule HAVING – Do porovnání klauzule HAVING je zahrnuta jedna hodnota z poddotazu.
Příklad poddotazu
SELECT SalesOrderID, LineTotal, (SELECT AVG(LineTotal) FROM Sales.SalesOrderDetail) AS AverageLineTotalFROM Sales.SalesOrderDetail
Při použití v klauzulích select a operátorech porovnání, jako jsou equals, greater than a less than , poddotaz může vrátit pouze jeden řádek. Pokud se používá ve spojení s operátorem členství, například IN, je v pořádku, aby dotaz vrátil jeden nebo více řádků.