Sql inner join: Оператор SQL INNER JOIN: синтаксис, примеры

Содержание

Оператор SQL INNER JOIN: синтаксис, примеры

Оператор SQL INNER JOIN формирует таблицу из записей двух или нескольких таблиц. Каждая строка из первой (левой) таблицы, сопоставляется с каждой строкой из второй (правой) таблицы, после чего происходит проверка условия. Если условие истинно, то строки попадают в результирующую таблицу. В результирующей таблице строки формируются конкатенацией строк первой и второй таблиц.

Оператор SQL INNER JOIN имеет следующий синтаксис:

SELECT
    column_names [,... n]
FROM
    Table_1 INNER JOIN Table_2
ON condition

Условие для сравнения задается в операторе ON.


Примеры оператора SQL INNER JOINИмеются две таблицы:

Authors — содержит в себе информацию об авторах книг:

AuthorIDAuthorName
1Bruce Eckel
2Robert Lafore
3Andrew Tanenbaum

Books — содержит в себе информацию о названии книг:

BookIDBookName
3Modern Operating System
1Thinking in Java
3Computer Architecture
4Programming in Scala

В таблице Books поле BookID являются внешним ключом и ссылаются на таблицу Authors.

Пример 1. Используя оператор SQL INNER JOIN вывести на экран, какими авторами были написаны какие из книг:

SELECT *
FROM Authors INNER JOIN Books
ON Authors.AuthorID = Books.BookID

В данном запросе оператора SQL INNER JOIN условие сравнения — это равенство полей AuthorID и BookID. В результирующую таблицу не попадет книга под названием Programming in Scala, так как значение ее BookID не найдет равенства ни с одной строкой AuthorID.

Результирующая таблица будет выглядеть следующим образом:

Authors.AuthorIDAuthors.AuthorNameBooks.BookIDBooks.BookName
3Andrew Tanenbaum3Modern Operating System
1Bruce Eckel1Thinking in Java
3Andrew Tanenbaum3Computer Architecture

Команды JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN — связывание таблиц

Команды JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN используются
для связывания таблиц по определенным полям связи.

Синтаксис

SELECT поля FROM имя_таблицы
LEFT JOIN имя_связанной_таблицы ON условие_связи 
WHERE условие_выборки

Примеры

Все примеры будут по таблицам countries и cities, если не сказано иное.

Таблица countries:

id
айди
name
имя
1Беларусь
2Россия
3Украина

Таблица cities:

id
айди
name
имя
country_id
айди страны
1Минск1
2Витебск1
3Москва2
4Питер2
5Лондон0

Пример . LEFT JOIN

В данном примере …:

SELECT
	cities.id as city_id, cities.name as city_name, cities.country_id as city_country_id,
	countries.id as country_id, countries.name as country_name
FROM cities
LEFT JOIN countries ON countries.id=cities.country_id

SQL запрос выберет следующие строки:

city_id
айди города
city_name
название города
city_country_id
айди страны
country_id
айди страны
country_name
название страны
1Минск11Беларусь
2Витебск11Беларусь
3Москва22Россия
4Питер22Россия
5Лондон0NULL

Пример . RIGHT JOIN

В данном примере …
Лондон не выберется,
а Украина наоборот

SELECT
	cities.id as city_id, cities.name as city_name, cities.country_id as city_country_id,
	countries.id as country_id, countries.name as country_name
FROM cities
RIGHT JOIN countries ON countries.id=cities.country_id

SQL запрос выберет следующие строки:

city_id
айди города
city_name
название города
city_country_id
айди страны
country_id
айди страны
country_name
название страны
1Минск11Беларусь
2Витебск11Беларусь
3Москва22Россия
4Питер22Россия
NULLNULLNULL3Украина

Пример . INNER JOIN

В данном примере …
Лондон и Украина не выберется

SELECT
	cities.id as city_id, cities.name as city_name, cities.country_id as city_country_id,
	countries.id as country_id, countries.name as country_name
FROM cities
INNER JOIN countries ON countries.id=cities.country_id

SQL запрос выберет следующие строки:

city_id
айди города
city_name
название города
city_country_id
айди страны
country_id
айди страны
country_name
название страны
1Минск11Беларусь
2Витебск11Беларусь
3Москва22Россия
4Питер22Россия

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

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

Как известно, база данных хранит данные в таблицах. Скорее всего вы уже умеете писать запросы к одной таблице. Но что если требуется поработать с несколькими таблицами? Чтобы комбинировать данные из двух и более таблиц, нужно воспользоваться оператором 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: руководство по объединению таблиц”.

INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN

Содержание:

Говоря про соединение таблиц в SQL, обычно подразумевают один из видов операции JOIN. Не стоит путать с объединением таблиц через операцию UNION. В этой статье я постараюсь простыми словами рассказать именно про соединение, чтобы после ее прочтения Вы могли использовать джойны в работе и не допускать грубых ошибок.

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

Придумаем 2 таблицы, на которых будем тренироваться.

Таблица «Сотрудники», содержит поля:

  • id – идентификатор сотрудника
  • Имя
  • Отдел – идентификатор отдела, в котором работает сотрудник
idИмяОтдел
1Юлия1
2Федор2
3АлексейNULL
4Светлана2

Таблица «Отделы», содержит поля:

  • id – идентификатор отдела
  • Наименование
idНаименование
1Кухня
2Бар
3Администрация

Давайте уже быстрее что-нибудь покодим.

INNER JOIN

Самый простой вид соединения INNER JOIN – внутреннее соединение. Этот вид джойна выведет только те строки, если условие соединения выполняется (является истинным, т.е. TRUE). В запросах необязательно прописывать INNER – если написать только JOIN, то СУБД по умолчанию выполнить именно внутреннее соединение.

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

SELECT
  -- Перечисляем столбцы, которые хотим вывести
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел -- выводим наименование отдела и переименовываем столбец через as
FROM
  -- таблицы для соединения перечисляем в предложении from 
  Сотрудники
  -- обратите внимание, что мы не указали вид соединения, поэтому выполнится внутренний (inner) джойн
  JOIN Отделы
    -- условия соединения прописываются после ON
    -- условий может быть несколько, записанных через and, or и т.п.
    ON Сотрудники.Отдел = Отделы.id

Получим следующий результат:

idИмяОтдел
1ЮлияКухня
2ФедорБар
4СветланаБар

Из результатов пропал сотрудник Алексей (id = 3), потому что условие «Сотрудники.Отдел = Отделы.id» не будет истинно для этой сроки из таблицы «Сотрудники» с каждой строкой из таблицы «Отделы». По той же логике в результате нет отдела «Администрация». Попробую это визуализировать (зеленные линии – условие TRUE, иначе линия красная):

Если не углубляться в то, как внутреннее соединение работает под капотом СУБД, то происходит примерно следующее:

  • Каждая строка из одной таблицы сравнивается с каждой строкой из другой таблицы
  • Строка возвращается, если условие сравнения является истинным

Если для одной или нескольких срок из левой таблицы (в рассмотренном примере левой таблицей является «Сотрудники», а правой «Отделы») истинным условием соединения будут являться одна или несколько срок из правой таблицы, то строки умножат друг друга (повторятся). В нашем примере так произошло для отдела с id = 2, поэтому строка из таблицы «Отделы» повторилась дважды для Федора и Светланы.
Перемножение таблиц проще ощутить на таком примере, где условие соединения будет всегда возвращать TRUE, например 1=1:

SELECT *
FROM
  Сотрудники
  JOIN Отделы
    ON 1=1

В результате получится 12 строк (4 сотрудника * 3 отдела), где для каждого сотрудника подтянется каждый отдел.

Также хочу сразу отметить, что в соединении может участвовать сколько угодно таблиц, можно таблицу соединить даже саму с собой (в аналитических задачах это не редкость). Какая из таблиц будет правой или левой не имеется значения для INNER JOIN (для внешних соединений типа LEFT JOIN или RIGHT JOIN это важно. Читайте далее). Пример соединения 4-х таблиц:

SELECT *
FROM
  Table_1

  JOIN Table_2
    ON Table_1.Column_1 = Table_2.Column_1

  JOIN Table_3
    ON
      Table_1.Column_1 = Table_3.Column_1
      AND Table_2.Column_1 = Table_3.Column_1

  JOIN Table_1 AS Tbl_1 -- Задаем алиас для таблицы, чтобы избежать неоднозначности
    -- Если в Table_1.Column_1 хранится порядковый номер какого-то объекта, 
    -- то так можно присоединить следующий по порядку объект
    ON Table_1.Column_1 = Tbl_1.Column_1 + 1

Как видите, все просто, прописываем новый джойн после завершения условий предыдущего соединения. Обратите внимание, что для Table_3 указано несколько условий соединения с двумя разными таблицами, а также Table_1 соединяется сама с собой по условию с использованием сложения.
Строки, которые выведутся запросом, должны совпасть по всем условиям. Например:

  • Строка из Table_1 соединилась со строкой из Table_2 по условию первого JOIN. Давайте назовем ее «объединенной строкой» из двух таблиц;
  • Объединенная строка успешно соединилась с Table_3 по условию второго JOIN и теперь состоит из трех таблиц;
  • Для объединенной строки не нашлось строки из Table_1 по условию третьего JOIN, поэтому она не выводится вообще.

На этом про внутреннее соединение и логику соединения таблиц в SQL – всё. Если остались неясности, то спрашивайте в комментариях.
Далее рассмотрим отличия остальных видов джойнов.

LEFT JOIN и RIGHT JOIN

Левое и правое соединения еще называют внешними. Главное их отличие от внутреннего соединения в том, что строка из левой (для LEFT JOIN) или из правой таблицы (для RIGHT JOIN) попадет в результаты в любом случае.
Давайте до конца определимся с тем, какая таблица левая, а какая правая.
Левая таблица та, которая идет перед написанием ключевых слов [LEFT | RIGHT| INNER] JOIN, правая таблица – после них:

SELECT *
FROM
  Левая_таблица AS lt
  LEFT JOIN Правая_таблица AS rt
    ON lt.c = rt.c

Теперь изменим наш SQL-запрос из самого первого примера так, чтобы ответить на вопрос «В каких отделах работают сотрудники, а также показать тех, кто не распределен ни в один отдел?»:

SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Сотрудники
  LEFT JOIN Отделы -- добавляем только left
    ON Сотрудники.Отдел = Отделы.id

Результат запроса будет следующим:

idИмяОтдел
1ЮлияКухня
2ФедорБар
3АлексейNULL
4СветланаБар

Как видите, запрос вернул все строки из левой таблицы «Сотрудники», дополнив их значениями из правой таблицы «Отделы». А вот строка для отдела «Администрация» не показана, т.к. для нее не нашлось совпадений слева.

Это мы рассмотрели пример для левого внешнего соединения. Для RIGHT JOIN будет все тоже самое, только вернутся все строки из таблицы «Отделы»:

idИмяОтдел
1ЮлияКухня
2ФедорБар
4СветланаБар
NULLNULLАдминистрация

Алексей «потерялся», Администрация «нашлась».

Вопрос для Вас. Что надо изменить в последнем приведенном SQL-запросе, чтобы результат остался тем же, но вместо LEFT JOIN, использовался RIGHT JOIN?

Ответ. Нужно поменять таблицы местами:

SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Отделы
  RIGHT JOIN Сотрудники
    ON Сотрудники.Отдел = Отделы.id

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

FULL JOIN

Еще один вид соединения, который осталось рассмотреть – полное внешнее соединение.
Этот вид джойна вернет все строки из всех таблиц, участвующих в соединении, соединив между собой те, которые подошли под условие ON.

Давайте посмотрим всех сотрудников и все отделы из наших тестовых таблиц:

SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Сотрудники
  FULL JOIN Отделы
    ON Сотрудники.Отдел = Отделы.id
idИмяОтдел
1ЮлияКухня
2ФедорБар
3АлексейNULL
4СветланаБар
NULLNULLАдминистрация

Теперь мы видим все, даже Алексея без отдела и Администрацию без сотрудников.

Вместо заключения

Помните о порядке выполнения соединений и порядке таблиц, если используете несколько соединений и используете внешние соединения. Можно выполнять LEFT JOIN для сохранения всех строк из самой первой таблицы, а последним внутренним соединением потерять часть данных. На маленьких таблицах косяк заметить легко, на огромных очень тяжело, поэтому будьте внимательны.
Рассмотрим последний пример и введем еще одну таблицу «Банки», в которой обслуживаются наши придуманные сотрудники:

idНаименование
1Банк №1
2Лучший банк
3Банк Лидер

В таблицу «Сотрудники» добавим столбец «Банк»:

idИмяОтделБанк
1Юлия12
2Федор22
3АлексейNULL3
4Светлана24

Теперь выполним такой запрос:

SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел,
  Банки.Наименование AS Банк
FROM
  Сотрудники

  LEFT JOIN Отделы
    ON Сотрудники.Отдел = Отделы.id

  INNER JOIN Банки
    ON Сотрудники.Банк = Банки.id

В результате потеряли информацию о Светлане, т.к. для нее не нашлось банка с id = 4 (такое происходит из-за неправильной проектировки БД):

idИмяОтделБанк
1ЮлияКухняЛучший банк
2ФедорБарЛучший банк
3АлексейNULLБанк Лидер

Хочу обратить внимание на то, что любое сравнение с неизвестным значением никогда не будет истинным (даже NULL = NULL). Эту грубую ошибку часто допускают начинающие специалисты. Подробнее читайте в статье про значение NULL в SQL.

Пройдите мой тест на знание основ SQL. В нем есть задания на соединения таблиц, которые помогут закрепить материал.

Дополнить Ваше понимание соединений в SQL могут схемы, изображенные с помощью кругов Эйлера. В интернете много примеров в виде картинок.

Если какие нюансы джойнов остались не раскрытыми, или что-то описано не совсем понятно, что-то надо дополнить, то пишите в комментариях. Буду только рад вопросам и предложениям.

Привожу простыню запросов, чтобы Вы могли попрактиковаться на легких примерах, рассмотренных в статье:

-- Создаем CTE для таблиц из примеров
WITH Сотрудники AS(
  SELECT 1 AS id, 'Юлия' AS Имя, 1 AS Отдел, 2 AS Банк
  UNION ALL
  SELECT 2, 'Федор', 2, 2
  UNION ALL
  SELECT 3, 'Алексей', NULL, 3
  UNION ALL
  SELECT 4, 'Светлана', 2, 4
),
Отделы AS(
  SELECT 1 AS id, 'Кухня' AS Наименование
  UNION ALL
  SELECT 2, 'Бар'
  UNION ALL
  SELECT 3, 'Администрация'
),
Банки AS(
  SELECT 1 AS id, 'Банк №1' AS Наименование
  UNION ALL
  SELECT 2, 'Лучший банк'
  UNION ALL
  SELECT 3, 'Банк Лидер'
)

-- Если надо выполнить другие запросы, то сначала закоментируй это запрос с помощью /**/,
-- а нужный запрос расскоментируй или напиши свой.
-- Это пример внутреннего соединения
SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Сотрудники
  JOIN Отделы
    ON Сотрудники.Отдел = Отделы.id

/*
-- Пример левого джойна
SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Сотрудники
  LEFT JOIN Отделы
    ON Сотрудники.Отдел = Отделы.id
*/

/*
-- Результат этого запроса будет аналогичен результату запроса выше, хотя соединение отличается
SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Отделы
  RIGHT JOIN Сотрудники
    ON Сотрудники.Отдел = Отделы.id
*/

/*
-- Правое соединение
SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Сотрудники
  RIGHT JOIN Отделы
    ON Сотрудники.Отдел = Отделы.id
*/

/*
-- Пример с использованием разных видов JOIN
SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Отделы
  RIGHT JOIN Сотрудники
    ON Сотрудники.Отдел = Отделы.id
  LEFT JOIN Банки
    ON Банки.id = Сотрудники.Банк
*/

/*
-- Полное внешние соединение
SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел
FROM
  Сотрудники
  FULL JOIN Отделы
    ON Сотрудники.Отдел = Отделы.id
*/

/*
-- Пример с потерей строки из-за последнего внутреннего соединения
SELECT
  Сотрудники.id,
  Сотрудники.Имя,
  Отделы.Наименование AS Отдел,
  Банки.Наименование AS Банк
FROM
  Сотрудники

  LEFT JOIN Отделы
    ON Сотрудники.Отдел = Отделы.id

  INNER JOIN Банки
    ON Сотрудники.Банк = Банки.id
*/

/*
-- Запрос с условием, которое всегда будет True
SELECT *
FROM
  Сотрудники
  JOIN Отделы
    ON 1=1
*/
  • < Назад
  • Вперёд >

Если материалы office-menu.ru Вам помогли, то поддержите, пожалуйста, проект, чтобы я мог развивать его дальше.

Добавить комментарий

SQL join в примерах с описанием

Присоединение таблиц в запросах — это базовый инструмент в работе с базами данных. Давайте рассмотрим какие присоединения (JOIN) бывают, и что от этого меняется в результатах запроса.

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

Persons (Сотрудники)

Positions (должности)

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

INNER JOIN

Внутреннее присоединение. Равносильно просто JOIN или CROSS JOIN (верно для MYSQL, в стандарте SQL INNER JOIN не эквивалентен синтаксически CROSS JOIN, т.к. используется с выражением ON).


SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
INNER JOIN `positions` ps ON ps.id = p.post_id



SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

INNER JOIN `positions` ps ON ps.id = p.post_id


Такое присоединение покажет нам данные из таблиц только если условие связывания соблюдается — т.е. для сотрудника указан существующий в словаре идентификатор должности.

Если поменять порядок соединения таблиц — получим тот же результат.

Условно представим себе эти таблицы, как пересекающиеся множества, где пересечение — это наличие связи между таблицами. Получим картинку:

Далее проследим как получить разные части (подмножества) данного множества.

OUTER JOIN

Внешнее присоединение. Различают LEFT OUTER JOIN и RIGHT OUTER JOIN, и обычно опускают слово «OUTER».

Внешнее присоединение включает в себя результаты запроса INNER и добавляются «неиспользованные» строки из одной из таблиц. Какую таблицу использовать в качестве «добавки» — указывает токен LEFT или RIGHT.

LEFT JOIN

Внешнее присоединение «слева».


SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id



SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id


«Левая» таблица persons, содержит строку id#3 — «Александр», где указан идентификатор должности, отсутствующей в словаре.

На картинке это можно показать вот так:

RIGHT JOIN

Присоединение «справа».


SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id



SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id


Словарь должностей (правая таблица) содержит неиспользуемую запись с id#3 — «программист». Теперь она попала в результат запроса.

Полное множество

MySQL не знает соединения FULL OUTER JOIN. Что если нужно получить полное множество?

Первый способ — объединение запросов LEFT и RIGHT.


(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id)
UNION
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id)



(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id)

UNION

(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id)


При таком вызове UNION, после слияния результатов, SQL отсечет дубли (как DISTINCT). Для отсечения дублей SQL прибегает к сортировке. Это может сказываться на быстродействии.

Второй способ — объединение LEFT и RIGHT, но в одном из запросов мы исключаем часть, соответствующую INNER. А объединение задаём как UNION ALL, что позволяет движку SQL обойтись без сортировки.


(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id)
UNION ALL
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE p.id IS NULL)



(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id)

UNION ALL

(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id

WHERE p.id IS NULL)


Этот пример показывает нам как исключить пересечение и получить только левую или правую часть множества.

Левое подмножество

LEFT JOIN ограничиваем проверкой, что данных из второй таблицы нет.


SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE ps.id is NULL



SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id

WHERE ps.id is NULL


В нашем примере — это специалисты, у которых не задана должность или нет должности с указанным ключом.

Правое подмножество

Точно также выделяем правую часть.


SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE p.id is NULL



SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id

WHERE p.id is NULL


В нашем случае получим должности, которые никому не назначены.

Всё кроме пересечения

Остался один вариант, тот когда исключено пересечение множеств. Его можно сложить из двух предыдущих запросов через UNION ALL (т.к. подмножества не пересекаются).


(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE ps.id is NULL)
UNION ALL
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE p.id is NULL)



(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id

WHERE ps.id is NULL)

UNION ALL

(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`

FROM `persons` p

RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id

WHERE p.id is NULL)



Данная запись опубликована в 19.09.2017 20:19 и размещена в mySQL.
Вы можете перейти в конец страницы и оставить ваш комментарий.

SQL оператор JOINS — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

В этом учебном материале вы узнаете, как использовать SQL JOINS с синтаксисом и примерами.

Описание

SQL JOINS используются для извлечения данных из нескольких таблиц. SQL JOIN выполняется всякий раз, когда две или более таблицы перечислены в операторе SQL.

Существует 4 различных типа соединений SQL:

Итак, давайте обсудим синтаксис SQL JOIN, рассмотрим наглядные иллюстрации SQL JOINS и рассмотрим несколько примеров.

SQL INNER JOIN (простое соединение)

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

Синтаксис

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

SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;

Рисунок.

На этом рисунке SQL INNER JOIN возвращает затененную область:

SQL INNER JOIN будет возвращать записи, где пересекаются table1 и table2.

Пример

Давайте рассмотрим пример использования INNER JOIN в запросе.

В этом примере у нас есть таблица customer и следующими данными:

customer_idfirst_namelast_namefavorite_website
4000JustinBiebergoogle.com
5000SelenaGomezbing.com
6000 MilaKunisyahoo.com
7000TomCruiseoracle.com
8000JohnnyDeppNULL
9000RussellCrowegoogle.com

И таблица orders со следующими данными:

order_idcustomer_idorder_date
170002019/06/18
250002019/06/18
380002019/06/19
440002019/06/20
5NULL2019/07/01

Выполним следующий SQL оператор:

SELECT customers.customer_id,
orders.order_id,
orders.order_date
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;



SELECT customers.customer_id,

       orders.order_id,

   orders.order_date

  FROM customers

INNER JOIN orders

    ON customers.customer_id = orders.customer_id

ORDER BY customers.customer_id;

Будет выбрано 4 записи. Вот результаты, которые вы должны получить:

customer_idorder_idorder_date
400042019/06/20
500022019/06/18
700012019/06/18
800032019/06/19

В этом примере будут возвращены все строки из таблиц customers и orders, в которых совпадают значения поля customer_id в обоих таблицах.

Строки, где значение customer_id равен 6000 и 9000 в таблице customers, будут опущены, поскольку они не существуют в обеих таблицах. Строка, в которой значение order_id равно 5 из таблицы orders, будет опущена, поскольку customer_id со значением NULL не существует в таблице customers.

SQL LEFT OUTER JOIN

Другой тип соединения называется LEFT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с левосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны (выполняется условие соединения).

Синтаксис

Синтаксис для LEFT OUTER JOIN в SQL:

SELECT columns
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column = table2.column;

В некоторых базах данных ключевое слово OUTER опущено и записывается просто как LEFT JOIN.

Рисунок

На этом рисунке SQL LEFT OUTER JOIN возвращает затененную область:

SQL LEFT OUTER JOIN возвращает все записи из table1 и только те записи из table2, которые пересекаются с table1.

Пример

Теперь давайте рассмотрим пример, который показывает, как использовать LEFT OUTER JOIN в операторе SELECT.

Используя ту же таблицу customers, что и в предыдущем примере:

customer_idfirst_namelast_namefavorite_website
4000JustinBiebergoogle.com
5000SelenaGomezbing.com
6000 MilaKunisyahoo.com
7000TomCruiseoracle.com
8000JohnnyDeppNULL
9000RussellCrowegoogle.com

И таблицу orders со следующими данными:

order_idcustomer_idorder_date
170002019/06/18
250002019/06/18
380002019/06/19
440002019/06/20
5NULL2019/07/01

Введите следующий SQL оператор:

SELECT customers.customer_id,
orders.order_id,
orders.order_date
FROM customers
LEFT OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;



SELECT customers.customer_id,

       orders.order_id,

       orders.order_date

  FROM customers

  LEFT OUTER JOIN orders

    ON customers.customer_id = orders.customer_id

ORDER BY customers.customer_id;

Будет выбрано 6 записей. Вот результаты, которые вы получите:

customer_idorder_idorder_date
400042019/06/20
500022019/06/18
6000NULLNULL
700012019/06/18
800032019/06/19
9000NULLNULL

Этот пример LEFT OUTER JOIN вернул бы все строки из таблицы customers и только те строки из таблицы orders, в которых объединенные поля равны.

Если значение customer_id в таблице customers не существует в таблице orders, все поля таблицы orders будут отображаться как NULL в наборе результатов. Как вы можете видеть, строки, где customer_id равен 6000 и 9000, будут включены в LEFT OUTER JOIN, но поля order_id и order_date отображают NULL.

SQL RIGHT OUTER JOIN JOIN

Другой тип соединения называется SQL RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с правосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны (выполняется условие соединения).

Синтаксис

Синтаксис для RIGHT OUTER JOIN в SQL:

SELECT columns
FROM table1
RIGHT [OUTER] JOIN table2
ON table1.column = table2.column;

В некоторых базах данных ключевое слово OUTER опущено и записывается просто как RIGHT JOIN.

Рисунок

На этом рисунке SQL RIGHT OUTER JOIN возвращает затененную область:

SQL RIGHT OUTER JOIN возвращает все записи из table2 и только те записи из table1, которые пересекаются с table2.

Пример

Теперь давайте рассмотрим пример, который показывает, как использовать RIGHT OUTER JOIN в операторе SELECT.

customer_idfirst_namelast_namefavorite_website
4000JustinBiebergoogle.com
5000SelenaGomezbing.com
6000 MilaKunisyahoo.com
7000TomCruiseoracle.com
8000JohnnyDeppNULL
9000RussellCrowegoogle.com

И таблицу orders со следующими данными:

order_idcustomer_idorder_date
170002019/06/18
250002019/06/18
380002019/06/19
440002019/06/20
5NULL2019/07/01

Введите следующий SQL оператор:

SELECT customers.customer_id,
orders.order_id,
orders.order_date
FROM customers
RIGHT OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;



SELECT customers.customer_id,

   orders.order_id,

   orders.order_date

  FROM customers

RIGHT OUTER JOIN orders

    ON customers.customer_id = orders.customer_id

ORDER BY customers.customer_id;

Будет выбрано 5 записей. Вот результаты, которые вы должны получить:

customer_idorder_idorder_date
NULL52019/07/01
400042019/06/20
500022019/06/18
700012019/06/18
800032019/06/19

Этот пример RIGHT OUTER JOIN вернул бы все строки из таблицы orders и только те строки из таблицы customers, где объединенные поля равны.

Если значение customer_id в таблице orders не существует в таблице customers, то все поля в таблице customers будут отображаться как NULL в наборе результатов. Как видите, строка, где order_id равен 5, будет включена в RIGHT OUTER JOIN, но в поле customer_id отображается NULL.

SQL FULL OUTER JOIN

Другой тип объединения называется SQL FULL OUTER JOIN. Этот тип объединения возвращает все строки из LEFT таблицы и RIGHT таблицы со значениями NULL в месте, где условие соединения не выполняется.

Синтаксис

Синтаксис для SQL FULL OUTER JOIN:

SELECT columns
FROM table1
FULL [OUTER] JOIN table2
ON table1.column = table2.column;

В некоторых базах данных ключевое слово OUTER опускается и записывается просто как FULL JOIN.

Рисунок

На этом рисунке SQL FULL OUTER JOIN возвращает затененную область:

SQL FULL OUTER JOIN возвращает все записи из таблиц table1 и table2.

Пример

Давайте рассмотрим пример, который показывает, как использовать FULL OUTER JOIN в операторе SELECT.

Используя ту же таблицу customers, что и в предыдущем примере:

customer_idfirst_namelast_namefavorite_website
4000JustinBiebergoogle.com
5000SelenaGomezbing.com
6000 MilaKunisyahoo.com
7000TomCruiseoracle.com
8000JohnnyDeppNULL
9000RussellCrowegoogle.com

И таблицу orders со следующими данными:

order_idcustomer_idorder_date
170002019/06/18
250002019/06/18
380002019/06/19
440002019/06/20
5NULL2019/07/01

Введите следующий SQL оператор:
SELECT customers.customer_id,
orders.order_id,
orders.order_date
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;

Будет выбрано 7 записей. Вот результаты, которые вы получите:

customer_idorder_idorder_date
NULL52019/07/01
400042019/06/20
500022019/06/18
6000NULLNULL
700012019/06/18
800032019/06/19
9000NULLNULL

Это пример FULL OUTER JOIN будет возвращать все строки из таблицы orders и все строки из таблицы customers. Всякий раз, когда условие соединения не выполняется, значение NULL будет распространяться на эти поля в наборе результатов. Это означает, что если значение customer_id в таблице customers не существует в таблице orders, то все поля в таблице orders будут отображаться в наборе результатов как NULL Кроме того, если значение customer_id в таблице orders не существует в таблице customers, то все поля в таблице customers будут отображаться в наборе результатов как NULL.

Как видите, строки, где customer_id равен 6000 и 9000, будут включены, но поля order_id и order_date для этих записей содержат значение NULL. Строка, где order_id равен 5, также будет включена, но поле customer_id для этой записи имеет значение NULL.

Руководство по SQL. INNER JOIN. – PROSELYTE

INNER JOIN является наиболее часто встречающимся и наиболее важным видом слияния данных.

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

Данный запрос имеет следующий вид:


SELECT таблица1.колонка1, таблица2.колонка2...
FROM таблица1
INNER JOIN таблицы2
ON таблицы1.общее_поле = таблица2.общее_поле;


Пример:

Предположим, что у нас есть две таблицы:
developers:


+----+-------------------+------------+------------+--------+
| ID | NAME              | SPECIALTY  | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
|  1 | Eugene Suleimanov | Java       |          2 |   2500 |
|  2 | Peter Romanenko   | Java       |          3 |   3500 |
|  3 | Andrei Komarov    | JavaScript |          3 |   2500 |
|  4 | Konstantin Geiko  | C#         |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX      |          2 |   1800 |
|  6 | Kolya Nikolaev    | Javascript |          5 |   3400 |
|  7 | Ivan Ivanov       | C#         |          1 |    900 |
|  8 | Ludmila Geiko     | UI/UX      |          2 |   1800 |
+----+-------------------+------------+------------+--------+


tasks:


+---------+-------------+------------------+------------+--------------+
| TASK_ID | TASK_NAME   | DESCRIPTION      | DEADLINE   | DEVELOPER_ID |
+---------+-------------+------------------+------------+--------------+
|       1 | Bug#123     | Fix company list | 2016-06-03 |            1 |
|       2 | Bug#321     | Fix registration | 2016-06-06 |            2 |
|       3 | Feature#777 | Latest actions   | 2016-06-25 |            3 |
+---------+-------------+------------------+------------+--------------+


Попробуем выполнить следующий запрос:


mysql> SELECT ID, NAME, TASK_NAME, DEADLINE 
FROM developers 
INNER JOIN tasks 
ON developers.ID = tasks.DEVELOPER_ID;


В результате мы получим следующую таблицу:


+----+-------------------+-------------+------------+
| ID | NAME              | TASK_NAME   | DEADLINE   |
+----+-------------------+-------------+------------+
|  1 | Eugene Suleimanov | Bug#123     | 2016-06-03 |
|  2 | Peter Romanenko   | Bug#321     | 2016-06-06 |
|  3 | Andrei Komarov    | Feature#777 | 2016-06-25 |
+----+-------------------+-------------+------------+


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

На этом мы заканчиваем изучение INNER JOIN.

SQL присоединяется к


SQL JOIN

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

Рассмотрим выборку из таблицы «Заказы»:

Код заказа Идентификатор клиента Дата заказа
10308 2 1996-09-18
10309 37 1996-09-19
10310 77 1996-09-20

Затем посмотрите на выбор из таблицы «Клиенты»:

Идентификатор клиента Имя клиента ContactName Страна
1 Альфредс Футтеркисте Мария Андерс Германия
2 Ana Trujillo Emparedados y helados Ана Трухильо Мексика
3 Антонио Морено Такерия Антонио Морено Мексика

Обратите внимание, что столбец «CustomerID» в таблице «Заказы» относится к
«CustomerID» в таблице «Клиенты».Связь между двумя таблицами выше
столбец «CustomerID».

Затем мы можем создать следующий оператор SQL (который содержит
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
),
который выбирает записи, которые имеют совпадающие значения в обеих таблицах:

Пример

ВЫБЕРИТЕ Orders.OrderID, Customers.CustomerName, Orders.OrderDate
ИЗ Orders
ВНУТРЕННЕЕ СОЕДИНЕНИЕ клиентов НА Orders.CustomerID = Customers.CustomerID;

Попробуй сам »

, и он выдаст что-то вроде этого:

Код заказа Имя клиента Дата заказа
10308 Ana Trujillo Emparedados y helados 18.09.1996
10365 Антонио Морено Такерия 27.11.1996
10383 Вокруг Рога 16.12.1996
10355 Вокруг Рога 15.11.1996
10278 Berglunds snabbköp 12.08.1996

Различные типы SQL JOIN

Вот различные типы JOIN в SQL:

  • (INNER) JOIN : возвращает записи, которые имеют совпадающие значения в обеих таблицах
  • LEFT (OUTER) JOIN : возвращает все записи из левой таблицы и соответствующие записи из правой таблицы
  • RIGHT (OUTER) JOIN : возвращает все записи из правой таблицы и сопоставленных
    записи из левой таблицы
  • ПОЛНОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ : возвращает все записи, если есть совпадение в любом из левых
    или правый стол

Пошаговое руководство по 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. Результатом этого соединения будет новый набор результатов, который возвращает совпадающие строки в обеих этих таблицах. В части пересечения, выделенной черным цветом ниже, показаны данные, полученные с помощью внутреннего соединения в SQL Server.

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

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

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

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

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

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

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

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

СОЗДАТЬ ТАБЛИЦУ [dbo]. [PizzaCompany]

(

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

[CompanyName] [varchar] (50),

[CompanyCity] [ varchar] (30)

)

УСТАНОВИТЬ IDENTITY_INSERT [dbo].[PizzaCompany] ВКЛ;

ВСТАВИТЬ В [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, ‘Papa johns’, ‘San Diego’);

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

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) ЗНАЧЕНИЯ (5, «Нино Пицца», «Лас-Вегас»);

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

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

ВЫБРАТЬ * ОТ PizzaКомпания:

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

14

18

СОЗДАТЬ ТАБЛИЦУ [dbo].[Foods]

(

[ItemId] INT PRIMARY KEY CLUSTERED,

[ItemName] Varchar (50),

[UnitsSold] int,

CompanyID int,

FOREIGN KEY (CompanyID) REFERENCES Pizza

)

ВСТАВИТЬ [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) ЗНАЧЕНИЯ (1, ‘Large Pizza’, 5,2)

INSERT INTO [dbo ]. [Продукты] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES (2, ‘Garlic Knots’, 6,3)

ВСТАВИТЬ В [dbo].[Продукты] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) ЗНАЧЕНИЯ (3, ‘Большая пицца’, 3,3)

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

INSERT INTO [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId ]) VALUES (5, ‘Breadsticks’, 7,1)

INSERT INTO [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId] »VALUES (6, ‘Medium Pizza’) , 11,1)

INSERT INTO [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES (7, ‘Маленькая пицца’, 9,6)

INSERT INTO [dbo].[Еда] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) ЗНАЧЕНИЯ (8, ‘Маленькая пицца’, 6,7)

ВЫБРАТЬ * ИЗ Foods

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

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

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

FROM PizzaCompany pz

INNER JOIN Foods ON f

CompanyId

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

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

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

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

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

СОЗДАТЬ ТАБЛИЦУ [dbo]. [WaterPark]

(

[WaterParkLocation] VARCHAR (50),

[CompanyId] int,

FOREIGN KEY (CompanyID) ССЫЛКИ PizzaSCompany (CompanyID)

IN [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Улица 14’, 1)

ВСТАВИТЬ В [dbo].[WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Boulevard 2’, 2)

ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Rogers 54’, 4)

ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Street 14’, 3)

ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Rogers 54’, 5)

ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Boulevard 2’, 5)

ВЫБРАТЬ * ИЗ WaterPark

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

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

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

SELECT pz.CompanyId, pz.CompanyCity, pz.CompanyName, f.ItemName, f.UnitsSold,

w.WaterParkLocation

ОТ PizzaCompany pz

INNER JOIN Foodpanys f ON pz.CompanyId =

ПРИСОЕДИНЯЙТЕСЬ к аквапарку 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 для проданных единиц.

SELECT pz.CompanyId, pz.CompanyCity, pz.CompanyName, f.ItemName, f.UnitsSold

FROM PizzaCompany pz

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

WHERE f.U

ЗАКАЗАТЬ pz.КомпанияCity

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

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

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

SELECT pz.CompanyCity, pz.CompanyName, SUM (f.UnitsSold) AS TotalQuantitySold

FROM PizzaCompany pz

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

GROUP BY pz.CompanyCity

ЗАКАЗАТЬ pz.CompanyCity

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

Краткое описание Equi и Theta Join

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

Equi Присоединиться

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

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

ВЫБРАТЬ e.EmployeeKey, e.FirstName, e.Title, e.HireDate,

fs.SalesAmountQuota ОТ DimEmployee e

INNER JOIN FactSalesQuota fs

ON e.EmployeeKey = fs.Employee22Key

Theta Join (Неравномерное соединение)

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

ВЫБРАТЬ * ИЗ Таблица1 T1, Таблица2 T2 ГДЕ T1.ProductCost

Заключение

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

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

Гаури является специалистом по SQL Server и имеет более 6 лет опыта работы с международными международными консалтинговыми и технологическими организациями. Она очень увлечена работой над такими темами SQL Server, как База данных SQL Azure, Службы отчетов SQL Server, R, Python, Power BI, ядро ​​базы данных и т. Д. Она имеет многолетний опыт работы с технической документацией и увлекается разработкой технологий.

Она имеет большой опыт в разработке решений для данных и аналитики, а также в обеспечении их стабильности, надежности и производительности. Она также сертифицирована по SQL Server и прошла такие сертификаты, как 70-463: Внедрение хранилищ данных с Microsoft SQL Server.

Посмотреть все сообщения от Gauri Mahajan

Последние сообщения от Gauri Mahajan (посмотреть все)

Внутреннее объединение SQL Server на практических примерах

Резюме : в этом руководстве вы узнаете, как использовать предложение SQL Server INNER JOIN для запроса данных из нескольких таблиц.

Введение в SQL Server

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

Внутреннее соединение — одно из наиболее часто используемых соединений в SQL Server. Предложение внутреннего соединения позволяет запрашивать данные из двух или более связанных таблиц.

См. Следующие продукты Категории и таблицы:

Следующий оператор извлекает информацию о продукте из таблицы production.products :

 

SELECT наименование товара, список цен, category_id ИЗ производство.продукты СОРТИРОВАТЬ ПО product_name DESC;

Язык кода: SQL (язык структурированных запросов) (sql)

Запрос возвратил только список идентификационных номеров категорий, но не названия категорий. Чтобы включить имена категорий в набор результатов, используйте предложение INNER JOIN следующим образом:

 

SELECT наименование товара, category_name, список цен ИЗ production.products p ВНУТРЕННЕЕ СОЕДИНЕНИЕ production.categories c ВКЛ c.category_id = p.category_id СОРТИРОВАТЬ ПО product_name DESC;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом запросе:

c и p — это псевдонимы таблиц production.categories и production.products таблиц . Таким образом, когда вы ссылаетесь на столбец в этой таблице, вы можете использовать псевдоним . Имя_столбца вместо имя_таблицы.имя_столбца . Например, в запросе используется c.category_id вместо production.categories.category_id . Следовательно, это избавляет вас от набора текста.

Для каждой строки в таблице production.products предложение внутреннего соединения сопоставляет его с каждой строкой в ​​таблице product.categories на основе значений столбца category_id :

  • Если в обеих строках есть то же значение в столбце category_id , внутреннее соединение формирует новую строку, столбцы которой взяты из строк продукции .категории и production.products таблиц в соответствии со столбцами в списке выбора и включают эту новую строку в набор результатов.
  • Если строка в таблице production.products не соответствует строке из таблицы production.categories , предложение внутреннего соединения просто вставляет эти строки и не включает их в набор результатов.

SQL Server

INNER JOIN синтаксис

Ниже показан синтаксис предложения SQL Server INNER JOIN :

 

SELECT select_list ИЗ Т1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ T2 ON join_predicate;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом синтаксисе запрос извлекает данные из таблиц T1 и T2:

  • Сначала укажите основную таблицу (T1) в FROM пункт
  • Во-вторых, укажите вторую таблицу в предложении INNER JOIN (T2) и предикате соединения.В набор результатов включаются только строки, которые заставляют предикат соединения оцениваться как ИСТИНА .

Предложение INNER JOIN сравнивает каждую строку таблицы T1 со строками таблицы T2, чтобы найти все пары строк, которые удовлетворяют предикату соединения. Если предикат соединения оценивается как ИСТИНА , значения столбцов совпадающих строк T1 и T2 объединяются в новую строку и включаются в набор результатов.

В следующей таблице показано внутреннее соединение двух таблиц T1 (1,2,3) и T2 (A, B, C).Результат включает строки: (2, A) и (3, B), поскольку они имеют одинаковые шаблоны.

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

 

SELECT select_list ИЗ Т1 ПРИСОЕДИНЯЙТЕСЬ к T2 ON join_predicate;

Язык кода: SQL (язык структурированных запросов) (sql)

Дополнительные примеры внутреннего соединения SQL Server

См. Следующие таблицы продуктов , категорий и брендов :

В следующем утверждении используются два INNER JOIN предложений для запроса данных из трех таблиц:

 

SELECT наименование товара, category_name, имя бренда, список цен ИЗ производство.продукты p ВНУТРЕННЕЕ СОЕДИНЕНИЕ production.categories c ON c.category_id = p.category_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ production.brands b ON b.brand_id = p.brand_id СОРТИРОВАТЬ ПО product_name DESC;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом руководстве вы узнали, как использовать предложение SQL Server INNER JOIN для запроса данных из нескольких таблиц.

SQL INNER JOIN — объединение двух или более таблиц

Сводка : в этом руководстве вы узнаете, как запрашивать данные из нескольких таблиц с помощью оператора SQL INNER JOIN .

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

SQL предоставляет несколько типов соединений, таких как внутреннее соединение, внешнее соединение (левое внешнее соединение или левое соединение, правое внешнее соединение или правое соединение и полное внешнее соединение) и самостоятельное соединение. В этом руководстве мы покажем вам, как использовать предложение INNER JOIN .

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

Ниже показан синтаксис INNER JOIN для соединения двух таблиц:

 

SELECT столбец1, столбец2 ИЗ Таблица 1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ table_2 ON условие_соединения;

Давайте рассмотрим синтаксис выше более подробно:

  • table_1 и table_2 называются соединенными таблицами.
  • Для каждой строки в table_1 запрос находит соответствующую строку в table_2 , которая удовлетворяет условию соединения . Если соответствующая строка найдена, запрос возвращает строку, содержащую данные из обеих таблиц . В противном случае он проверяет следующую строку в table_1 , и этот процесс продолжается до тех пор, пока не будут проверены все строки в table_1 .

Для объединения более двух таблиц применяется та же логика.

Примеры SQL INNER JOIN

SQL INNER JOIN — пример запроса данных из двух таблиц

В этом примере мы будем использовать таблицы продуктов и категорий в образце базы данных.На следующем рисунке показана схема базы данных.

На диаграмме выше:

  • В одной категории может быть много товаров.
  • Один товар относится к одной и только одной категории.

Следовательно, между строками в таблице категорий и строками в таблице продуктов существует отношение «многие к одному». Связью между двумя таблицами является столбец categoryid .

Нам нужно запросить следующие данные из обеих таблиц:

  • productID , productName из таблицы products .
  • categoryName из таблицы категорий .

Следующий запрос извлекает данные из обеих таблиц:

 

SELECT productID, productName, categoryName ИЗ продукты ВНУТРЕННЕЕ СОЕДИНЕНИЕ категории НА category.categoryID = products.categoryID;

Условие соединения указывается в предложении INNER JOIN после ключевого слова ON в виде выражения:

 

категорий.categoryID = products.categoryID

Для каждой строки в таблице products запрос находит соответствующую строку в таблице категорий с таким же идентификатором категории . Если есть совпадение между двумя строками в обеих таблицах, он возвращает строку, содержащую столбцы, указанные в предложении SELECT, то есть идентификатор продукта, имя продукта и имя категории; в противном случае он проверяет следующую строку в таблице продуктов , чтобы найти соответствующую строку в таблице категорий .Этот процесс продолжается до тех пор, пока не будет исследована последняя строка таблицы продуктов.

SQL INNER JOIN — запрос данных из трех таблиц

Мы можем использовать те же методы для соединения трех таблиц. Следующий запрос выбирает productID , productName , categoryName и поставщик из продуктов , категорий и поставщиков таблиц:

 

SELECT идантификационный номер продукта, наименование товара, categoryName, companyName AS поставщик ИЗ продукты ВНУТРЕННЕЕ СОЕДИНЕНИЕ категории ПО категории.categoryID = products.categoryID ВНУТРЕННЕЕ СОЕДИНЕНИЕ Поставщики ON suppliers.supplierID = products.supplierID

Язык кода: PHP (php)

Неявное ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL

Существует еще одна форма INNER JOIN , называемая неявным внутренним соединением, как показано ниже:

 

ВЫБРАТЬ столбец1, столбец2 ИЗ Таблица 1, Таблица 2 КУДА join_condition;

В этой форме вы указываете все объединяемые таблицы в предложении FROM и помещаете условие соединения в предложение WHERE оператора SELECT .Мы можем переписать приведенный выше пример запроса, используя неявное INNER JOIN следующим образом:

 

SELECT productID, productName, categoryName ИЗ товары, категории КУДА products.categoryID = category.categoryID;

Визуализируйте INNER JOIN с помощью диаграммы Венна

Мы можем использовать диаграмму Венна, чтобы проиллюстрировать, как работает INNER JOIN. SQL INNER JOIN возвращает все строки в таблице 1 (левая таблица), которым соответствуют строки в таблице 2 (правая таблица).

В этом руководстве мы показали вам, как использовать предложение SQL INNER JOIN для выбора данных из двух или более таблиц на основе указанного условия соединения.

SQL ВНУТРЕННЕЕ СОЕДИНЕНИЕ — w3resource

Что такое внутреннее соединение в SQL?

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

Синтаксис:

 ВЫБРАТЬ *
ИЗ table1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ table2
ON table1.column_name = table2.column_name;
 

ИЛИ

 ВЫБРАТЬ *
ИЗ table1
ПРИСОЕДИНЯЙТЕСЬ к таблице2
ON table1.column_name = table2.column_name;
 

Изображение:

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

Синтаксическая диаграмма — INNER JOIN

Пример: SQL INNER JOIN между двумя таблицами

Вот пример внутреннего соединения в SQL между двумя таблицами.

Образец таблицы: продукты

Образец таблицы: компания

Чтобы объединить название товара, столбцы единиц товара из таблицы пищевых продуктов и название компании, столбцы города компании из таблицы компании, со следующим условием —

1. company_id продуктов питания и таблица компании должны совпадать,

можно использовать следующий оператор SQL:

Код SQL:

  ВЫБЕРИТЕ foods.item_name, foods.item_unit,
Компания.company_name, company.company_city
Из продуктов
Компания INNER JOIN
НА food.company_id = company.company_id;
  

Выход:

 ITEM_NAME ITEM_ COMPANY_NAME COMPANY_CITY
------------------------- ----- -------------------- ----- --------------
Chex Mix Pcs Akas Foods Дели
Cheez-It Pcs Jack Hill Ltd Лондон
BN Biscuit Pcs Jack Hill Ltd Лондон
Mighty Munch Pcs Foodies.Лондон
Pot Rice Pcs Jack Hill Ltd Лондон
Jaffa Cakes Pcs Заказать Весь Бостон
 

Пример SQL INNER JOIN с использованием ключевого слова JOIN

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

1. идентификатор компании продуктов питания и идентификатор компании таблицы компании должны совпадать,

можно использовать следующий оператор SQL:

Код SQL:

  ВЫБЕРИТЕ продукты.item_name, foods.item_unit,
company.com название_компании, company.company_city
Из продуктов
ПРИСОЕДИНЯЙТЕСЬ к компании
НА food.company_id = company.company_id;
  

Выход:

 ITEM_NAME ITEM_ COMPANY_NAME COMPANY_CITY
------------------------- ----- -------------------- ----- -------------
Chex Mix Pcs Akas Foods Дели
Cheez-It Pcs Jack Hill Ltd Лондон
BN Biscuit Pcs Jack Hill Ltd Лондон
Mighty Munch Pcs Foodies.Лондон
Pot Rice Pcs Jack Hill Ltd Лондон
Jaffa Cakes Pcs Заказать Весь Бостон
 

Изображение:

SQL INNER JOIN для всех столбцов

Чтобы после присоединения получить все столбцы из таблицы food и company, с условием —

1. идентификатор компании продуктов питания и идентификатор компании таблицы компании должны совпадать,

можно использовать следующий оператор SQL:

Код SQL:

  ВЫБРАТЬ *
Из продуктов
ПРИСОЕДИНЯЙТЕСЬ к компании
НА продукты.company_id = company.company_id;
  

Выход:

 ITEM_ID ITEM_NAME ITEM_ COMPAN COMPAN COMPANY_NAME COMPANY_CITY
-------- ------------------------- ----- ------ ------ ------------------------- -------------
1 Chex Mix шт 16 16 Akas Foods Delhi
6 шт. Cheez-It 15 15 Jack Hill Ltd Лондон
2 BN Biscuit Pcs 15 15 Jack Hill Ltd Лондон
3 Mighty Munch Pcs 17 17 Foodies.Лондон
Рис 4 шт. 15 15 Jack Hill Ltd Лондон
5 Jaffa Cakes шт 18 18 Заказать весь Бостон
 

Разница между JOIN и INNER JOIN

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

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

Внутреннее соединение A и B дает результат A пересечения B, то есть внутреннюю часть пересечения диаграммы Венна.

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

Использование предложения JOIN

  ВЫБРАТЬ * ИЗ
Таблица1 JOIN Table2
ВКЛ Таблица1.имя_столбца = Таблица2.имя_столбца;
  

Использование предложения INNER JOIN

  ВЫБРАТЬ *
ИЗ Table1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Table2
ON Table1.column_name = Table2.column_name;  

Разница между INNER JOIN и OUTER JOIN

ВНУТРЕННЕЕ СОЕДИНЕНИЕ — это такой тип соединения, которое возвращает все строки из обеих участвующих таблиц, где ключевая запись одной таблицы равна ключевым записям другой таблицы. Для этого типа соединения требуется оператор сравнения для сопоставления строк из участвующих таблиц на основе общего поля или столбца обеих таблиц.

Где, поскольку ВНЕШНЕЕ СОЕДИНЕНИЕ возвращает все строки из участвующих таблиц, которые удовлетворяют условию, а также те строки, которые не соответствуют условию, появятся в этой операции. Этот набор результатов может отображаться в трех типах формата —

Первый — LEFT OUTER JOIN, в это соединение входят все строки из левой таблицы предложения JOIN и несопоставленные строки из правой таблицы со значениями NULL для выбранных столбцов.

Второй — RIGHT OUTER JOIN, в это соединение входят все строки справа от причины JOIN и несопоставленные строки из левой таблицы со значениями NULL для выбранных столбцов.

Последний в FULL OUTER JOIN в этом соединении включает совпадающие строки из левой и правой таблиц предложения JOIN и несопоставленные строки из левой и правой таблицы со значениями NULL для выбранных столбцов.

Пример:

Вот две таблицы tableX и tableY , и в каждой из них нет повторяющихся строк. В tableX значения (A, B) уникальны, а в tableY значения (E, F) уникальны, но значения (C и D) являются общими в обеих таблицах.

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

  ВЫБРАТЬ *
ИЗ tableX
ВНУТРЕННЕЕ СОЕДИНЕНИЕ tableY на tableX.X = tableY.Y;  

или

  ВЫБРАТЬ tableX. *, TableY. *
ИЗ tableX, tableY
ГДЕ tableX.X = tableY.Y;  

Выход:

Здесь в наборе результатов появилось только совпадение tableX и tableY .

Вот ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ

  ВЫБРАТЬ tableX.*, таблицаY. *
ИЗ tableX, tableY
ГДЕ tableX.X = tableY.Y (+)  

или

  ВЫБРАТЬ *
ИЗ tableX
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ tableY ON tableX.X = tableY.Y  

Выход:

Здесь появились все строки из tableX , которые находятся слева от предложения JOIN, и все строки со значениями NULL для несовпадающих столбцов из tableY , которые находятся справа от предложения JOIN.

Вот ПРАВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ

  ВЫБРАТЬ * ИЗ tableX
ПРАВО ВНЕШНЕЕ СОЕДИНЕНИЕ tableY ON tableX.X = таблицаY.Y  

Выход:

Здесь появились все строки из tableY , который является правой частью предложения JOIN, и все строки со значениями NULL для несовпадающих столбцов из tableX , который находится слева от предложения JOIN.

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

  ВЫБРАТЬ *
ИЗ tableX
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ tableY ON tableX.X = tableY.Y  

Выход:

Здесь появились все совпадающие строки из tableX и tableY и все несопоставленные строки со значениями NULL для обеих таблиц.

INNER JOIN ON vs WHERE clause

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

Связывание между двумя или более таблицами должно выполняться с помощью предложения INNER JOIN ON, но фильтрация по отдельным элементам данных должна выполняться с помощью предложения WHERE.

INNER JOIN — это синтаксис ANSI, тогда как синтаксис WHERE более ориентирован на реляционную модель.

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

ВНУТРЕННИЕ СОЕДИНЕНИЯ: реляционные базы данных

Ключевые моменты, которые следует запомнить

Нажмите на следующую ссылку, чтобы просмотреть слайды —

Выходные данные указанного оператора SQL, показанного здесь, получены с помощью Oracle Database 10g Express Edition.

Практика выполнения упражнений SQL

Хотите улучшить статью выше? Публикуйте свои заметки / комментарии / примеры через Disqus.

Предыдущая: SQL NON EQUI JOIN
Следующая: SQL NATURAL JOIN

SQL | Объединение (внутреннее, левое, правое и полное объединение)

Оператор объединения SQL используется для объединения данных или строк из двух или более таблиц на основе общего поля между ними. Различные типы соединений:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL JOIN

Рассмотрим две таблицы ниже:

Student

912

Самым простым соединением является ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

  1. INNER JOIN: Ключевое слово INNER JOIN выбирает все строки из обеих таблиц, пока выполняется условие. Это ключевое слово создаст набор результатов путем объединения всех строк из обеих таблиц, которым удовлетворяет условие, т.е. значение общего поля будет таким же.
    Синтаксис :
     ВЫБРАТЬ table1.column1, table1.column2, table2.column1, ....
    ИЗ table1
    INNER JOIN table2
    ON table1.matching_column = table2.matching_column;
    
    
      table1 : Первая таблица. table2 : Вторая таблица
      соответствующий_столбец : столбец, общий для обеих таблиц.
     

    Примечание : мы также можем написать JOIN вместо INNER JOIN. JOIN — это то же самое, что и INNER JOIN.

    Примеры запросов (INNER JOIN)

    • Этот запрос покажет имена и возраст студентов, обучающихся на разных курсах.
       ВЫБЕРИТЕ StudentCourse.COURSE_ID, Student.NAME, Student.AGE ОТ студента
      INNER JOIN StudentCourse
      ПО Студент.ROLL_NO = StudentCourse.ROLL_NO;
       

      Выходные данные :

  2. LEFT JOIN : это соединение возвращает все строки таблицы с левой стороны соединения и соответствующие строки для таблицы с правой стороны соединения. Строки, для которых нет соответствующей строки с правой стороны, набор результатов будет содержать null . LEFT JOIN также известен как LEFT OUTER JOIN. Синтаксис:
     SELECT table1.column1, table1.column2, table2.column1 ,....
    ИЗ table1
    LEFT JOIN table2
    ON table1.matching_column = table2.matching_column;
    
    
    table1: Первая таблица.
    table2: Вторая таблица
    Match_column: столбец, общий для обеих таблиц.
     

    Примечание : Мы также можем использовать LEFT OUTER JOIN вместо LEFT JOIN, оба они одинаковы.

    Примеры запросов (LEFT JOIN) :

     SELECT Student.NAME, StudentCourse.COURSE_ID
    ОТ Студента
    ВЛЕВО ПРИСОЕДИНЯТЬСЯ к курсу студента
    ПО StudentCourse.ROLL_NO = Студент.ROLL_NO;
     

    Выход :

  3. RIGHT JOIN : RIGHT JOIN аналогичен LEFT JOIN. Это соединение возвращает все строки таблицы с правой стороны соединения и соответствующие строки для таблицы с левой стороны соединения. Строки, для которых нет соответствующей строки с левой стороны, набор результатов будет содержать null . RIGHT JOIN также известен как RIGHT OUTER JOIN. Синтаксис:
     ВЫБРАТЬ table1.column1, table1.column2, table2.column1, ....
    ИЗ table1
    RIGHT JOIN table2
    ON table1.matching_column = table2.matching_column;
    
    
    table1: Первая таблица.
    table2: Вторая таблица
    Match_column: столбец, общий для обеих таблиц.
     

    Примечание : Мы также можем использовать RIGHT OUTER JOIN вместо RIGHT JOIN, оба они одинаковы.

    Примеры запросов (RIGHT JOIN) :

     SELECT Student.NAME, StudentCourse.COURSE_ID
    ОТ Студента
    ПРАВО ПРИСОЕДИНИТЬСЯ к курсу
    ПО StudentCourse.ROLL_NO = Студент.ROLL_NO;
     

    Выход:

  4. FULL JOIN: FULL JOIN создает набор результатов путем объединения результатов LEFT JOIN и RIGHT JOIN. Набор результатов будет содержать все строки из обеих таблиц. Строки, для которых нет соответствия, набор результатов будет содержать значений NULL . Синтаксис:
     ВЫБРАТЬ table1.column1, table1.column2, table2.column1, ....
    ИЗ table1
    FULL JOIN table2
    НА table1.match_column = table2.matching_column;
    
    
    table1: Первая таблица.
    table2: Вторая таблица
    Match_column: столбец, общий для обеих таблиц.
     

    Примеры запросов (ПОЛНОЕ СОЕДИНЕНИЕ) :

     SELECT Student.NAME, StudentCourse.COURSE_ID
    ОТ Студента
    FULL JOIN StudentCourse
    НА StudentCourse.ROLL_NO = Student.ROLL_NO;
     

    Выход:


Левое СОЕДИНЕНИЕ (видео)
Правое СОЕДИНЕНИЕ (видео)
Полное СОЕДИНЕНИЕ (видео)
SQL | JOIN (декартово соединение, самосоединение)

Автор статьи: Harsh Agarwal .Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарий, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.

Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями теории CS для собеседований SDE с курсом CS Theory Course по приемлемой для студентов цене и будьте готовы к отрасли.

SQL INNER JOIN | Средний уровень SQL

Начиная с этого места? Этот урок является частью полного руководства по использованию SQL для анализа данных. Проверьте начало.

В этом уроке мы рассмотрим:

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

На предыдущем уроке вы изучили основы SQL-соединений, используя данные об игроках в американский футбол. Все игроки в таблице игроков соответствуют одной школе в таблице команд .Но что, если данные не такие чистые? Что делать, если в таблице команд есть несколько школ с одинаковым названием? Или если игрок ходит в школу, которой нет в таблице команд ?

Если в таблице команд есть несколько школ с одинаковым именем, каждая из этих строк будет объединена с соответствующими строками в таблице игроков . Возвращаясь к предыдущему примеру с Майклом Кампанаро, если бы было три строки в таблице команд , где school_name = 'Wake Forest' , запрос соединения выше вернул бы три строки с Майклом Кампанаро.

Часто бывает, что одна или обе объединяемые таблицы содержат строки, не совпадающие с другой таблицей. Способ обработки зависит от того, делаете ли вы внутренним соединением или внешним соединением .

Начнем с внутренних объединений, которые можно записать как JOIN benn.college_football_teams team или INNER JOIN benn.college_football_teams team . Внутренние соединения удаляют строки из обеих таблиц, которые не удовлетворяют условию соединения, изложенному в операторе ON .С математической точки зрения внутреннее соединение — это пересечение двух таблиц.

Следовательно, если игрок идет в школу, которой нет в таблице команд , этот игрок не будет включен в результат внутреннего соединения. Точно так же, если есть школы в таблице команд , которые не соответствуют ни одной школе в таблице игроков , эти строки также не будут включены в результаты.

Объединение таблиц с одинаковыми именами столбцов

При объединении двух таблиц может случиться так, что в обеих таблицах будут столбцы с одинаковыми именами.В приведенном ниже примере в обеих таблицах есть столбцы с именем school_name :

.

  ВЫБРАТЬ игроков. *,
       команды. *
  ОТ игроков benn.college_football_players
  ПРИСОЕДИНЯЙТЕСЬ к командам benn.college_football_teams
    ON team.school_name = player.school_name
  

Результаты могут поддерживать только один столбец с заданным именем — когда вы включаете 2 столбца с одинаковым именем, результаты будут просто отображать один и тот же набор результатов для обоих столбцов , даже если эти два столбца должны содержать разные данные .Вы можете избежать этого, назвав столбцы индивидуально. Бывает, что эти два столбца фактически содержат одни и те же данные, потому что они используются для ключа соединения, но следующий запрос технически позволяет этим столбцам быть независимыми:

  ВЫБРАТЬ player.school_name AS player_school_name,
       team.school_name AS team_school_name
  ОТ игроков benn.college_football_players
  ПРИСОЕДИНЯЙТЕСЬ к командам benn.college_football_teams
    ON team.school_name = player.school_name
  

Отточите свои навыки работы с SQL

Практическая задача

Напишите запрос, который отображает имена игроков, названия школ и конференции для школ в дивизионе «FBS (Division I-A Teams)».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *