Inner join sql: SQL INNER JOIN Keyword

Операция INNER JOIN — Служба поддержки Майкрософт

Access для Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Еще…Меньше

Объединяет записи из двух таблиц, если в связующих полях этих таблиц содержатся одинаковые значения.

Синтаксис


FROM таблица1 INNER JOIN таблица2 ON таблица1.поле1оператор_сравнения таблица2.поле2

Операция INNER JOIN состоит из следующих элементов:






Часть


Описание


таблица1, таблица2

Имена таблиц, содержащих объединяемые записи.


поле1, поле2

Имена полей, которые соединены. Если они не являются числами, поля должны быть одного тип данных и содержать данные одного типа, но не должны иметь одинаковых имен.


compopr

Любой оператор сравнения: (=, <, >, <=, >= или <>)



Замечания


Операцию INNER JOIN можно использовать в любом предложении FROM. Это самый распространенный тип объединения. С его помощью происходит объединение записей из двух таблиц по связующему полю, если оно содержит одинаковые значения в обеих таблицах.

При работе с таблицами «Отделы» и «Сотрудники» операцией INNER JOIN можно воспользоваться для выбора всех сотрудников в каждом отделе. Если же требуется выбрать все отделы (включая те из них, в которых нет сотрудников) или всех сотрудников (в том числе и не закрепленных за отделом), можно при помощи операции LEFT JOIN или RIGHT JOIN создать внешнее соединение.

При попытке связи полей, содержащих данные типа Memo или объекты OLE, возникнет ошибка.

Вы можете объединить любые два числовых поля похожих типов. Например, можно объединить поля с типом данных «Автонобере» и «Длинный». Однако нельзя соединить поля Single и Double.

В следующем примере показано, как можно объединить таблицы Categories и Products по полю CategoryID.


SELECT CategoryName, ProductName
FROM Categories INNER JOIN Products
ON Categories.CategoryID = Products.CategoryID;

В предыдущем примере CategoryID — это соединенное поле, но оно не включается в результаты запроса, так как оно не включено в утверждение SELECT. Чтобы включить в него соединенное поле, включив его имя в утверждение SELECT— в данном случае это Categories.CategoryID.

В инструкции JOIN можно также связать несколько предложений ON, используя следующий синтаксис:

SELECT поля
FROM таблица1 INNER JOIN таблица2
ON таблица1.таблица1оператор_сравнениятаблица2.поле1 AND
ON таблица1.поле2оператор_сравнениятаблица2.поле2) OR
ON таблица1.поле3оператор_сравнениятаблица2.поле3)];

Ниже приведен пример синтаксиса, с помощью которого можно составлять вложенные инструкции JOIN.

SELECT поля
FROM таблица1 INNER JOIN
(таблица2 INNER JOIN [( ]таблица3
[INNER JOIN [( ]таблицаx [INNER JOIN …)]
ON таблица3.поле3оператор_сравнениятаблицаx.полеx)]
ON таблица2. поле2оператор_сравнениятаблица3.поле3)
ON таблица1.поле1оператор_сравнениятаблица2.поле2;

Операции LEFT JOIN и RIGHT JOIN могут быть вложены в операцию INNER JOIN, но операция INNER JOIN не может быть вложена в операцию LEFT JOIN или RIGHT JOIN.




INNER JOIN простыми словами | Techrocks

Перевод статьи «SQL INNER JOIN Explained in Simple Words».

Photo by Dan Dennis on Unsplash

Как известно, база данных хранит данные в таблицах. Скорее всего вы уже умеете писать запросы к одной таблице. Но что если требуется поработать с несколькими таблицами? Чтобы комбинировать данные из двух и более таблиц, нужно воспользоваться оператором JOIN. Сегодня на примерах разберемся, как работает INNER JOIN.

JOIN для двух таблиц

Наша тренировочная база данных будет состоять из двух таблиц: TRAVEL_PACK и CITIES:

Таблица TRAVEL_PACK

PACK_NAMEBEST_SEASONPRICEDURATION
United States: Big CitiesAll year$3500. 0010 days
United States: West CoastMarch to May$3700.0012 days
South American TourAugust to November$1850.0018 days
Beaches of BrazilDecember to March$2200.007 days

TRAVEL_PACK

Таблица CITIES

NAMETYPE_OF_CITYPACK_NAMEDAYS_STAYING
San Francisco historicahistoricalUnited States: West Coas5
WashingtonhistoricalUnited States: Big Cities3
New YorkbusinessUnited States: Big Cities7
Rio de JaneirobeachBeaches of Brazil4
UshuaiamountainSouth American Tour3
Salvador de BahiabeachBeaches of Brazil3
Los AngelesbeachUnited States: West Coast7

CITIES

Оператор JOIN объединяет записи таблиц по общему полю или колонке (т. е. такая колонка должна быть в каждой из таблиц). В нашем случае у нас есть колонка PACK_NAME в таблице TRAVEL_PACK и точно такая же — в таблице CITIES.

Легко заметить, что в обеих таблицах эта колонка называется одинаково. Но это не обязательно, и в других базах данных может быть иначе. Другими словами, при использовании оператора INNER JOIN названия общей колонки в таблицах могут совпадать, но могут и отличаться.

Первый JOIN — найдем путевки по приморским городам

Залог хорошего SQL-запроса — четкое понимание того, где хранятся нужные данные. В нашем случае очевидно, что для поиска названий путёвок понадобится TRAVEL_PACK, а проверить, находится ли город у моря, можно в таблице CITIES.

Комбинировать данные из двух таблиц можно с помощью конструкции JOIN. Она создает связь между таблицами и помогает отобразить данные из них единовременно. Условно говоря, из двух строк отдельных таблиц JOIN создает одну целую. Такой тип соединения называется INNER JOIN (впрочем, он является синонимом для JOIN). Наряду с этим видом часто используют LEFT, RIGHT, OUTER и много других типов JOIN.

Вот как JOIN создаёт соединённые строки с данными:

Синтаксис запроса с JOIN:

FROM table1 
INNER JOIN table2 ON common column in table1 = common column in table2

Подставим в эту схему названия таблиц и колонок из тренировочной базы данных:

FROM CITIES 
INNER JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
FROM CITIES

После секции FROM с INNER JOIN можно переходить к написанию SELECT с WHERE:

SELECT TRAVEL_PACK. PACK_NAME

Обратите внимание, что обращение к колонке PACK_NAME сделано с добавлением названия таблицы (TRAVEL_PACK). Это хорошая практика для случаев, когда в запросе задействовано больше одной таблицы.

При помощи оператора WHERE отфильтруем результаты, чтобы остались только приморские города:

WHERE CITIES.TYPE_OF_CITY = 'beach'

В результате должен получится вот такой запрос:

SELECT TRAVEL_PACK.PACK_NAME
FROM CITIES 
JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE CITIES.TYPE_OF_CITY = 'beach'

А результатом его выполнения будет такой датасет:

NAME
Los Angeles
Salvador de Bahia
Rio de Janeiro

Следующий шаг — найти города с путевками дешевле $2500.

По образу и подобию предыдущего запроса можно обратиться к двум известным таблицам CITIES и TRAVEL_PACK и соединить их с помощью INNER JOIN (далее JOIN и INNER JOIN будут использоваться взаимозаменяемо).

По условиям задачи запрос из предыдущего раздела можно оставить почти неизменным — достаточно сделать легкие изменения в SELECT и WHERE.

Начнем с SELECT, в нем обратимся к наименованию города:

SELECT CITY.NAME

В фильтрации WHERE ограничим набор данных по стоимости:

WHERE TRAVEL_PACK.PRICE <= 2500

Полностью запрос будет выглядеть так:

SELECT CITY. NAME
FROM CITIES 
JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE TRAVEL_PACK.PRICE <= 2500

А вернёт он такие данные:

NAME
Rio de Janeiro
Ushuaia
Salvador de Bahia

Глубокое погружение: INNER JOIN для трёх таблиц

JOIN  можно использовать не только с двумя, но и с большим числом таблиц. Для соединения каждой пары таблиц необходим один JOIN. Схематический пример:

FROM T1 JOIN T2 ON ...... 
                JOIN T3 ON .......

Обратимся к практическому примеру. Добавим в базу данных новую таблицу STATES, в которой будем хранить данные о государствах, регионах и провинциях разных стран.

Таблица TRAVEL_PACK 

PACK_NAMEBEST_SEASONPRICEDURATION
United States: Big CitiesAll year$3500.0010 days
United States: West CoastMarch to May$3700.0012 days
South American TourAugust to November$1850.0018 days
Beaches of BrazilDecember to March$2200.007 days

TRAVEL_PACK

Таблица STATES

NAMECOUNTRYPOPULATIONLANGUAGE
New YorkUnited States17000000english
Tierra del FuegoArgentina190000spanish
CaliforniaUnited States13400000english
Rio de JaneiroBrasil15000000portuguese
BahiaBrasil8000000portuguese

STATES

Таблица CITIES

NAMETYPE_OF CITYPACK_NAMEDAYS_STAYSTATE
San FranciscohistoricalUnited States: West Coast5California
WashingtonhistoricalUnited States: Big Cities3Washington
New YorkbusinessUnited States: Big Cities7New York
Rio de JaneirobeachBeaches of Brazil4Rio de Janeiro
UshuaiamountainSouth American Tour3Tierra del Fuego
Salvador de BahiabeachBeaches of Brazil3Bahia
Los AngelesbeachUnited States: West Coast7California

CITIES

Запросим все туристические города из регионов, говорящих на испанском и португальском. Понятно, что нужно соединить таблицы CITIES и STATES, а затем приджоинить к ним TRAVEL_PACK. Приступим к решению задачи и используем знания из предыдущих частей этой статьи.

Во-первых, сделаем JOIN для таблиц CITIES и STATES по колонкам CITIES.STATE и STATE.NAME:

FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME

Сделаем JOIN с третьей таблицей TRAVEL_PACK:

FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
  JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME

Отполируем запрос с помощью SELECT и WHERE:

SELECT CITIES. NAME, STATES.NAME, TRAVEL_PACK.PACK_NAME, STATES.LANGUAGE
FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
  JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE STATES.LANGUAGE IN ('spanish','portuguese')

Результат:

NAMENAMEPACK_NAMELANGUAGE
SalvadorBahiaBeaches of Brazilportuguese
Rio de JaneiroRio de JaneiroBeaches of Brazilportuguese
UshuaiaTierra del FuegoSouth American Tourspanish

Итоги
В этой статье мы рассмотрели объединение записей в SQL-таблицах. Оператор JOIN открывает перед вами множество новых возможностей в использовании SQL.


От редакции Techrocks: Если хотите изучить не только INNER JOIN, но и другие виды объединений, обратите внимание на статью “SQL JOIN: руководство по объединению таблиц”.

SQL INNER JOIN (с примерами)

В этом руководстве мы узнаем о SQL INNER JOIN с помощью примеров.

SQL INNER JOIN объединяет две таблицы на основе общего столбца и выбирает записи, имеющие совпадающие значения в этих столбцах.

Пример

 ВЫБЕРИТЕ Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders.customer; 

Вот как работает этот код:

Пример: SQL INNER JOIN

Здесь команда SQL выбирает столбцы customer_id и first_name (из таблицы Customers ) и столбец amount (из таблицы Orders ).

И набор результатов будет содержать те строки, в которых есть совпадение между customer_id (из таблицы Customers ) и customer (из таблицы Orders ).


Синтаксис ВНУТРЕННЕГО СОЕДИНЕНИЯ

Синтаксис INNER JOIN :

 SELECT столбцы
ИЗ таблицы1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблица2
ON table1. column_name = table2.column_name; 

INNER JOIN с предложением WHERE

Вот пример INNER JOIN с предложением WHERE:

 SELECT Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders.customer
ГДЕ Orders.amount >= 500; 

Здесь команда SQL объединяет две таблицы и выбирает строки, в которых Сумма на больше или равна 500 .


SQL INNER JOIN с псевдонимом AS

Мы можем использовать псевдонимы AS внутри INNER JOIN , чтобы сделать наш фрагмент коротким и чистым. Например,

 SELECT C.cat_name, P.prod_title
ИЗ Категории КАК С
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Продукты AS P
ON C.cat_id= P.cat_id; 

Здесь команда SQL выбирает общие строки между таблицей Категория и Продукты .


ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL с тремя таблицами

Мы также можем объединить более двух таблиц, используя INNER JOIN . Например,

 ВЫБРАТЬ C.customer_id, C.first_name, O.amount, S.status
ОТ клиентов AS C
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы AS O
ВКЛ C.customer_id = O.клиент
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доставка AS S
ON C.customer_id = S.customer; 

Здесь команда SQL

  • объединяет таблицы Customers и Orders на основе customer_id
  • и присоединяется к Клиентам и Таблица состояния на основе customer_id

Команда возвращает те строки, в которых есть совпадение между значениями столбцов в обоих условиях соединения.

Примечание: Для запуска этой команды в каждой отдельной таблице должен быть столбец customer_id .


Внутреннее соединение и другие соединения

Мы также можем использовать JOIN вместо INNER JOIN . По сути, эти два пункта одинаковы.

Значит,

 ВЫБЕРИТЕ Customers. customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders.customer; 

аналогично

 ВЫБЕРИТЕ Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ПРИСОЕДИНЯЙТЕСЬ к заказам
ON Customers.customer_id = Orders.customer; 

INNER JOIN выбирает общие строки между двумя таблицами. Принимая во внимание, что LEFT JOIN выбирает общие строки, а также все остальные строки из левой таблицы.

Давайте рассмотрим пример,

INNER JOIN

 SELECT Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders.customer; 

Вывод

Пример: SQL INNER JOIN Вывод

LEFT JOIN

 SELECT Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ЛЕВОЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders. customer; 

Вывод

Пример: SQL LEFT JOIN Вывод

INNER JOIN выбирает общие строки между двумя таблицами. Принимая во внимание, что RIGHT JOIN выбирает общие строки, а также все остальные строки из правой таблицы.

Давайте рассмотрим пример,

INNER JOIN

 SELECT Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders.customer; 

Вывод

Пример: SQL INNER JOIN Вывод

ПРАВОЕ СОЕДИНЕНИЕ

 SELECT Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ПРАВОЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders.customer_id; 

Вывод

Пример: SQL RIGHT JOIN Вывод

INNER JOIN выбирает общие строки между двумя таблицами. В то время как FULL OUTER JOIN выбирает все строки из обеих таблиц.

Давайте посмотрим на пример,

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

 ВЫБЕРИТЕ Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders.customer; 

Вывод

Пример: SQL INNER JOIN Вывод

ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

 SELECT Customers.customer_id, Customers.first_name, Orders.amount
ОТ клиентов
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Заказы
ON Customers.customer_id = Orders.customer; 

Вывод

Пример: SQL FULL OUTER JOIN Вывод


Рекомендуемые показания

  • SQL JOIN
  • SQL ЛЕВОЕ СОЕДИНЕНИЕ
  • SQL ПРАВОЕ СОЕДИНЕНИЕ
  • SQL ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

Содержание

Пошаговое руководство по SQL Inner Join

Каждую минуту организации генерируют и анализируют непревзойденные объемы данных. В этой статье мы покажем, как мы можем использовать SQL Inner Join для запроса и доступа к данным из нескольких таблиц, которые хранят эти постоянно растущие данные в базах данных SQL.

Соединения SQL

Прежде чем мы начнем с SQL Inner Join, я хотел бы вызвать здесь SQL Join. Присоединение — это широко используемое предложение в SQL Server, в основном для объединения и извлечения данных из двух или более таблиц. В реальной реляционной базе данных данные структурированы в большом количестве таблиц, и поэтому существует постоянная потребность в объединении этих нескольких таблиц на основе логических связей между ними. В SQL Server существует четыре основных типа соединений: внутреннее, внешнее (левое, правое, полное), самостоятельное и перекрестное соединение. Чтобы получить краткий обзор всех этих объединений, я бы порекомендовал пройти по этой ссылке, обзору типов соединений SQL и учебному пособию.

Эта статья посвящена внутреннему соединению в SQL Server, так что давайте перейдем к нему.

Определение внутреннего соединения SQL

Предложение Inner Join в SQL Server создает новую таблицу (не физическую) путем объединения строк, имеющих совпадающие значения в двух или более таблицах. Это объединение основано на логической связи (или общем поле) между таблицами и используется для извлечения данных, которые появляются в обеих таблицах.

Предположим, у нас есть две таблицы, таблица A и таблица B, которые мы хотели бы соединить с помощью SQL Inner Join. Результатом этого соединения будет новый результирующий набор, возвращающий совпадающие строки в обеих этих таблицах. Часть пересечения, выделенная черным цветом ниже, показывает данные, полученные с помощью Inner Join в SQL Server.

Синтаксис внутреннего соединения SQL Server

Ниже приведен основной синтаксис Inner Join.

SELECT Column_list
FROM TABLE1
INNER JOIN TABLE2
ON Table1.ColName = Table2.ColName

Синтаксис внутреннего соединения в основном сравнивает строки таблицы Table1 с таблицей Table2, чтобы проверить, совпадает ли что-либо на основе условия, указанного в предложении ON. Когда условие соединения выполнено, оно возвращает совпадающие строки в обеих таблицах с выбранными столбцами в предложении SELECT.

Предложение SQL Inner Join такое же, как и предложение Join, и работает так же, если мы не указываем тип (INNER) при использовании предложения Join. Короче говоря, внутреннее соединение — это ключевое слово по умолчанию для соединения, и оба они могут использоваться взаимозаменяемо.

Примечание. Мы будем использовать ключевое слово «внутреннее» соединение в этой статье для большей ясности. Вы можете опустить его при написании своих запросов и также можете использовать только «Присоединиться».

Внутреннее соединение SQL в действии

Давайте попробуем понять концепцию внутреннего соединения на примере интересной выборки данных, касающейся пиццерии и ее распределения продуктов питания. Сначала я собираюсь создать две таблицы: таблицу «PizzaCompany», которая управляет различными филиалами пиццерий в нескольких городах, и таблицу «Foods», в которой хранятся сведения о распределении продуктов питания по этим компаниям. Вы можете выполнить приведенный ниже код, чтобы создать и заполнить данные в этих двух таблицах. Все эти данные являются гипотетическими и вы можете создать их в любой из ваших существующих баз данных.

1

2

3

4

5

6

7

8

10

110003

12

13

14

9000 3

9000 3

9000 3

9000 3

9000 3 9000 3

9000 3

9000 3 9000 3

9000 3

9000 3

CREATE TABLE [dbo].[PizzaCompany]

(

  [CompanyId] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED,

  [CompanyName] [CompanyName](50) ,

3 90 varchar](30)  

)

SET IDENTITY_INSERT [dbo].[PizzaCompany] ON;

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES(1,’Dominos’,’Los Angeles’) ;

ВСТАВИТЬ В [dbo]. [PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES(2,’Pizza Hut’,’Сан-Франциско’) ;

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES(3,’Папа Джонс’,’Сан-Диего’) ;

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES(4,’Ah Pizz’,’Fremont’) ;

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES(5,’Nino Pizza’,’Las Vegas’) ;

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES(6,’Пиццерия’,’Бостон’) ;

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES(7,’chuck e cheese’,’Chicago’) ;

 

ВЫБЕРИТЕ * ОТ PizzaCompany:

Вот как выглядят данные в таблице PizzaCompany:

Давайте сейчас создадим и заполним таблицу Foods. CompanyID в этой таблице — это внешний ключ, который ссылается на первичный ключ таблицы PizzaCompany, созданной выше.

1

2

3

4

5

6

7

8

10

110003

12

13

14

9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3 9000 3

9000 3 9000 3 9000 3 9000 3

0002 17

18

Создание таблицы [dbo]. [Foods]

(

[itemid] int Первичные ключевые кластеры,

[itemname] varchar (50),

(CompanyID) ССЫЛКИ PizzaCompany(CompanyID)

)

ВСТАВИТЬ В [dbo].[Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES(1,’Большая пицца’,5, 2)

ВСТАВИТЬ В [dbo].[Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES(2,’чесночные узлы’,6,3)

ВСТАВИТЬ В [dbo].[Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES(3,’Большая пицца’,3,3)

ВСТАВИТЬ В [dbo].[ Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES(4,’Средняя пицца’,8,4)

ВСТАВИТЬ В [dbo]. [Foods] ([ItemId], [ItemName ], [UnitsSold], [CompanyId]) VALUES(5,’Breadsticks’,7,1)

ВСТАВИТЬ В [dbo].[Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES(6,’Средняя пицца’,11,1)

ВСТАВИТЬ В [dbo].[Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES(7,’Маленькая пицца’, 9,6)

ВСТАВИТЬ В [dbo].[Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES(8,’Маленькая пицца’,6,7)

 

SELECT * ОТ Пищевых продуктов

В следующей таблице показаны данные из таблицы «Продукты». В этой таблице хранится такая информация, как количество проданных единиц продуктов питания, а также пиццерия (CompanyId), которая ее доставляет.

Теперь, если мы хотим увидеть товары, а также единицы, проданные каждой компанией по производству пиццы, мы можем объединить эти две таблицы с помощью предложения внутреннего соединения, используемого в поле CompanyId (в нашем случае это разделяет отношение внешнего ключа ).

SELECT pz.CompanyCity, pz.CompanyName, pz.CompanyId AS PizzaCompanyId, f.CompanyID AS FoodsCompanyId, f.ItemName, f.UnitsSold

ИЗ PizzaCompany pz

INNER JOIN Foods f

pz. Идентификатор компании

Ниже приведен набор результатов приведенного выше запроса внутреннего соединения SQL. Для каждой строки в таблице PizzaCompany функция Inner Join сравнивает и находит совпадающие строки в таблице Foods и возвращает все совпадающие строки, как показано ниже. И если вы заметили, CompanyId = 5 исключается из результата запроса, так как не соответствует таблице Foods.

С помощью приведенного выше набора результатов мы можем разобрать товары, а также количество товаров, доставленных пиццериями в разных городах. Например, компания Dominos доставила в Лос-Анджелес 7 хлебных палочек и 11 средних пицц.

Внутреннее соединение SQL для трех таблиц

Давайте подробнее рассмотрим это объединение и предположим, что в штате откроются три аквапарка (похоже на лето), и эти аквапарки будут брать еду из пиццерий, упомянутых в таблице PizzaCompany.

Я собираюсь быстро создать таблицу WaterPark и загрузить в нее произвольные данные, как показано ниже.

1

2

3

4

5

6

7

8

10

110003

12

13

14

CREATE TABLE [dbo].[WaterPark]

(

  [WaterParkLocation] VARCHAR(50),

[CompanyId] int,

FOREIGN KEY(CompanyID) REFERENCES PizzaCompany(CompanyID)

)

ВСТАВИТЬ В [dbo].[WaterPark] ([WaterParkLocation], [CompanyId]) VALUES(‘Street 14 )

ВСТАВИТЬ В [dbo].[WaterPark] ([WaterParkLocation], [CompanyId]) VALUES(‘Boulevard 2’,2)

ВСТАВИТЬ В [dbo].[WaterPark] ([WaterParkLocation], [CompanyId]) VALUES(‘Rogers 54’,4)

INSERT INTO [dbo].[WaterPark] ([WaterParkLocation], [CompanyId]) VALUES(‘Street 14’,3)

ВСТАВИТЬ В [dbo].[WaterPark] ([WaterParkLocation], [CompanyId]) VALUES(‘Rogers 54’,5)

ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) VALUES (‘Бульвар 2’,5)

 

ВЫБЕРИТЕ * ИЗ Аквапарка

И ниже вывод этой таблицы.

Как говорится, картинка стоит тысячи слов. Давайте быстро посмотрим на схему базы данных этих трех таблиц с их отношениями, чтобы лучше понять их.

Теперь мы собираемся включить эту третью таблицу в предложение SQL Inner Join, чтобы посмотреть, как это повлияет на набор результатов. Согласно данным в таблице WaterPark, три аквапарка передавали еду от всех пиццерий, кроме Pizzeria (Id = 6) и chuck e cheese (Id = 7). Выполните приведенный ниже код, чтобы увидеть всю раздачу еды в аквапарках по точкам Pizza.

1

2

3

4

5

6

ВЫБЕРИТЕ pz.CompanyId, pz.CompanyCity, pz.CompanyName,f.ItemName, f.UnitsSold,

w.WaterParkLocation

ИЗ PizzaCompany pz

INNER JOIN Foods f ON pz. 2d9000CompanyId = f.00002 ПРИСОЕДИНЯЙТЕСЬ к WaterPark w ON w.CompanyId = pz.CompanyId

ЗАКАЗ ПО pz.CompanyId

На основе CompanyId SQL Inner Join сопоставляет строки в обеих таблицах, PizzaCompany (таблица 1) и Foods (таблица 2), а затем ищет совпадение в WaterPark (таблица 3), чтобы вернуть строки. Как показано ниже, с добавлением внутреннего соединения в WaterPark CompanyId (6,7 (кроме 5)) также исключается из окончательного набора результатов, поскольку условие w.CompanyId = pz.CompanyId не выполняется для идентификаторов (6, 7). Вот как внутреннее соединение SQL помогает возвращать определенные строки данных из нескольких таблиц.

Давайте углубимся в SQL Inner Join еще с несколькими предложениями T-SQL.

Использование WHERE с внутренним соединением

Мы можем фильтровать записи на основе заданного условия, когда внутреннее соединение SQL используется с предложением WHERE. Предположим, что мы хотим получить строки, в которых продано больше 6 единиц.

В следующем запросе добавлено предложение WHERE для извлечения результатов со значением более 6 для проданных единиц.

ВЫБЕРИТЕ pz.CompanyId, pz.CompanyCity, pz.CompanyName,f.ItemName, f.UnitsSold

ИЗ PizzaCompany pz

INNER JOIN Foods f ON pz.CompanyId = f.CompanyId

9000

WHERE f.6

ЗАКАЗАТЬ pz.CompanyCity

Выполните приведенный выше код в SSMS, чтобы увидеть результат ниже. Этот запрос возвращает четыре таких записи.

Использование Group By с внутренним соединением

SQL Inner Join позволяет нам использовать предложение Group by вместе с агрегатными функциями для группировки результирующего набора по одному или нескольким столбцам. Группировка по обычно работает с внутренним соединением над окончательным результатом, возвращаемым после объединения двух или более таблиц. Если вы не знакомы с предложением Group by в SQL, я бы посоветовал пройти его, чтобы быстро понять эту концепцию. Ниже приведен код, в котором используется предложение Group By с внутренним соединением.

ВЫБЕРИТЕ pz.CompanyCity, pz.CompanyName, SUM(f.UnitsSold) AS TotalQuantitySold

FROM PizzaCompany pz

INNER JOIN Foods f ON pz.CompanyId = f.CompanyId

pz.Company3Name, pz.Company BY pz.Company

ЗАКАЗАТЬ pz.CompanyCity

Здесь мы намерены получить общее количество товаров, проданных каждой пиццерией, присутствующей в городе. Как вы можете видеть ниже, совокупный результат в столбце «Общее количество проданных» равен 18 (7+11) и 9.(6+3) для Лос-Анджелеса и Сан-Диего соответственно.

Краткая заметка об Equi и Theta Join

Прежде чем мы закончим эту статью, давайте быстро пробежимся по терминам, которые разработчик SQL может время от времени слышать — Equi и Theta Join.

Equi Join

Как следует из названия, эквивалентное соединение содержит оператор равенства «=» либо в предложении Join, либо в условии WHERE. SQL Inner, Left, Right — все это эквивалентные соединения, когда оператор «=» используется в качестве оператора сравнения. Обычно, когда упоминается внутреннее соединение SQL, оно рассматривается как внутреннее равное соединение, только в необычной ситуации оператор равенства не используется.

Чтобы упростить задачу, я собираюсь обратиться к образцу базы данных AdventureWorksDW2017 и запустить запрос к существующим таблицам, чтобы продемонстрировать, как выглядит эквивалентное соединение.

ВЫБЕРИТЕ e.EmployeeKey, e.FirstName, e.Title, e.HireDate,

fs.SalesAmountQuota FROM DimEmployee e

INNER JOIN FactSalesQuota fs

ON e.Employey 9mployeeKey = fs.

Тета-соединение (неэквивалентное соединение)

Соединение без эквивалента в основном противоположно соединению по эквивалентности и используется, когда мы присоединяемся к условию, отличному от оператора «=». Этот тип редко используется на практике. Ниже приведен пример, в котором используется тета-соединение с оператором неравенства (<) для оценки прибыли путем оценки себестоимости и продажных цен в двух таблицах.

SELECT * FROM Table1 T1, Table2 T2 WHERE T1.ProductCost < T2.SalesPrice

Заключение

Я надеюсь, что эта статья о «Внутреннем соединении SQL» обеспечивает понятный подход к одному из важных и часто используемых предложений — «Внутреннее соединение» в SQL Server для объединения нескольких таблиц. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь задавать их в разделе комментариев ниже.

Чтобы продолжить изучение SQL Joins, вы можете обратиться к следующим сообщениям:

  • SQL OUTER JOIN обзор и примеры
  • SQL Join введение и обзор
  • Автор
  • Последние сообщения

Гаури Махаджан

Гаури является специалистом по SQL Server и имеет более чем 6-летний опыт работы с глобальными многонациональными консалтинговыми и технологическими организациями.