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