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 состоит из следующих элементов:
|
|
|
Имена таблиц, содержащих объединяемые записи.
|
|
Имена полей, которые соединены. Если они не являются числами, поля должны быть одного тип данных и содержать данные одного типа, но не должны иметь одинаковых имен.
|
|
Любой оператор сравнения: (=, <, >, <=, >= или <>)
|
Замечания
Операцию 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_NAME | BEST_SEASON | PRICE | DURATION |
---|---|---|---|
United States: Big Cities | All year | $3500. 00 | 10 days |
United States: West Coast | March to May | $3700.00 | 12 days |
South American Tour | August to November | $1850.00 | 18 days |
Beaches of Brazil | December to March | $2200.00 | 7 days |
TRAVEL_PACK
Таблица CITIES
NAME | TYPE_OF_CITY | PACK_NAME | DAYS_STAYING |
---|---|---|---|
San Francisco historica | historical | United States: West Coas | 5 |
Washington | historical | United States: Big Cities | 3 |
New York | business | United States: Big Cities | 7 |
Rio de Janeiro | beach | Beaches of Brazil | 4 |
Ushuaia | mountain | South American Tour | 3 |
Salvador de Bahia | beach | Beaches of Brazil | 3 |
Los Angeles | beach | United States: West Coast | 7 |
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_NAME | BEST_SEASON | PRICE | DURATION |
---|---|---|---|
United States: Big Cities | All year | $3500.00 | 10 days |
United States: West Coast | March to May | $3700.00 | 12 days |
South American Tour | August to November | $1850.00 | 18 days |
Beaches of Brazil | December to March | $2200.00 | 7 days |
TRAVEL_PACK
Таблица STATES
NAME | COUNTRY | POPULATION | LANGUAGE |
---|---|---|---|
New York | United States | 17000000 | english |
Tierra del Fuego | Argentina | 190000 | spanish |
California | United States | 13400000 | english |
Rio de Janeiro | Brasil | 15000000 | portuguese |
Bahia | Brasil | 8000000 | portuguese |
STATES
Таблица CITIES
NAME | TYPE_OF CITY | PACK_NAME | DAYS_STAY | STATE |
---|---|---|---|---|
San Francisco | historical | United States: West Coast | 5 | California |
Washington | historical | United States: Big Cities | 3 | Washington |
New York | business | United States: Big Cities | 7 | New York |
Rio de Janeiro | beach | Beaches of Brazil | 4 | Rio de Janeiro |
Ushuaia | mountain | South American Tour | 3 | Tierra del Fuego |
Salvador de Bahia | beach | Beaches of Brazil | 3 | Bahia |
Los Angeles | beach | United States: West Coast | 7 | California |
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')
Результат:
NAME | NAME | PACK_NAME | LANGUAGE |
---|---|---|---|
Salvador | Bahia | Beaches of Brazil | portuguese |
Rio de Janeiro | Rio de Janeiro | Beaches of Brazil | portuguese |
Ushuaia | Tierra del Fuego | South American Tour | spanish |
Итоги
В этой статье мы рассмотрели объединение записей в 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-летний опыт работы с глобальными многонациональными консалтинговыми и технологическими организациями.