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

Присъединете се към 3 таблици в SQL

В SQL можете да присъедините три или повече таблици, като добавите още едно присъединяване след първото.

Можете също да изпълнявате вложени обединения, като посочите едно обединение като условие за присъединяване за друго.

Синтаксис

Най-често срещаният начин за свързване на три таблици е нещо подобно:

ИЗБЕРЕТЕ *ОТ Table1 INNER JOIN Table2 ON УсловиеINNER JOIN Table3 ON; 

Това използва вътрешно присъединяване, но можете да посочите желания тип на присъединяване, както при всяко друго присъединяване. Можете също да комбинирате типове присъединяване, ако е необходимо (пример по-долу).

Можете също да използвате вложени съединения, като посочите едно присъединяване като условие за присъединяване за друго присъединяване. Като това:

ИЗБЕРЕТЕ *ОТ Таблица1 ПРИСЪЕДИНЕТЕ (Условие ВКЛЮЧЕНО ПРИСЪЕДИНЯВАНЕ на Таблица2, Таблица3) Включено; 

Примерни данни – 3-те таблици

Да предположим, че имаме следните три таблици.

Клиентите таблица:

+--------------+----------------+-------------- --+----------------+| Идентификатор на клиента | Име на клиента | PostalCityId | Телефонен номер ||--------------+----------------+--------------- -+----------------|| 1 | Хоумър Макензи | 19586 | (308) 555-0100 || 2 | Мардж Прат | 33475 | (406) 555-0100 || 3 | Влад Бернанке | NULL | (480) 555-0100 || 4 | Барт Пит | 21692 | (316) 555-0100 || 5 | Лиза Маккуин | 12748 | (212) 555-0100 || 6 | Стив Симпсън | 17054 | (701) 555-0100 || 7 | Вин Алън | 12152 | (423) 555-0100 || 8 | Виджей Смит | 3673 | (303) 555-0100 || 9 | Кейси Чин | 23805 | (201) 555-0100 || 10 | Борат Лий | 37403 | (701) 555-0100 |+--------------+----------------+--------- ------+----------------+(10 засегнати реда)

Градовете таблица:

+---------+----------------+------------------ -+--------------+| CityId | Име на град | StateProvinceId | Население ||----------+----------------+------------------ +--------------|| 3673 | Поклон Мар | 6 | 866 || 12152 | Франкеуинг | 44 | NULL || 12748 | Газпорт | 33 | 1248 || 21692 | Медицинска хижа | 17 | 2009 г. || 26483 | Долината Пийпълс | 3 | 428 || 33475 | Силванит | 27 | 103 || 17054 | Джеси | 35 | 25 || 19586 | Лиско | 28 | NULL || 37403 | Уимбълдън | 35 | 216 |+----------+----------------+------------------- +--------------+(9 засегнати реда)

StateProvinces таблица:

+-------------------+---------------------+---- ------------------+------------+--------------+| StateProvinceId | Код на провинция | Име на провинция | CountryId | Население ||-------------------+---------------------+----- ----------------+------------+--------------|| 3 | AZ | Аризона | 230 | 6891688 || 6 | CO | Колорадо | 230 | 5698265 || 17 | KS | Канзас | 230 | 2893957 || 28 | NE | Небраска | 230 | 1943256 || 31 | Ню Джърси | Ню Джърси | 230 | 8899339 || 33 | Ню Йорк | Ню Йорк | 230 | 20437172 || 35 | ND | Северна Дакота | 230 | 723393 || 44 | TN | Тенеси | 230 | 6495978 |+-------------------+---------------------+----- ----------------+------------+--------------+(засегнати 8 реда )

Пример 1 – Вътрешно свързване на 3 таблици

Най-популярният тип присъединяване е вътрешното съединение, така че ще започнем с него.

Ето пример за свързване на горните три таблици с две вътрешни съединения.

SELECT s.StateProvinceName, ci.CityName, cu.CustomerNameFROM StateProvinces SINNER JOIN Градове КАТО ciON ci.StateProvinceID =s.StateProvinceIDINNER JOIN Клиенти cu ON cu.PostalCityId =ci. 

Резултат:

+---------------------+----------------+------- ---------+| Име на провинция | Име на град | Име на клиента ||---------------------+----------------+-------- --------|| Небраска | Лиско | Хоумър Макензи || Канзас | Медицинска хижа | Барт Пит || Ню Йорк | Газпорт | Лиза Маккуин || Северна Дакота | Джеси | Стив Симпсън || Тенеси | Франкеуинг | Вин Алън || Колорадо | Поклон Мар | Виджей Смит || Северна Дакота | Уимбълдън | Борат Лий |+---------------------+----------------+------- ---------+(7 реда засегнати)

Пример 2 – Комбиниране на типове присъединяване

Можете да комбинирате типове присъединяване, когато обединявате три или повече таблици.

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

ИЗБЕРЕТЕ s.StateProvinceName, ci.CityName, cu.CustomerNameFROM StateProvinces SINNER JOIN Градове КАТО ciON ci.StateProvinceID =s.StateProvinceIDLEFT JOIN Клиенти cu ON cu.PostalCityId =ci; 

Резултат:

---------------------+----------------+-------- --------+| Име на провинция | Име на град | Име на клиента ||---------------------+----------------+-------- --------|| Колорадо | Поклон Мар | Виджей Смит || Тенеси | Франкеуинг | Вин Алън || Ню Йорк | Газпорт | Лиза Маккуин || Канзас | Медицинска хижа | Барт Пит || Аризона | Долината Пийпълс | NULL || Северна Дакота | Джеси | Стив Симпсън || Небраска | Лиско | Хоумър Макензи || Северна Дакота | Уимбълдън | Борат Лий |+---------------------+----------------+------- ---------+(засегнати 8 реда)

В този случай имаме град (Peeples Valley), който все още няма клиенти.

Причината, поради която сега можем да видим тази информация, е, че лявото присъединяване връща редове, които имат данни в лявата таблица, дори ако в лявата таблица няма съвпадащи редове.

Предишният пример, който комбинира две вътрешни свързвания, не върна този ред, тъй като вътрешните съединения отхвърлят несъответстващи редове от двете таблици. Той връща редове само когато има поне един ред и в двете таблици, който отговаря на условието за присъединяване.

Нови примерни данни – 3 различни таблици

За останалите примери ще използваме следните таблици.

PetTypes таблица:

+------------+-----------+| PetTypeId | PetType ||-------------+-----------|| 1 | Птица || 2 | Котка || 3 | Куче || 4 | Заек |+------------+-----------+(4 реда засегнати)

Домашни любимци таблица:

+--------+------------+-----------+---------- -+-----------+| PetId | PetTypeId | Id на собственик | Име на домашни любимци | DOB ||---------+------------+-----------+----------- +-----------|| 1 | 2 | 3 | Пухкави | 20.11.2020 || 2 | 3 | 3 | Вземи | 2019-08-16 || 3 | 2 | 2 | Надраскване | 01.10.2018 || 4 | 3 | 3 | Размахване | 2020-03-15 || 5 | 1 | 1 | Tweet | 28.11.2020 || 6 | 3 | 4 | Пухкави | 17.09.2020 || 7 | 3 | 2 | Кора | NULL || 8 | 2 | 4 | Мяу | NULL |+--------+------------+-----------+----------- +-----------+(8 засегнати реда)

Собствениците таблица:

+-----------+------------+-----------+------- ---------+------------------+| Id на собственик | Име | Фамилия | Телефон | Имейл ||-----------+------------+-----------+-------- --------+------------------|| 1 | Омир | Конъри | (308) 555-0100 | [email protected] || 2 | Барт | Пит | (231) 465-3497 | [email protected] || 3 | Нанси | Симпсън | (489) 591-0408 | NULL || 4 | Борис | Тръмп | (349) 611-8908 | NULL || 5 | Уди | Истууд | (308) 555-0112 | [email protected] |+-----------+------------+------------+---- ------------+-------------------+

Имайте предвид, че:

  • PetTypeId колона на Домашни любимци таблицата е външен ключ на PetTypeId на PetTypes таблица (което е първичният ключ на тази таблица).
  • OwnerId колона на Домашни любимци таблицата е външен ключ на OwnerId колона на Собственици маса.

Пример 3 – Ляво свързване на 3 таблици

Нека направим обединяване на три таблици, използвайки две леви обединявания.

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

ИЗБЕРЕТЕ p.PetName, pt.PetType, CONCAT(o.FirstName, ' , o.LastName) КАТО PetOwnerFROM Owners o LEFT JOIN Pets p ON p.OwnerId =o.OwnerIdLEFT JOIN PetTypes pt ON p. PetTypeId =pt.PetTypeId; 

Резултат:

+-----------+-----------+----------------+| Име на домашни любимци | PetType | Собственик на домашни любимци ||-----------+----------+----------------|| Tweet | Птица | Хоумър Конъри || Надраскване | Котка | Барт Пит || Кора | Куче | Барт Пит || Пухкави | Котка | Нанси Симпсън || Вземи | Куче | Нанси Симпсън || Размахване | Куче | Нанси Симпсън || Пухкави | Куче | Борис Тръмп || Мяу | Котка | Борис Тръмп || NULL | NULL | Уди Истууд |+-----------+----------+----------------+(9 реда засегнати) 

Тук имаме собственик на домашен любимец, който няма домашен любимец. Можем да проверим това, като погледнем Pets.OwnerId колона и виждайки, че няма стойност, която да съответства на OwnerId на Уди Истууд в Собственици таблица.

Пример 4 – Дясно свързване на 3 таблици

Дясното съединение е противоположно на лявото съединение. Ето пример за използване на същите три таблици.

ИЗБЕРЕТЕ p.PetName, pt.PetType, CONCAT(o.FirstName, ' , o.LastName) AS PetOwnerFROM Pets p RIGHT JOIN Owners o ON p.OwnerId =o.OwnerIdRIGHT JOIN PetTypes pt ON p. PetTypeId =pt.PetTypeId; 

Резултат:

+-----------+-----------+--------------+| Име на домашни любимци | PetType | Собственик на домашни любимци ||-----------+----------+---------------|| Tweet | Птица | Хоумър Конъри || Пухкави | Котка | Нанси Симпсън || Надраскване | Котка | Барт Пит || Мяу | Котка | Борис Тръмп || Вземи | Куче | Нанси Симпсън || Размахване | Куче | Нанси Симпсън || Пухкави | Куче | Борис Тръмп || Кора | Куче | Барт Пит || NULL | Заек | |+----------+-----------+--------------+(9 реда засегнати)

Този път имаме допълнителен тип домашен любимец (Заек ), но не и допълнителният собственик. Това е така, защото дясното обединява връща редове, които имат данни в дясната таблица, дори ако няма съвпадащи редове в лявата таблица.

Между другото, причината е последният PetOwner не е NULL (като последното PetName е) е, защото е резултат от конкатенация на низове. Използвах T-SQL CONCAT() функция за свързване на името и фамилията на собственика.

Пример 5 – Пълно присъединяване на 3 таблици

Пълното присъединяване е като ляво и дясно присъединяване в едно. Връща всички редове, стига да има съвпадащи данни в една от таблиците.

ИЗБЕРЕТЕ p.PetName, pt.PetType, CONCAT(o.FirstName, ' , o.LastName) КАТО PetOwnerFROM собственици o ПЪЛНО ПРИСЪЕДИНЕНИЕ Домашни любимци p ON p.OwnerId =o.OwnerIdFULL JOIN PetTypes pt ON p. PetTypeId =pt.PetTypeId; 

Резултат:

+-----------+-----------+----------------+| Име на домашни любимци | PetType | Собственик на домашни любимци ||-----------+----------+----------------|| Tweet | Птица | Хоумър Конъри || Надраскване | Котка | Барт Пит || Кора | Куче | Барт Пит || Пухкави | Котка | Нанси Симпсън || Вземи | Куче | Нанси Симпсън || Размахване | Куче | Нанси Симпсън || Пухкави | Куче | Борис Тръмп || Мяу | Котка | Борис Тръмп || NULL | NULL | Уди Истууд || NULL | Заек | |+----------+-----------+----------------+(10 засегнати реда) 

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

Пример 6 – Вложени присъединявания

Както споменахме, можете също да правите вложени съединения.

Ето пример за вложено присъединяване.

ИЗБЕРЕТЕ p.PetName, pt.PetType, CONCAT(o.FirstName, ' , o.LastName) КАТО PetOwnerFROM Owners o LEFT JOIN (Домашни любимци p LEFT JOIN PetTypes pt ON p.PetTypeId =pt.Pet)Ty ON p.OwnerId =o.OwnerId; 

Резултат:

+-----------+-----------+----------------+| Име на домашни любимци | PetType | Собственик на домашни любимци ||-----------+----------+----------------|| Tweet | Птица | Хоумър Конъри || Надраскване | Котка | Барт Пит || Кора | Куче | Барт Пит || Пухкави | Котка | Нанси Симпсън || Вземи | Куче | Нанси Симпсън || Размахване | Куче | Нанси Симпсън || Пухкави | Куче | Борис Тръмп || Мяу | Котка | Борис Тръмп || NULL | NULL | Уди Истууд |+-----------+----------+----------------+(9 реда засегнати) 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Работа с Java данни в Qlik Sense

  2. Трябва ли да използвам NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT или NOT EXISTS?

  3. Топ 10 причини защо трябва да научите SQL

  4. Разбиране какво наистина актуализира sp_updatestats

  5. Мигриране от AnswerHub към WordPress:Приказка за 10 технологии