sql >> Databáze >  >> RDS >> Database

SQL Natural Join

Tento článek poskytuje přehled přirozeného spojení v SQL a také několik základních příkladů.

Co je to přirozené spojení?

Přirozené spojení SQL je typ ekvi-spojení, které implicitně kombinuje tabulky založené na sloupcích se stejným názvem a typem. Predikát spojení vzniká implicitně porovnáním všech sloupců v obou tabulkách, které mají ve spojených tabulkách stejné názvy sloupců.

Sada výsledků obsahuje pouze jeden sloupec pro každou dvojici stejně pojmenovaných sloupců. Pokud nebudou nalezeny žádné sloupce se stejnými názvy, výsledkem bude křížové spojení.

Syntaxe

Přirozené spojení lze použít na jakýkoli INNER , LEFT , RIGHT , nebo FULL připojit. Jednoduše před typ spojení přidáte NATURAL klíčové slovo.

Příklad syntaxe použité pro vnitřní spojení:

SELECT *
FROM Table1 NATURAL INNER JOIN Table2 
ON Table1.Column = Table2.Column;

Vidíte jako INNER je výchozí hodnota, můžete to udělat také takto:

SELECT *
FROM Table1 NATURAL JOIN Table2 
ON Table1.Column = Table2.Column;

NATURAL klíčové slovo umístí implicitní USING klauzule k omezením spojení. Tvoří USING seznam obsahující všechny názvy sloupců, které se objevují v obou vstupních tabulkách. To samozřejmě platí pouze pro DBMS, které podporují USING doložka.

Ne všechny DBMS podporují přirozená spojení, takže se podívejte do dokumentace vašeho DBMS.

Když píšu toto, přirozené spojení jsou podporovány v PostgreSQL, MySQL, MariaDB, SQLite a Oracle. Přirozená spojení však nejsou podporována v SQL Server (2019).

Příklady

Zde je několik příkladů k demonstraci.

Ukázková data

Za prvé, zde jsou tabulky, které použijeme pro příklady.

PetTypes tabulka:

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Pets tabulka:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Owners tabulka:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Simpson    | (489) 591-0408 | NULL              |
| 4         | Boris       | Trump      | (349) 611-8908 | NULL              |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

Všimněte si, že:

  • PetTypeId ve sloupci Pets tabulka je cizí klíč PetTypeId z PetTypes tabulka (což je primární klíč této tabulky).
  • OwnerId ve sloupci Pets tabulka je cizí klíč OwnerId ve sloupci Owners stůl.

Příklad 1 – Přirozené vnitřní spojení

Zde je příklad provedení přirozeného vnitřního spojení proti dvěma z těchto tabulek.

SELECT 
    PetName,
    PetType
FROM Pets
NATURAL JOIN PetTypes;

Výsledek:

 petname | pettype 
---------+---------
 Fluffy  | Cat
 Fetch   | Dog
 Scratch | Cat
 Wag     | Dog
 Tweet   | Bird
 Fluffy  | Dog
 Bark    | Dog
 Meow    | Cat
(8 rows)

V tomto příkladu přirozené spojení implicitně spojilo tabulky na dvou PetTypeId (tj. Pets.PetTypeId a PetTypes.PetTypeId sloupec).

Toto je implicitní způsob, jak provést následující:

SELECT 
    PetName,
    PetType
FROM Pets
INNER JOIN PetTypes USING (PetTypeId);

Což ve skutečnosti dělá následující.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId;

Příklad 2 – Přirozené správné spojení

Zde je příklad provedení přirozeného pravého spojení proti dvěma z těchto tabulek. Tentokrát musíme určit typ spojení, protože nechceme (výchozí) vnitřní spojení.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
NATURAL RIGHT JOIN PetTypes pt;

Výsledek:

 petname | pettype 
---------+---------
 Fluffy  | Cat
 Fetch   | Dog
 Scratch | Cat
 Wag     | Dog
 Tweet   | Bird
 Fluffy  | Dog
 Bark    | Dog
 Meow    | Cat
         | Rabbit
(9 rows)

V tomto případě je to stejné jako následující:

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId;

Příklad 3 – Přirozené úplné spojení na 3 stolech

Zde je příklad provedení přirozeného úplného spojení na všech třech stolech.

SELECT 
    PetName,
    PetType,
    CONCAT(FirstName, ' ', LastName) AS PetOwner
FROM Owners NATURAL FULL JOIN Pets
NATURAL FULL JOIN PetTypes;

Výsledek:

 petname | pettype |    petowner    
---------+---------+----------------
 Fluffy  | Cat     | Nancy Simpson
 Fetch   | Dog     | Nancy Simpson
 Scratch | Cat     | Bart Pitt
 Wag     | Dog     | Nancy Simpson
 Tweet   | Bird    | Homer Connery
 Fluffy  | Dog     | Boris Trump
 Bark    | Dog     | Bart Pitt
 Meow    | Cat     | Boris Trump
         |         | Woody Eastwood
         | Rabbit  |  
(10 rows)

Tentokrát máme majitele domácího mazlíčka, který nemá domácího mazlíčka, a také typ zvířete, který není přiřazen k domácímu mazlíčkovi.

Příklad 4 – Použití hvězdičky (* ) Zástupný znak

Zde je příklad, který používá zástupný znak hvězdičky (*) k výběru všech sloupců.

SELECT *
FROM Pets
NATURAL JOIN PetTypes;

Výsledek:

 pettypeid | petid | ownerid | petname |    dob     | pettype 
-----------+-------+---------+---------+------------+---------
         2 |     1 |       3 | Fluffy  | 2020-11-20 | Cat
         3 |     2 |       3 | Fetch   | 2019-08-16 | Dog
         2 |     3 |       2 | Scratch | 2018-10-01 | Cat
         3 |     4 |       3 | Wag     | 2020-03-15 | Dog
         1 |     5 |       1 | Tweet   | 2020-11-28 | Bird
         3 |     6 |       4 | Fluffy  | 2020-09-17 | Dog
         3 |     7 |       2 | Bark    |            | Dog
         2 |     8 |       4 | Meow    |            | Cat
(8 rows)

Všimněte si, že pettypeid sloupec je vrácen pouze jednou, i když existují dva sloupce s tímto názvem (jeden v každé tabulce). Takto se přirozená spojení zabývají sloupci stejného jména napříč tabulkami.


  1. Primární klíč SQL

  2. Překlad dat Salesforce do formátu EDI

  3. Redundance N+1 a konsolidace serverů

  4. Jak importovat excelový soubor do databáze MySQL