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

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

Тази статия предоставя общ преглед на LEFT JOIN в SQL, както и някои основни примери.

LEFT JOIN , или LEFT OUTER JOIN , връща редове, които имат данни в лявата таблица (вляво от JOIN ключова дума), дори ако в дясната таблица няма съвпадащи редове.

Синтаксис

Посочвате ляво присъединяване в FROM клауза. Можете да използвате или LEFT JOIN или LEFT OUTER JOIN синтаксис.

Използване на LEFT JOIN синтаксис:

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

Използване на LEFT OUTER JOIN синтаксис:

SELECT *
FROM Table1 LEFT 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 PetTypes pt
LEFT JOIN Pets p
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 беше в лявата таблица (т.е. вляво от LEFT JOIN ключови думи). Добре, моето форматиране го прави повече „отгоре“, отколкото „вляво“, но получавате картината.

Ето какво се случва, ако променим реда на таблицата в нашата заявка.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
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 Owners o LEFT JOIN Pets p
    ON p.OwnerId = o.OwnerId
LEFT JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId;

Резултат:

+-----------+-----------+----------------+
| 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 PetTypes pt LEFT JOIN Pets p
    ON p.PetTypeId = pt.PetTypeId
LEFT JOIN Owners o 
    ON p.OwnerId = o.OwnerId;

Резултат:

+-----------+-----------+---------------+
| 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. SQL, Обработка на празни клетки

  2. Мръсни тайни на израза CASE

  3. Моделиране на база данни за записване на продажби. Част 1

  4. Преименуване на Pluggable база данни

  5. Как да изчислим пълзящата средна в червено изместване