Тази статия предоставя общ преглед на RIGHT JOIN
в SQL, както и някои основни примери.
Известен също като RIGHT OUTER JOIN
, RIGHT JOIN
връща редове, които имат данни в дясната таблица (вдясно от JOIN
ключова дума), дори ако в лявата таблица няма съвпадащи редове.
Синтаксис
Посочвате дясно присъединяване в FROM
клауза. Можете да използвате или RIGHT JOIN
или RIGHT OUTER JOIN
синтаксис.
Използване на RIGHT JOIN
синтаксис:
SELECT *
FROM Table1 RIGHT JOIN Table2
ON Table1.Column = Table2.Column;
Използване на RIGHT OUTER JOIN
синтаксис:
SELECT *
FROM Table1 RIGHT OUTER JOIN Table2
ON Table1.Column = Table2.Column;
И двете правят абсолютно едно и също нещо. Просто OUTER
ключовата дума не е задължителна.
Примери
Ето няколко примера за демонстрация.
Примерни данни
Първо, ето таблиците, които ще използваме за примерите.
PetTypes
таблица:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
таблица:
+---------+-------------+-----------+-----------+------------+ | 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
таблица:
+-----------+-------------+------------+----------------+-------------------+ | 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] | +-----------+-------------+------------+----------------+-------------------+
Имайте предвид, че:
PetTypeId
колона наPets
таблицата е външен ключ наPetTypeId
наPetTypes
таблица (което е първичният ключ на тази таблица).OwnerId
колона наPets
таблицата е външен ключ наOwnerId
колона наOwners
маса.
Правилната заявка за присъединяване
Ето пример за извършване на дясно свързване срещу две от тези таблици.
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Резултат:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Правилното присъединяване ни кара да получим PetType
стойност, която не съответства на PetName
. По-конкретно, няма зайци като домашни любимци. Но правилното присъединяване причинява Rabbit
да бъдат върнати, въпреки че в Pets
няма домашен любимец таблица от този тип. Това води до NULL
стойност в PetName
колона срещу Rabbit
.
Това се случи само защото Rabbit
беше в дясната таблица (т.е. вдясно от RIGHT JOIN
ключови думи).
Ето какво се случва, ако променим реда на таблицата в нашата заявка.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
RIGHT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Резултат:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Този път Rabbits
не е върнат. Това е така, защото неговата таблица (PetTypes
) беше от лявата страна на съединението.
Ще трябва да го променим на ляво или пълно присъединяване, ако искаме Rabbits
да бъдат върнати с помощта на този ред на таблицата.
Дясно присъединяване на 3 таблици
Ето пример за извършване на дясно присъединяване и на трите маси.
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;
Резултат:
+-----------+-----------+----------------+ | 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)
Този път имаме собственик на домашен любимец, който няма домашен любимец.
Бихме могли отново да разместим подредбата на масите и да получим различен резултат.
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;
Резултат:
+-----------+-----------+---------------+ | 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)
Този път получихме допълнителния тип домашен любимец (Rabbit
), но не и допълнителния собственик.
Ако се чудите защо последният PetOwner
не е NULL
(като последното PetName
е), защото е резултат от конкатенация на низове. Използвах T-SQL CONCAT()
функция за свързване на името и фамилията на собственика.