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

Plné připojení k SQL

Tento článek poskytuje přehled FULL JOIN v SQL a také některé základní příklady.

SQL FULL JOIN (nebo FULL OUTER JOIN ) vrátí všechny řádky, pokud jsou v jedné z tabulek odpovídající data.

Je to jako mít oba spojení zleva doprava do jednoho spojení.

Syntaxe

Úplné spojení určíte v FROM doložka. Můžete použít buď FULL JOIN nebo FULL OUTER JOIN syntaxe.

Pomocí FULL JOIN syntaxe:

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

Pomocí FULL OUTER JOIN syntaxe:

SELECT *
FROM Table1 FULL OUTER JOIN Table2 
ON Table1.Column = Table2.Column; 

Oba dělají přesně to samé. Jde jen o to, že OUTER klíčové slovo je nepovinné.

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 | Pták || 2 | Kočka || 3 | Pes || 4 | Králík |+-------------+-----------+ (dotčené 4 řádky)

Pets tabulka:

+---------+-------------+-----------+---------- -+-------------+| PetId | PetTypeId | OwnerId | Jméno mazlíčka | DOB ||---------+-------------+-----------+------------ +------------|| 1 | 2 | 3 | Načechraný | 2020-11-20 || 2 | 3 | 3 | Načíst | 2019-08-16 || 3 | 2 | 2 | Škrábnout | 2018-10-01 || 4 | 3 | 3 | Wag | 2020-03-15 || 5 | 1 | 1 | Tweet | 2020-11-28 || 6 | 3 | 4 | Načechraný | 2020-09-17 || 7 | 3 | 2 | Kůra | NULL || 8 | 2 | 4 | Mňau | NULL |+---------+-------------+-----------+----------- +------------+(8 řádků ovlivněno)

Owners tabulka:

+-----------+-------------+------------+------- ---------+-------------------+| OwnerId | Jméno | Příjmení | Telefon | E-mail ||-----------+-------------+------------+--------- --------+-------------------|| 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.

Úplný dotaz na připojení

Zde je příklad provedení úplného spojení proti dvěma z těchto tabulek.

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

Výsledek:

+-----------+-----------+| Jméno mazlíčka | PetType ||-----------+-----------|| Tweet | Pták || Načechraný | Kočka || Škrábnout | Kočka || Mňau | Kočka || Načíst | Pes || Wag | Pes || Načechraný | Pes || Kůra | Pes || NULL | Králík |+-----------+-----------+ (dotčených 9 řádků)

V tomto příkladu dostaneme PetType hodnota, která neodpovídá PetName . Je to proto, že nejsou žádní králíci jako domácí mazlíčci. Ale úplné spojení způsobí Rabbit být vrácen, i když v Pets není žádné zvíře stůl tohoto typu. Výsledkem je NULL hodnotu v PetName sloupec proti Rabbit .

To je stejný výsledek, jaký bychom dostali, kdybychom použili správné spojení, protože PetTypes tabulka je napravo od JOIN klíčové slovo. To by se s levým spojením nestalo, protože PetTypes tabulka není vlevo od JOIN klíčové slovo. Pokud bychom jej chtěli znovu vytvořit s levým spojením, museli bychom změnit pořadí tabulek tak, aby PetTypes tabulka byla nalevo od JOIN klíčové slovo.

Zde je to, co se stane, když změníme pořadí tabulky v našem dotazu při použití úplného spojení.

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

Výsledek:

+-----------+-----------+| Jméno mazlíčka | PetType ||-----------+-----------|| Tweet | Pták || Načechraný | Kočka || Škrábnout | Kočka || Mňau | Kočka || Načíst | Pes || Wag | Pes || Načechraný | Pes || Kůra | Pes || NULL | Králík |+-----------+-----------+ (dotčených 9 řádků)

Dostaneme úplně stejný výsledek. Je to proto, že úplné spojení vrátí všechny řádky, pokud jsou v jedné z tabulek odpovídající data. Jak již bylo zmíněno, je to jako mít levé a pravé spojení v jednom spojení.

Úplné připojení u 3 stolů

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

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
    ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId; 

Výsledek:

+-----------+-----------+----------------+| Jméno mazlíčka | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Pták | Homer Connery || Škrábnout | Kočka | Bart Pitt || Kůra | Pes | Bart Pitt || Načechraný | Kočka | Nancy Simpson || Načíst | Pes | Nancy Simpson || Wag | Pes | Nancy Simpson || Načechraný | Pes | Boris Trump || Mňau | Kočka | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Králík | |+-----------+-----------+----------------+(10 dotčených řádků) 

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.

Pokud zamícháme pořadí tabulek, dostaneme stejný výsledek, i když řádky jsou uvedeny v jiném pořadí.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM PetTypes pt FULL JOIN Pets p
    ON p.PetTypeId = pt.PetTypeId
FULL JOIN Owners o 
    ON p.OwnerId = o.OwnerId; 

Výsledek:

-----------+-----------+----------------+| Jméno mazlíčka | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Pták | Homer Connery || Načechraný | Kočka | Nancy Simpson || Škrábnout | Kočka | Bart Pitt || Mňau | Kočka | Boris Trump || Načíst | Pes | Nancy Simpson || Wag | Pes | Nancy Simpson || Načechraný | Pes | Boris Trump || Kůra | Pes | Bart Pitt || NULL | Králík | || NULL | NULL | Woody Eastwood |+-----------+-----------+----------------+(10 dotčených řádků) 

A pokud je ještě jednou zamícháme, dostaneme stále stejný výsledek.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p FULL JOIN Owners o
    ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId; 

Výsledek:

+-----------+-----------+----------------+| Jméno mazlíčka | PetType | PetOwner ||-----------+-----------+----------------|| Načechraný | Kočka | Nancy Simpson || Načíst | Pes | Nancy Simpson || Škrábnout | Kočka | Bart Pitt || Wag | Pes | Nancy Simpson || Tweet | Pták | Homer Connery || Načechraný | Pes | Boris Trump || Kůra | Pes | Bart Pitt || Mňau | Kočka | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Králík | |+-----------+-----------+----------------+(10 dotčených řádků) 

Pokud vás zajímá, proč poslední PetOwner není NULL (jako poslední PetName je), je to proto, že je výsledkem zřetězení řetězců. Použil jsem T-SQL CONCAT() funkce ke zřetězení jména a příjmení vlastníka.


  1. Dotaz na výpočet kumulativního i celkového SUMU nad mzdou

  2. Oracle:Existuje způsob, jak získat nedávné chyby syntaxe SQL?

  3. 2 Ukázkové databáze pro SQLite

  4. Neznámý sloupec MySQL v klauzuli ON