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

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

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

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

Синтаксис

Има два начина да посочите вътрешно присъединяване:в FROM клауза (използвайки INNER JOIN синтаксис) или с помощта на WHERE клауза.

За да посочите вътрешно присъединяване в FROM клауза:

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

За да посочите вътрешно присъединяване в WHERE клауза:

SELECT *
FROM Table1, Table2 
WHERE Table1.Column = Table2.Column; 

По-долу са дадени примери за всеки.

Примери

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

Примерни данни

Първо, ето таблиците, които ще използваме за примерите.

PetTypes таблица:

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

Pets таблица:

+--------+------------+-----------+---------- -+-----------+| PetId | PetTypeId | Id на собственик | Име на домашни любимци | DOB ||---------+------------+-----------+----------- +-----------|| 1 | 2 | 3 | Пухкави | 20.11.2020 || 2 | 3 | 3 | Вземи | 2019-08-16 || 3 | 2 | 2 | Надраскване | 2018-10-01 || 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 засегнати реда)

Owners таблица:

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

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

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

Пример за използване на синтаксис INNER JOIN

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

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId; 

Резултат:

-----------+-----------+| Име на домашни любимци | PetType ||-----------+-----------|| Пухкави | Котка || Вземи | Куче || Надраскване | Котка || Размахване | Куче || Tweet | Птица || Пухкави | Куче || Кора | Куче || Мяу | Котка |+-----------+-----------+(8 реда засегнати)

За да посочите вътрешно присъединяване в FROM клауза, ние използваме INNER JOIN . Ние също така използваме ON ключова дума за дефиниране на предиката, който да бъде оценен за всяка двойка съединени редове.

Независимо от типа на присъединяването, ние квалифицираме имената на колоните си с имената на таблиците. Причината да правим това е, за да избегнем неясноти по отношение на имената на колоните между таблиците. И двете таблици могат да имат колони с едно и също име (както в нашия пример) и в такива случаи СУБД няма да знае коя колона имате предвид. Поставянето на префикс на имената на колоните с имената на техните таблици гарантира, че препращате към дясната колона и предотвратява всякакви грешки, които биха могли да възникнат от неяснота относно това коя колона имате предвид.

В този пример и двете таблици имат PetTypeId колона. Pets.PetTypeId колоната е външен ключ към PetTypes.PetTypeId колона, която е първичният ключ за тази таблица.

В този пример можем да видим, че всички домашни любимци са върнати, но не всички видове домашни любимци са върнати. В Pets няма зайци таблицата и така Rabbits тип домашни любимци не се връща.

Причината Rabbits типът не се връща, защото INNER JOIN връща редове само когато има поне един ред и в двете таблици, който отговаря на условието за присъединяване. В този случай Rabbits е само в една таблица (PetTypes таблица).

Типът на присъединяване е по избор

Имайте предвид, че типът на присъединяване не е задължителен. Следователно повечето (ако не всички) СУБД ви позволяват да пропуснете INNER ключова дума. Когато пропуснете това (т.е. посочете само JOIN ), се приема, че е вътрешно съединение.

Следователно бихме могли да пренапишем горния пример на това:

SELECT
    Pets.PetName,
    PetTypes.PetType
FROM Pets
JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId; 

Форматиране

Както при всеки SQL израз, можете да използвате интервали и отстъпи и т.н., за да форматирате вашите заявки.

Например FROM клаузата може да бъде на един цял ред, ако предпочитате:

SELECT
    Pets.PetName,
    PetTypes.PetType
FROM Pets JOIN PetTypes ON Pets.PetTypeId = PetTypes.PetTypeId; 

Когато пишете по-големи таблици, които съединяват няколко таблици, отстъпът може да помогне много.

Пример за използване на клаузата WHERE

Горното присъединяване може също да се нарича equi-join . Equi-join е съединение, съдържащо само сравнения на равенство в предиката на присъединяване.

Ето пример за посочване на вътрешно съединение с помощта на WHERE клауза:

SELECT
    p.PetName,
    pt.PetType
FROM 
    Pets p, 
    PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId; 

Резултат:

+-----------+-----------+| PetName   | PetType   ||-----------+-----------|| Пухкав    | Котка       || Извличане     | Куче       || Надраскване   | Котка       || Помахайте       | Куче       || Tweet     | Птица      || Пухкав    | Куче       || Кора      | Куче       || Мяу      | Котка       |+-----------+-----------+(8 реда засегнати)

Това върна същия резултат като предишния пример.

Тук просто предоставихме разделен със запетая списък на таблиците и след това WHERE състояние. Ако сме пропуснали WHERE условие, щяхме да завършим с CROSS JOIN .

Много начинаещи намират горния синтаксис за много по-лесен за разбиране от INNER JOIN синтаксис. Чувствайте се свободни да използвате този синтаксис, ако предпочитате, но имайте предвид, че повечето специалисти по SQL предпочитат да използват INNER JOIN синтаксис от предишния пример..

Вътрешно присъединяване на 3 маси

Ето пример за извършване на вътрешно свързване на 3 маси.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p INNER JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o 
    ON p.OwnerId = o.OwnerId; 

Резултат:

+-----------+-----------+--------------+| PetName   | PetType   | PetOwner      ||-----------+-----------+---------------|| Пухкав    | Котка       | Нанси Симпсън || Извличане     | Куче       | Нанси Симпсън || Надраскване   | Котка       | Барт Пит     || Помахайте       | Куче       | Нанси Симпсън || Tweet     | Птица      | Хоумър Конъри || Пухкав    | Куче       | Борис Тръмп   || Кора      | Куче       | Барт Пит     || Мяу      | Котка       | Борис Тръмп   |+-----------+----------+--------------+(8 реда засегнати) 

В този пример доведохме Owners таблица в микса, защото ни трябваше тази заявка, за да върнем информация за собственика.

За да използваме трета таблица, всичко, което направихме, беше да добавим още едно INNER JOIN... ON аргумент заедно със съответните подробности за таблица/колона.

В този случай използвах CONCAT() на T-SQL функция за свързване на две колони, но това е без значение за обединяването.


  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. ODBC 4.0

  3. SQL UNION Cheat Sheet с 10 лесни и полезни съвета

  4. Използване на Salesforce SOQL от Linux

  5. Среща на върха за MVP за 2013 г.:Бърз преглед и поглед напред