Tradičně získáváte data ze dvou nebo více tabulek pomocí WHERE
klauzule v dotazu. Ale v relačním databázovém systému (RDBMS) toho lze dosáhnout pomocí jediného SELECT
dotaz. To je skutečná síla relačních databázových systémů. V této příručce se dozvíte o SQL Joins, účinném způsobu, jak porovnávat a vybírat řádky a tabulky.
Co je spojení SQL?
V SQL, join
klauzule rozšiřuje možnost porovnávání a výběru řádků z tabulek. Používá algebraický proces kombinování řádků ze dvou nebo více tabulek na základě souvisejícího sloupce v těchto tabulkách. Podle definice SQL standardu ANSI existuje pět typů spojení –Křížová spojení , Vnitřní spojení , Levá (vnější) spojení , Pravá (vnější) spojení a Úplná (vnější) spojení . Tato spojení jsou implementována napříč všemi relačními databázovými systémy a jsou popsána v následujících sekcích.
Poznámka Spojení lze provést na libovolném počtu tabulek v daném dotazu. Pro stručnost a srozumitelnost tato příručka pojednává o spojeních aplikovaných na dvě tabulky.
Tato příručka používá dvě tabulky, Employees
a Address
, respektive k demonstraci spojení SQL. Každá z těchto tabulek obsahuje následující definice sloupců a data:
-
Tabulka zaměstnanců
EmployeeId Jméno zaměstnance 1 Jan 2 Marie 3 Robert -
Tabulka adres
ID Stav 1 New York 2 New Jersey 3 Idaho 4 Havaj
Poznámka Pokud není uvedeno jinak, všechny příkazy v této příručce fungují dobře na obou MySQL a PostgreSQL databáze.
Křížová spojení SQL
Také známé jako Kartézské spojení , Křížová spojení nastanou, když zadáte více tabulek jako zdroj pro SELECT
seznam sloupců. V tomto případě vynecháte WHERE
výraz spojení klauzule pro shodu řádků. Sada výsledků obsahuje řádek pro každou kombinaci řádků mezi tabulkami. Ve scénáři se dvěma tabulkami je každý řádek v jedné tabulce spárován s každým řádkem druhé tabulky. Výsledný produkt je známý jako Kartézský produkt ze dvou tabulek. Syntaxe křížového spojení je následující:
(# Rows in Table A) TIMES (# of Rows in Table B)
PoznámkaV teorii množin je kartézský součin operace násobení, která generuje všechny uspořádané dvojice daných množin. Zvažte například sadu
A
s prvky{a,b}
a nastavteB
s prvky{1,2,3}
. Kartézský součinA
aB
je označenoAxB
a výsledek je následující:AxB ={(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}
Syntaxe SQL pro Cross Join je následující:
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM [Table_1]
CROSS JOIN [Table_2]
Z výše uvedené syntaxe Column_1
, Column_2
, Column_N
představují sloupce v tabulce a CROSS JOIN
klauzule slouží ke spojení dvou tabulek, Table_1
a Table_2
. Z příkladů výše uvedených tabulek, pokud potřebujete provést Cross Join u Employees
a Address
tabulky, použijte následující kód SQL:
SELECT EmployeeName, State
FROM Employees
CROSS JOIN Address
Výstup výše uvedeného kódu SQL se podobá následujícímu:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| John | New Jersey |
| John | Idaho |
| John | Hawaii |
| John | New York |
| Mary | New York |
| Mary | New Jersey |
| Mary | Idaho |
| Mary | Hawaii |
| Robert | New York |
| Robert | New Jersey |
| Robert | Idaho |
| Robert | Hawaii |
+------------+----------------+
Vnitřní spojení SQL
Vnitřní spojení vrátí řádky, které mají v obou tabulkách shodné hodnoty. Pokud neexistují žádné odpovídající záznamy, nebudou ve výsledcích vráceny žádné řádky.
Syntaxe SQL pro Inner Join je následující:
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM Table_1
INNER JOIN Table_2
ON Table_1.key = Table_2.key;
Ve výše uvedeném příkladu key
je příslušný klíč tabulek. Pokud potřebujete provést vnitřní spojení u Employees
a Address
tabulky, použijte následující kód SQL:
SELECT EmployeeName, State
FROM Employees
INNER JOIN Address
ON Employees.EmployeeId = Address.Id
Výstup výše uvedeného kódu SQL se podobá následujícímu:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
+------------+----------------+
Připojení k SQL vlevo (vnější)
Levé spojení vrátí kompletní sadu řádků z levé tabulky spolu s odpovídajícími řádky z pravé tabulky. Pokud neexistují žádné odpovídající záznamy, pak NULL
hodnoty jsou vráceny z pravé tabulky.
Poznámka Některé implementace relačních databází používají klíčová slova „Left Outer Join“ na rozdíl od „Left Join“, ale jsou funkčně ekvivalentní.
Syntaxe SQL pro Left Join je následující:
SELECT * FROM Table_1
LEFT JOIN Table_2
ON Table_1.key = Table_2.key
Ve výše uvedeném příkladu key
je příslušný klíč tabulek. Pokud potřebujete provést levé spojení u Employees
a Address
tabulky, použijte následující kód SQL:
SELECT EmployeeName, State
FROM Employees
LEFT JOIN Address
ON Employees.EmployeeId = Address.Id
Výstup výše uvedeného kódu SQL je následující:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
+------------+----------------+
Spojení s pravým (vnějším) SQL
Pravé spojení vrátí kompletní sadu řádků z pravé tabulky a odpovídající řádky z levé tabulky. Toto je také známé jako Right Outer Join. Pokud neexistují žádné odpovídající záznamy, pak NULL
hodnoty jsou vráceny z pravé tabulky pro dotčené řádky v levé tabulce.
Poznámka Některé implementace relačních databází používají klíčová slova „Right Outer Join“ na rozdíl od „Right Join“, ale jsou funkčně ekvivalentní.
Syntaxe SQL pro Right Join je následující:
SELECT * FROM Table_1
RIGHT JOIN Table_2
ON Table_1.key = Table_2.key
Z výše uvedeného kódu key
je příslušný klíč tabulek. Pokud potřebujete provést správné připojení k Employees
a Address
tabulky, použijte následující kód SQL:
SELECT EmployeeName, State
FROM Employees
RIGHT JOIN Address
ON Employees.EmployeeId = Address.Id
Výstup výše uvedeného kódu SQL je následující:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
Úplné (vnější) připojení k SQL
Úplné spojení vrátí všechny řádky z levé tabulky, všechny řádky z pravé tabulky. Toto je také známé jako úplné vnější spojení. Úplné spojení také vrátí všechny odpovídající záznamy z obou tabulek, pokud jsou k dispozici. Pokud neexistují žádné odpovídající záznamy, pak NULL
hodnoty jsou vráceny z levé tabulky. Vrátí také NULL
hodnoty z pravé tabulky.
Poznámka Některé implementace relačních databází používají klíčová slova „Full Outer Join“ na rozdíl od „Full Join“, ale jsou funkčně ekvivalentní.
Syntaxe SQL pro Full Join je následující:
SELECT * FROM Table1
FULL JOIN Table2
ON Table1.key = Table2.key
Ve výše uvedeném kódu key
je příslušný klíč tabulek. Pokud potřebujete provést úplné spojení s Employees
a Address
tabulky, použijte následující kód SQL:
SELECT EmployeeName, State
FROM Employees
FULL JOIN Address
ON Employees.EmployeeId = Address.Id
Výstup výše uvedeného kódu SQL je následující:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
Poznámka Pokud během výpočtů spojení porovnáte data tabulky sNULL
hodnoty se navzájem neshodují. ProtoNULL
hodnoty jsou vráceny pouze jako součást výsledků spojení a jsou ignorovány během výpočtů spojení.
Porovnání výkonu spojení SQL
Vzhledem k výše uvedeným příkladům tabulek je vnitřní spojení obvykle nejrychlejší z pěti klauzulí spojení z hlediska výkonu databáze. Left Join a Right Join jsou další nejrychlejší v závislosti na velikosti dvou stolů. Úplné spojení je obvykle pomalejší než levé spojení nebo pravé spojení. Cross Join, závislý na kartézském součinu dvou tabulek, je obvykle nejpomalejší z hlediska výkonu databáze. Zadaná hierarchie výkonu se může lišit v závislosti na délce sloupce tabulky, datovém typu sloupce a definicích klíčů.
Závěr
Použití SQL Joins rozšiřuje funkčnost možnosti porovnávat řádky tabulky oproti tradičnímu WHERE
klauzule dotazy. Spojení jsou cenným mechanismem pro aplikaci algebraické logiky na dvě nebo více tabulek.