Тази статия предоставя общ преглед на 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 | example@sqldat.com || 2 | Барт | Пит | (231) 465-3497 | example@sqldat.com || 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 функция за свързване на две колони, но това е без значение за обединяването.