Database
 sql >> база данни >  >> RDS >> Database

SQL Право присъединяване

Тази статия предоставя общ преглед на 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() функция за свързване на името и фамилията на собственика.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка при оценката на кардиналността на подзаявката

  2. Проучване на грешка ORA 028513 DG4ODBC

  3. Рецензия на книгата:Бенджамин Неварез:Настройка и оптимизация на заявки

  4. Често срещани задачи на Postgres на CentOS 7

  5. Структуриран език за заявки – Значението на изучаването на SQL