sql >> Databáze >  >> RDS >> Mysql

Úvod do SQL spojení

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ámka

V 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 nastavte B s prvky {1,2,3} . Kartézský součin A a B je označeno AxB 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 s NULL hodnoty se navzájem neshodují. Proto NULL 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.


  1. Jak mohu spustit PostgreSQL server na Mac OS X?

  2. Nejjednodušší způsob, jak přidat více mezer do řetězce v MySQL – SPACE()

  3. postgres sloupec X neexistuje

  4. Přidání dalších datových úložišť do Microsoft Power BI