Tento článek poskytuje přehled RIGHT JOIN
v SQL a také některé základní příklady.
Také známý jako RIGHT OUTER JOIN
, RIGHT JOIN
vrátí řádky, které mají data v pravé tabulce (vpravo od JOIN
klíčové slovo), i když v levé tabulce nejsou žádné odpovídající řádky.
Syntaxe
Pravé spojení určíte v FROM
doložka. Můžete použít buď RIGHT JOIN
nebo RIGHT OUTER JOIN
syntaxe.
Pomocí RIGHT JOIN
syntaxe:
SELECT *
FROM Table1 RIGHT JOIN Table2
ON Table1.Column = Table2.Column;
Pomocí RIGHT OUTER JOIN
syntaxe:
SELECT *
FROM Table1 RIGHT 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 | 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 sloupciPets
tabulka je cizí klíčPetTypeId
zPetTypes
tabulka (což je primární klíč této tabulky).OwnerId
ve sloupciPets
tabulka je cizí klíčOwnerId
ve sloupciOwners
stůl.
Správný dotaz na připojení
Zde je příklad provedení správného spojení proti dvěma z těchto tabulek.
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Výsledek:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Správné spojení způsobí, že získáme PetType
hodnota, která neodpovídá PetName
. Konkrétně nejsou králíci jako domácí mazlíčci. Ale správné 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
.
Stalo se to jen proto, že Rabbit
byl v pravé tabulce (tj. vpravo od RIGHT JOIN
klíčová slova).
Co se stane, když v našem dotazu změníme pořadí tabulky.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
RIGHT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Výsledek:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Tentokrát Rabbits
nebyl vrácen. Je to proto, že jeho tabulka (PetTypes
) byl na levé straně spojení.
Pokud bychom chtěli Rabbits
, museli bychom to změnit na levé spojení nebo úplné spojení které mají být vráceny pomocí této tabulky.
Správné spojení na 3 stolech
Zde je příklad provedení správného spojení na všech třech stolech.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
RIGHT JOIN Owners o
ON p.OwnerId = o.OwnerId;
Výsledek:
+-----------+-----------+----------------+ | PetName | PetType | PetOwner | |-----------+-----------+----------------| | Tweet | Bird | Homer Connery | | Scratch | Cat | Bart Pitt | | Bark | Dog | Bart Pitt | | Fluffy | Cat | Nancy Simpson | | Fetch | Dog | Nancy Simpson | | Wag | Dog | Nancy Simpson | | Fluffy | Dog | Boris Trump | | Meow | Cat | Boris Trump | | NULL | NULL | Woody Eastwood | +-----------+-----------+----------------+ (9 rows affected)
Tentokrát máme majitele domácího mazlíčka, který žádné zvíře nemá.
Mohli bychom znovu zamíchat pořadím stolů a dostali bychom jiný výsledek.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o
ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Výsledek:
+-----------+-----------+---------------+ | PetName | PetType | PetOwner | |-----------+-----------+---------------| | Tweet | Bird | Homer Connery | | Fluffy | Cat | Nancy Simpson | | Scratch | Cat | Bart Pitt | | Meow | Cat | Boris Trump | | Fetch | Dog | Nancy Simpson | | Wag | Dog | Nancy Simpson | | Fluffy | Dog | Boris Trump | | Bark | Dog | Bart Pitt | | NULL | Rabbit | | +-----------+-----------+---------------+ (9 rows affected)
Tentokrát jsme dostali extra typ domácího mazlíčka (Rabbit
), ale ne další vlastník.
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.