Den här artikeln ger en översikt över RIGHT JOIN
i SQL, samt några grundläggande exempel.
Även känd som RIGHT OUTER JOIN
, RIGHT JOIN
returnerar rader som har data i den högra tabellen (till höger om JOIN
sökord), även om det inte finns några matchande rader i den vänstra tabellen.
Syntax
Du anger en rättighetskoppling i FROM
klausul. Du kan använda antingen RIGHT JOIN
eller RIGHT OUTER JOIN
syntax.
Använd RIGHT JOIN
syntax:
SELECT *
FROM Table1 RIGHT JOIN Table2
ON Table1.Column = Table2.Column;
Använda RIGHT OUTER JOIN
syntax:
SELECT *
FROM Table1 RIGHT OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Båda dessa gör exakt samma sak. Det är bara att OUTER
nyckelordet är valfritt.
Exempel
Här är några exempel att visa.
Exempeldata
Först, här är tabellerna vi ska använda för exemplen.
PetTypes
tabell:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
tabell:
+---------+-------------+-----------+-----------+------------+ | 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
tabell:
+-----------+-------------+------------+----------------+-------------------+ | 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] | +-----------+-------------+------------+----------------+-------------------+
Observera att:
PetTypeId
kolumnen iPets
tabellen är en främmande nyckel förPetTypeId
avPetTypes
tabell (som är den primära nyckeln för den tabellen).OwnerId
kolumnen iPets
tabellen är en främmande nyckel förOwnerId
kolumnen iOwners
tabell.
Rätt anslutningsfråga
Här är ett exempel på hur man utför en högerkoppling mot två av dessa tabeller.
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Rätt koppling gör att vi får en PetType
värde som inte överensstämmer med ett PetName
. Specifikt finns det inga kaniner som husdjur. Men rätt join orsakar Rabbit
ska returneras, även om det inte finns något husdjur i Pets
bord av den typen. Detta resulterar i en NULL
värde i PetName
kolumn mot Rabbit
.
Detta hände bara för att Rabbit
fanns i den högra tabellen (dvs till höger om RIGHT JOIN
nyckelord).
Det här är vad som händer om vi ändrar tabellordningen i vår fråga.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
RIGHT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Den här gången Rabbits
returnerades inte. Det beror på att dess tabell (PetTypes
) var på vänster sida av sammanfogningen.
Vi skulle behöva ändra det till en vänsterkoppling eller en fullständig koppling om vi ville ha Rabbits
ska returneras med denna bordsordning.
Rätt gå med på 3 bord
Här är ett exempel på hur man utför en högerkoppling på alla tre borden.
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;
Resultat:
+-----------+-----------+----------------+ | 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)
Den här gången har vi en husdjursägare som inte har ett husdjur.
Vi kunde återigen blanda ordningen på borden och vi skulle få ett annat resultat.
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;
Resultat:
+-----------+-----------+---------------+ | 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)
Den här gången fick vi den extra husdjurstypen (Rabbit
), men inte den extra ägaren.
Om du undrar varför den senaste PetOwner
är inte NULL
(som sist PetName
är), det beror på att det är ett resultat av en strängsammansättning. Jag använde T-SQL CONCAT()
funktion för att sammanfoga ägarens för- och efternamn.