Sql inner join примеры: Команда INNER JOIN — связывание таблиц

Содержание

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

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

Синтаксис

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

Примеры

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

Таблица countries:

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

Таблица cities:

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

Пример

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

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Россия

Команда UNION — слияние таблиц

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

При объединении количество столбцов во всех таблицах должно совпадать, иначе будет ошибка

Имена столбцов будут такие же, как в основной таблице, в которую добавляются данные из других таблиц.

Внимание: если не используется ключевое слово ALL для UNION, все возвращенные строки будут уникальными, так как по умолчанию подразумевается DISTINCT, который удаляет неуникальные значения.

Чтобы отменить такое поведение — нужно указать ключевое слово ALL, вот так: UNION ALL.

См. также команду JOIN, которая объединяет связанные таблицы.

Синтаксис

С удалением дублей:

SELECT * FROM имя_таблицы1 WHERE условие
	UNION SELECT * FROM имя_таблицы2 WHERE условие

Без удаления дублей:

SELECT * FROM имя_таблицы1 WHERE условие
	UNION ALL SELECT * FROM имя_таблицы2 WHERE условие

Можно объединять не две таблицы, а три или более:

SELECT * FROM имя_таблицы1 WHERE условие
	UNION SELECT * FROM имя_таблицы2 WHERE условие
	UNION SELECT * FROM имя_таблицы3 WHERE условие
	UNION SELECT * FROM имя_таблицы4 WHERE условие

Примеры

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

Таблица countries:

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

Таблица cities:

id
айди
name
название
country_id
айди страны
1Минск1
2Минск1
3Москва2
4Киев3

Пример

В данном примере объединяются записи из двух таблиц:

SELECT id, name FROM countries UNION ALL SELECT id, name FROM cities

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

id
айди
name
название
1Беларусь
2Россия
3Украина
1Минск
2Минск
3Москва
4Киев

Пример

В данном примере отсутствует ключевое слово ALL, однако дубли не будут удалены, так как дублями считается полное совпадение строк:

SELECT id, name FROM countries UNION SELECT id, name FROM cities

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

id
айди
name
название
1Беларусь
2Россия
3Украина
1Минск
2Минск
3Москва
4Киев

Пример

А вот теперь дубли будут удалены (из двух Минсков останется один), так как будет иметь место полное совпадение строк (потому что поле осталось одно, но это не обязательно):

SELECT name FROM countries UNION SELECT name FROM cities

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

name
название
Беларусь
Россия
Украина
Минск
Москва
Киев

Пример

А теперь добавим слово ALL — и дубли не будут удалятся:

SELECT name FROM countries UNION ALL SELECT name FROM cities

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

name
название
Беларусь
Россия
Украина
Минск
Минск
Москва
Киев

Пример

В данном примере демонстрируется работа условий WHERE в комбинации с UNION:

SELECT id, name FROM countries WHERE id>=2
	UNION SELECT id, name FROM cities WHERE id

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

id
айди
name
имя
2Россия
3Украина
1Минск
2Минск

Пример

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

SELECT id as country_id, name as country_name FROM countries
 	UNION SELECT id, name FROM cities

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

country_id
айди
country_name
имя
1Беларусь
2Россия
3Украина
1Минск1
2Минск1
3Москва2
4Киев3

Пример

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

SELECT id, name FROM countries UNION SELECT id, name, country_id FROM cities

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

SELECT * FROM countries UNION SELECT * FROM cities

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

К примеру, мы хотим забрать 3 поля из второй таблицы, а в первой таблице полей только 2. Решим эту проблему создав поле с именем country_id и содержимым 0 для первой таблицы (вот так: 0 as country_id):

SELECT id, name, 0 as country_id FROM countries
	UNION SELECT id, name, country_id FROM cities

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

id
айди
name
имя
country_id
айди страны
1Беларусь0
2Россия0
3Украина0
1Минск1
2Минск1
3Москва2
4Киев3

Соединение таблиц или действие оператора SQL JOIN на примерах : WEBCodius

Оператор JOIN используется для соединения двух или нескольких таблиц. Соединение таблиц может быть внутренним (INNER) или внешним (OUTER), причем внешнее соединение может быть левым (LEFT), правым (RIGHT) или полным (FULL). Далее на примере двух таблиц рассмотрим различные варианты их соединения.

Синтаксис соединения таблиц оператором JOIN имеет вид:

FROM <таблица 1>
 [INNER]
 {{LEFT | RIGHT | FULL } [OUTER]} JOIN <таблица 2>
[ON <предикат>]

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

Допустим есть две таблицы (Auto слева и Selling справа), в каждой по четыре записи. Одна таблица содержит названия марок автомобилей (Auto), вторая количество проданных автомобилей (Selling):

id   name          id   sum
--   ----          --   ----
1    bmw           1    250
2    opel          5    450
3    kia           3    300
4    audi          6    400

Далее соединим эти таблицы по полю id несколькими различными способами. Совпадающие значения выделены красным для лучшего восприятия.

1. Внутреннее соединение (INNER JOIN) означает, что в результирующий набор попадут только те соединения строк двух таблиц, для которых значение предиката равно TRUE. Обычно используется для объединения записей, которые есть и в первой и во второй таблице, т. е. получения пересечения таблиц:

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

Итак, сам запрос:

SELECT * FROM 'Auto'
INNER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id

И результат:

id   name          id   sum
--   ----          --   ----
1    bmw           1    250
3    kia           3    300

Ключевое слово INNER в запросе можно опустить.

В итоге запрос отбирает и соединяет те записи, у которых значение поля id в обоих таблицах совпадает.

2. Внешнее соединение

(OUTER JOIN) бывает нескольких видов. Первым рассмотрим полное внешнее объединение (FULL OUTER JOIN), которое объединяет записи из обоих таблиц (если условие объединения равно true) и дополняет их всеми записями из обоих таблиц, которые не имеют совпадений. Для записей, которые не имеют совпадений из другой таблицы, недостающее поле будет иметь значение NULL. Граф выборки записей будет иметь вид:

Переходим к запросу:

SELECT * FROM 'Auto'
FULL OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id

Результат:

id   name          id   sum
--   ----          --   ----
1    bmw           1    250
2    opel        NULL   NULL
3    kia           3    300
4    audi        NULL   NULL
NULL NULL          5    450
NULL NULL          6    400

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

Ключевое слово OUTER можно опустить.

3. Левое внешнее объединение (LEFT OUTER JOIN). В этом случае получаем все записи удовлетворяющие условию объединения, плюс все оставшиеся записи из внешней таблицы, которые не удовлетворяют условию объединения. Граф выборки:

Запрос:

SELECT * FROM 'Auto'
LEFT OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id

Результат:

id   name          id   sum
--   ----          --   ----
1    bmw           1    250
2    opel        NULL   NULL
3    kia           3    300
4    audi        NULL   NULL

Запрос также можно писать без ключевого слова OUTER.

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

Еще существует правое внешнее объединение (RIGHT OUTER JOIN). Оно работает точно также как и левое объединение, только  в качестве внешней таблицы будет использоваться правая (в нашем случае таблица Selling или таблица Б на графе).

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

4. Получить все записи из таблицы А, которые не имеют объединения из таблицы Б. Граф:

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

Запрос:

SELECT * FROM 'Auto'
LEFT OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id
WHERE 'Selling'.id IS null

Результат:

id   name          id   sum
--   ----          --   ----
2    opel        NULL   NULL
4    audi        NULL   NULL

5. И последний вариант, получить все записи из таблицы А и Таблицы Б, которые не имеют объединений. Граф:

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

Запрос:

SELECT * FROM 'Auto'
FULL OUTER JOIN 'Selling'
ON 'Auto'.id = 'Selling'.id
WHERE 'Auto'.id IS null
OR 'Selling'.id IS null

Результат:

id   name          id   sum
--   ----          --   ----
2    opel        NULL   NULL
4    audi        NULL   NULL
NULL NULL          5    450
NULL NULL          6    400

На этом все, до новых встреч на страницах блога.

Операция INNER JOIN

Синтаксис

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

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

Часть

Описание

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

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

поле1, поле2

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

compopr

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

Замечания

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

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

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

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

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

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

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

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

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

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

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

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

INNER JOIN, 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 оператор 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 на объединение данных из разных таблиц

На уроке будут рассмотрены запросы SQL INNER JOIN на объединение таблиц. Будут разобраны конкретные примеры запросов

Выборка из нескольких таблиц (неявная операция соединения)

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

Рассмотрим пример неявной операции соединения:

Пример: БД Компьютерные курсы.
Необходимо выбрать имена преподавателей, учебную группу и курс, на котором они преподают. Условием отбора должно являться одинаковое значение полей Учебная группа в таблицах Список и Группы.

✍ Решение: 

1
2
3
4
5
SELECT DISTINCT группы.`Преподаватель` , 
   список.`Учебная группа` , список.`курс` 
FROM группы, список
WHERE группы.`Учебная группа` = список.`Учебная группа` 
AND курс <3

SELECT DISTINCT группы.`Преподаватель` , список.`Учебная группа` , список.`курс` FROM группы, список WHERE группы.`Учебная группа` = список.`Учебная группа` AND курс <3

✍ Решение: 

1
2
3
4
SELECT DISTINCT pc.Номер, Производитель
FROM  pc, product
WHERE pc.Номер = product.Номер
AND  Цена <30000

SELECT DISTINCT pc.Номер, Производитель FROM pc, product WHERE pc.Номер = product.Номер AND Цена <30000

Sql tables 1. БД Компьютерный магазин. Укажите производителя и скорость для тех компьютеров, которые имеют жесткий диск объемом не менее 1000 Гб.

Иногда в предложении FROM требуется указать одну и ту же таблицу несколько раз. В таком случае для таблицы потребуется псевдоним. Рассмотрим пример:

Пример: БД Компьютерные курсы. Вывести номера курсов студентов, имеющих одинаковый год рождения, но при этом курс у них разный.

✍ Решение: 

1
2
3
4
5
SELECT DISTINCT A.`Курс` AS номер_курса1, B.`Курс` AS номер_курса2
FROM список AS A, список AS B
WHERE A.`Год рождения` = B.`Год рождения` 
AND A.Курс < B.Курс
LIMIT 0 , 30

SELECT DISTINCT A.`Курс` AS номер_курса1, B.`Курс` AS номер_курса2 FROM список AS A, список AS B WHERE A.`Год рождения` = B.`Год рождения` AND A.Курс < B.Курс LIMIT 0 , 30

Результат:

Здесь условие A.Курс используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой курса.
В общем случае можно использовать условие A.Курс B.Курс!

✍ Решение: 

1
2
3
4
SELECT DISTINCT A.Номер AS модель1, B.Номер AS модель2
FROM pc AS A, pc AS B
WHERE A.Цена = B.Цена
  AND A.Номер < B.Номер

SELECT DISTINCT A.Номер AS модель1, B.Номер AS модель2 FROM pc AS A, pc AS B WHERE A.Цена = B.Цена AND A.Номер < B.Номер


Здесь условие A.Номер используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой номера:

Sql tables 2. Вывести номера учителей (tid), которые ведут уроки по одинаковым курсам (таблица lessons)

Задание 3_1. БД «Компьютерные курсы».
1. Вывести все сведения из таблиц Личные данные и Список, совпадающие по полям Код и Код студента
2. Вывести фамилии, адреса и оценки по word из таблиц Личные данные и Список, совпадающие по полям Код и Код студента Задание 3_2. БД «Компьютерные курсы».
Вывести курс и год рождения студентов, учащихся на одном курсе, но имеющих разный год рождения. При этом рассмотреть все курсы, кроме первого.

Результат:

Запросы sql INNER JOIN

В предложении FROM может использоваться явная операция соединения двух и более таблиц.

Разберем пример. Имеем две таблицы: teachers (учителя) и lessons (уроки):

teacherslessons

Пример: Выбрать имена учителей и проведенные уроки по курсам, которые они ведут

✍ Решение: 

Для этого необходимы обе таблицы:
SELECT t.name,t.code,l.course 
FROM teachers t 
INNER JOIN lessons l ON t.id=l.tid

SELECT t.name,t.code,l.course FROM teachers t INNER JOIN lessons l ON t.id=l.tid


Результат:

В запросе буквы l и t являются псевдонимами таблиц lessons (l) и teachers (t).

Inner Join — это внутреннее объединение (JOIN — с англ. «объединение», ключевое слово INNER можно опустить).

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

Важно: Inner Join — выбираются значения только в случае присутствия в обеих таблицах

Важно: Соединение таблиц может быть либо внутренним (INNER), либо одним из внешних (OUTER). Служебное слово INNER можно опускать, тогда при использовании просто слова JOIN имеется в виду внутреннее соединение (INNER)

Sql left inner join 1. БД Институт. Вывести фамилии всех преподавателей, названия и длительность курсов, которые они ведут (name, title, length) из таблиц teachers и courses. Использовать внутреннее объединение

Запросы sql OUTER JOIN

При использовании внутреннего объединения inner join выбираются только совпадающие данные из объединяемых таблиц. Для того чтобы получить данные, которые подходят по условию частично, необходимо использовать внешнее объединение.

OUTER JOIN — внешнее объединение, которое возвращает данные из обеих таблиц (совпадающие по условию объединения), ПЛЮС выборка дополнится оставшимися данными из внешней таблицы, которые по условию не подходят, заполнив недостающие данные значением NULL.

Существует два типа внешнего объединения — LEFT OUTER JOIN («внешней» таблицей будет находящаяся слева) и RIGHT OUTER JOIN («внешней» таблицей будет находящаяся справа).

Рисунок относится к объединению типа Left Outer Join:

Важно: Ключевое слово OUTER можно опустить. Запись LEFT JOIN эквивалентна записи LEFT OUTER JOIN.

Пример БД Институт: Выбрать имена всех учителей и курсы, которые они ведут. Если учитель не прикреплен к курсу, его фамилию все равно необходимо вывести

✍ Решение: 

SELECT t.name, t.code, l.course
FROM teachers t
LEFT OUTER JOIN lessons l ON t.id = l.tid

SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t.id = l.tid

Результат:

Важно: Таким образом, соединение LEFT JOIN означает, что помимо строк, для которых выполняется условие, в результирующий набор попадут все остальные строки из левой таблицы. При этом отсутствующие значения из правой таблицы будут заполнены NULL-значениями.

С тем же примером (выбрать имена учителей и курсы, которые они ведут) фильтрация по RIGHT OUTER JOIN вернет полный список уроков по курсам (правая таблица) и сопоставленных учителей. Но так как нет таких уроков, которые бы не соответствовали определенным учителям, то выборка будет состоять только из двух строк:

SELECT t.name, t.code, l.course
FROM teachers t
RIGHT OUTER JOIN lessons l ON t.id = l.tid

SELECT t.name, t.code, l.course FROM teachers t RIGHT OUTER JOIN lessons l ON t.id = l.tid

Важно: Left Outer Join — после основной выборки, удовлетворяющей условиям, выбираются оставшиеся данные левой таблицы (внешней), которые по условию не подходят

Задание 3_5: БД Компьютерные курсы. Для выполнения задания необходимо добавить в таблицу Личные данные сведения для нового студента, у которого пока отсутствуют оценки (остальные данные заполнить). Этого же студента добавить в таблицу список (с тем же кодом).

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

Sql left outer join 1. Вывести фамилии всех преподавателей, названия и длительность курсов, которые они ведут (name, title, length) из таблиц teachers и courses. Использовать внешнее объединение

В приведенных примерах можно вводить фильтры для более точной фильтрации:

Пример БД Институт: выводить только тех учителей, которые не проводили/не будут проводить уроков

✍ Решение: 

SELECT t.name, t.code, l.course
FROM teachers t
LEFT OUTER JOIN lessons l ON t.id = l.tid
WHERE l.tid IS NULL

SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t.id = l.tid WHERE l.tid IS NULL

Объединение с подзапросом

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

Синтаксис:

SELECT t1.*, t2.* FROM left_table t1 
LEFT JOIN (SELECT * FROM right_table WHERE some_column = 1 LIMIT 1) 
t2 ON t1.id = t2.join_id

SELECT t1.*, t2.* from left_table t1 left join (select * from right_table where some_column = 1 limit 1) t2 ON t1.id = t2.join_id

или

SELECT t1.*, t2.* FROM left_table t1 
INNER JOIN (SELECT * FROM right_table WHERE some_column = 1 LIMIT 1) 
t2 ON t1.id = t2.join_id

SELECT t1.*, t2.* from left_table t1 inner join (select * from right_table where some_column = 1 limit 1) t2 ON t1.id = t2.join_id

Пример БД Институт: Выбрать данные по учителям и проведенным ими урокам, только для уроков по курсу «php»

✍ Решение: 

SELECT t1.*, t2.* FROM teachers t1 
INNER JOIN (SELECT * FROM lessons WHERE course = "php" LIMIT 1) 
t2 ON t1.id = t2.tid

SELECT t1.*, t2.* from teachers t1 inner join (select * from lessons where course = «php» limit 1) t2 ON t1.id = t2.tid

Результат:

Разберем еще один пример:

✍ Решение: 

1
2
3
4
5
6
7
SELECT t1.производитель, t1.Тип, t2 . * 
FROM pc t2
INNER JOIN (
SELECT * 
FROM product
WHERE Тип =  "Компьютер"
) t1 ON t2.Номер = t1.Номер

SELECT t1.производитель, t1.Тип, t2 . * FROM pc t2 INNER JOIN ( SELECT * FROM product WHERE Тип = «Компьютер» ) t1 ON t2.Номер = t1.Номер

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

Задание 3_6: БД Компьютерные курсы. Отобразить фамилии и оценки студентов, у которых по дисциплине Word оценка «отлично».

Пошаговое руководство по 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 Inner Join в действии

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

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

(

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

[CompanyName] [varchar] (50),

[CompanyCity] [ varchar] (30)

)

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

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

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) ЗНАЧЕНИЯ (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]) VALUES (5, ‘Nino Pizza’, ‘Las Vegas’);

ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) ЗНАЧЕНИЯ (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

18

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

(

[ItemId] INT PRIMARY KEY CLUSTERED,

[ItemName] Varchar (50),

[UnitsSold] int,

CompanyID int,

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

)

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

INSERT INTO [dbo]. [Foods] ([ItemId], [ ItemName], [UnitsSold], [CompanyId]) VALUES (2, ‘Garlic Knots’, 6,3)

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

INSERT INTO [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES (4, ‘Medium Pizza ‘, 8,4)

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

INSERT INTO » [dbo].[Еда] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) ЗНАЧЕНИЯ (6, ‘Средняя пицца’, 11,1)

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

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

ВЫБРАТЬ * ИЗ ЕДЫ

В следующей таблице показаны данные из таблицы «Продукты питания». В этой таблице хранится такая информация, как количество проданных единиц продукта питания, а также точка доставки пиццы (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 f

ON pz.CompanyId = 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,

ИНОСТРАННЫЙ КЛЮЧ (CompanyID) ССЫЛКИ PizzaSCompany (CompanyID)

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

ВСТАВИТЬ В [dbo].[WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Бульвар 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 Join

Как следует из названия, 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.EmployeeKey

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 - 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 между двумя таблицами.

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

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

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

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

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

Код SQL:

  ВЫБЕРИТЕ продукты.item_name, foods.item_unit,
company.com название_компании, 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 .

Вот LEFT OUTER JOIN

  ВЫБРАТЬ 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 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 ИЗ продукты ВНУТРЕННЕЕ СОЕДИНЕНИЕ категории ПО категории.categoryID = products.categoryID;

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

 

category.categoryID = products.categoryID

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

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;

Визуализируйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ с помощью диаграммы Венна

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


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

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)».

Попробуй это Посмотреть ответ

SQL Join: Обзор типов SQL-соединений с примерами - Управление базами данных - Блоги

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

Понимание различных типов SQL JOIN

SQL JOIN генерирует значимые данные путем объединения нескольких реляционных таблиц. Эти таблицы связаны с помощью ключа и имеют отношения «один к одному» или «один ко многим». Чтобы получить правильные данные, вы должны знать требования к данным и правильные механизмы соединения. SQL Server поддерживает несколько объединений, и каждый метод имеет определенный способ извлечения данных из нескольких таблиц.На изображении ниже указаны поддерживаемые соединения SQL Server.

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

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

В приведенном ниже примере обратите внимание на следующее:

  • У нас есть две таблицы - [Сотрудники] и [Адрес].
  • SQL-запрос присоединен к [Сотрудники].[EmpID] и [Адрес]. [ID] столбец.

Выходные данные запроса возвращают записи сотрудников для EmpID, которые существуют в обеих таблицах.

Внутреннее соединение возвращает совпадающие строки из обеих таблиц; поэтому оно также известно как Equi join. Если мы не укажем ключевое слово inner, SQL Server выполнит операцию внутреннего соединения.

В другом типе внутреннего соединения, тета-соединении, мы не используем оператор равенства (=) в предложении ON. Вместо этого мы используем операторы неравенства, такие как <и>.

ВЫБРАТЬ * ИЗ Table1 T1, Table2 T2 ГДЕ T1.Price

Самостоятельное присоединение к SQL

При самосоединении SQL Server соединяет таблицу с самим собой. Это означает, что имя таблицы дважды появляется в предложении from.

Ниже у нас есть таблица [Emp], в которой есть данные о сотрудниках, а также их менеджеры. Самосоединение полезно для запроса иерархических данных. Например, в таблице сотрудников мы можем использовать самообъединение, чтобы узнать имя каждого сотрудника и имя его руководителя.

Приведенный выше запрос помещает самосоединение в таблицу [Emp]. Он соединяет столбец EmpMgrID со столбцом EmpID и возвращает соответствующие строки.

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

При перекрестном соединении SQL Server возвращает декартово произведение из обеих таблиц. Например, на изображении ниже мы выполнили перекрестное соединение для таблиц A и B.

Перекрестное соединение объединяет каждую строку из таблицы A с каждой строкой, доступной в таблице B. Таким образом, результат также известен как декартово произведение обеих таблиц.На изображении ниже обратите внимание на следующее:

  • Таблица [Сотрудник] содержит три строки для Emp ID 1,2 и 3.
  • Таблица [Адрес] содержит записи для Emp ID 1,2,7 и 8.

В выходных данных перекрестного объединения строка 1 таблицы [Сотрудник] объединяется со всеми строками таблицы [Адрес] и следует тому же шаблону для остальных строк.

Если первая таблица имеет x строк, а вторая таблица имеет n строк, перекрестное соединение дает x * n количество строк в выходных данных.Вам следует избегать перекрестного соединения для больших таблиц, потому что оно может возвращать огромное количество записей, а SQL Server требует большой вычислительной мощности (ЦП, память и ввод-вывод) для обработки таких обширных данных.

Внешнее соединение SQL

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

На изображении ниже показано общее левое, правое и полное внешнее соединение.

Левое внешнее соединение

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

В приведенном ниже примере левое внешнее соединение возвращает следующие строки:

  • Соответствующие строки: Emp ID 1 и 2 существует как в левой, так и в правой таблицах.
  • Несопоставленная строка: Emp ID 3 не существует в правой таблице. Следовательно, в выходных данных запроса у нас есть значение NULL.

Правое внешнее соединение

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

В приведенном ниже примере у нас есть следующие выходные строки:

  • Соответствующие строки: Emp ID 1 и 2 существует в обеих таблицах; следовательно, эти строки совпадают.
  • Несопоставленные строки: в правой таблице у нас есть дополнительные строки для Emp ID 7 и 8, но эти строки недоступны в левой таблице. Следовательно, мы получаем значение NULL в правом внешнем соединении для этих строк.

Полное внешнее соединение

Полное внешнее соединение возвращает следующие строки на выходе:

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


SQL объединяет несколько таблиц

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

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

 ИСПОЛЬЗОВАНИЕ [AdventureWorks2019]
ИДТИ
ВЫБРАТЬ
     д. [BusinessEntityID]
     ,п.[Имя]
     , стр. [MiddleName]
     , стр. [Фамилия]
     , д. [JobTitle]
     , д. [Название] AS [Отдел]
     , d. [GroupName]
     , edh. [Дата начала]
ОТ [HumanResources]. [Сотрудник] e
     INNER JOIN [Человек]. [Человек] p
     НА стр. [BusinessEntityID] = e. [BusinessEntityID]
     ВНУТРЕННЕЕ СОЕДИНЕНИЕ [HumanResources]. [EmployeeDepartmentHistory] edh
     НА e. [BusinessEntityID] = edh. [BusinessEntityID]
     INNER JOIN [HumanResources]. [Department] d
     НА edh.[DepartmentID] = d. [DepartmentID]
ГДЕ edh.EndDate ЕСТЬ NULL
ИДТИ
 

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

  • Промежуточный результат 1: Первое внутреннее соединение между таблицей [HumanResources]. [Employees] и [Person]. [Person].
  • Промежуточный результат 2: Внутреннее соединение между таблицей [Промежуточный результат 1] и [HumanResources]. [EmployeeDepartmentHistory].
  • Промежуточный результат 3: Внутреннее соединение между [Промежуточный результат 2] и [HumanResources].Таблица [Отделение].

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

значений NULL и SQL объединяет

Предположим, что у нас есть значения NULL в столбцах таблицы, и мы объединяем таблицы в этих столбцах.Соответствует ли SQL Server значениям NULL?

Значения NULL не соответствуют друг другу. Таким образом SQL Server не может вернуть соответствующую строку. В приведенном ниже примере у нас есть NULL в столбце EmpID таблицы [Сотрудники]. Следовательно, в выходных данных он возвращает соответствующую строку только для [EmpID] 2.

Мы можем получить эту строку NULL в выходных данных в случае внешнего соединения SQL, потому что она также возвращает несовпадающие строки.

SQL присоединяйтесь к лучшим практикам

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

  • Внутренние соединения выводят совпадающие строки из условия соединения в обеих таблицах.
  • Перекрестное соединение возвращает декартово произведение обеих таблиц.
  • Внешнее соединение возвращает совпадающие и несовпадающие строки в зависимости от левого, правого и полного ключевых слов.
  • Самообъединение SQL объединяет таблицу с собой.
  • При использовании объединений в запросах всегда следует использовать псевдоним таблицы.
  • Всегда используйте формат имени [псевдоним таблицы]. [Столбец], состоящий из двух частей, для столбцов в запросах.
  • В случае нескольких объединений SQL в запросе следует использовать логический порядок таблиц таким образом, чтобы удовлетворить ваши требования к данным и минимизировать поток данных между различными операторами плана выполнения.
  • Вы можете комбинировать несколько соединений, таких как внутреннее соединение, внешнее соединение и самосоединение. Однако вы должны использовать объединения и их заказы для получения требуемых данных.

SQL: ПРИСОЕДИНЯЕТСЯ


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

Описание

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

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

  • SQL INNER JOIN (иногда называемое простым соединением)
  • SQL LEFT OUTER JOIN (иногда называется LEFT JOIN)
  • SQL RIGHT OUTER JOIN (иногда называется RIGHT JOIN)
  • ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ SQL (иногда называется ПОЛНОЕ СОЕДИНЕНИЕ)

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

DDL / DML для примеров

Если вы хотите следовать этому руководству, получите DDL для создания таблиц и DML для заполнения данных. Тогда попробуйте примеры в своей базе данных!

Получить DDL / DML

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

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

Синтаксис

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

 ВЫБРАТЬ столбцы
ИЗ table1
INNER JOIN table2
НА table1.column = table2.column; 

Визуальная иллюстрация

На этой визуальной диаграмме SQL INNER JOIN возвращает заштрихованную область:

SQL INNER JOIN вернет записи, в которых пересекаются table1 и table2 .

Пример

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

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

customer_id фамилия first_name favourite_website
4000 Джексон Джо techonthenet.com
5000 Смит Джейн digminecraft.com
6000 Фергюсон Саманта bigactivities.com
7000 Рейнольдс Шестигранник checkyourmath.com
8000 Андерсон Пейдж НЕТ
9000 Джонсон Дерек techonthenet.com

И таблица под названием заказов со следующими данными:

order_id customer_id дата заказа
1 7000 18.04.2016
2 5000 18.04.2016
3 8000 2016/04/19
4 4000 2016/04/20
5 НЕТ 01.05.2016

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

Попытайся
 ВЫБРАТЬ клиентов.customer_id, orders.order_id, orders.order_date
ОТ клиентов
INNER JOIN заказы
ВКЛ. Customers.customer_id = orders.customer_id
ЗАКАЗАТЬ ПО customers.customer_id; 

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

customer_id order_id дата заказа
4000 4 2016/04/20
5000 2 18.04.2016
7000 1 18.04.2016
8000 3 2016/04/19

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

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

Старый синтаксис

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

Попытайся
 ВЫБРАТЬ клиентов.customer_id, orders.order_id, orders.order_date
ОТ клиентов, заказы
ГДЕ customers.customer_id = orders.customer_id
ЗАКАЗАТЬ ПО customers.customer_id; 

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

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

Синтаксис

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

 ВЫБРАТЬ столбцы
ИЗ table1
LEFT [OUTER] JOIN table2
НА table1.столбец = table2.column; 

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

Визуальная иллюстрация

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

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

Пример

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

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

customer_id фамилия first_name favourite_website
4000 Джексон Джо techonthenet.com
5000 Смит Джейн digminecraft.com
6000 Фергюсон Саманта видов деятельности.com
7000 Рейнольдс Шестигранник checkyourmath.com
8000 Андерсон Пейдж НЕТ
9000 Джонсон Дерек techonthenet.com

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

order_id customer_id дата заказа
1 7000 18.04.2016
2 5000 18.04.2016
3 8000 2016/04/19
4 4000 2016/04/20
5 НЕТ 01.05.2016

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

Попытайся
 ВЫБРАТЬ клиентов.customer_id, orders.order_id, orders.order_date
ОТ клиентов
LEFT OUTER JOIN заказы
ВКЛ. Customers.customer_id = orders.customer_id
ЗАКАЗАТЬ ПО customers.customer_id; 

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

customer_id order_id дата заказа
4000 4 2016/04/20
5000 2 18.04.2016
6000 НЕТ НЕТ
7000 1 18.04.2016
8000 3 2016/04/19
9000 НЕТ НЕТ

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

Если значение customer_id в таблице customers не существует в таблице orders , все поля в таблице orders будут отображаться как NULL в наборе результатов. Как вы можете видеть, строки, в которых customer_id равно 6000 и 9000, будут включены в ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, но поля order_id и order_date отображают NULL.

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

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

Синтаксис

Синтаксис ПРАВОГО ВНЕШНЕГО СОЕДИНЕНИЯ в SQL:

 ВЫБРАТЬ столбцы
ИЗ table1
RIGHT [OUTER] JOIN table2
НА table1.column = table2.column; 

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

Визуальная иллюстрация

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

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

Пример

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

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

customer_id фамилия first_name favourite_website
4000 Джексон Джо techonthenet.com
5000 Смит Джейн digminecraft.com
6000 Фергюсон Саманта bigactivities.com
7000 Рейнольдс Шестигранник checkyourmath.com
8000 Андерсон Пейдж НЕТ
9000 Джонсон Дерек techonthenet.com

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

order_id customer_id дата заказа
1 7000 18.04.2016
2 5000 18.04.2016
3 8000 2016/04/19
4 4000 2016/04/20
5 НЕТ 01.05.2016

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

Попытайся
 ВЫБРАТЬ клиентов.customer_id, orders.order_id, orders.order_date
ОТ клиентов
RIGHT OUTER JOIN заказы
ВКЛ. Customers.customer_id = orders.customer_id
ЗАКАЗАТЬ ПО customers.customer_id; 

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

customer_id order_id дата заказа
ПУСТО 5 01.05.2016
4000 4 2016/04/20
5000 2 18.04.2016
7000 1 18.04.2016
8000 3 2016/04/19

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

Если значение customer_id в таблице orders не существует в таблице customers , все поля в таблице customers будут отображаться как NULL в наборе результатов. Как видите, строка, в которой order_id равно 5, будет включена в ПРАВИЛЬНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, но в поле customer_id отображается NULL.

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

Другой тип соединения называется ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ SQL. Этот тип соединения возвращает все строки из таблицы LEFT и RIGHT со значениями NULL в местах, где условие соединения не выполняется.

Синтаксис

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

 ВЫБРАТЬ столбцы
ИЗ table1
FULL [OUTER] JOIN table2
НА table1.column = table2.column; 

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

Визуальная иллюстрация

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

SQL FULL OUTER JOIN вернет все записи из table1 и table2 .

Пример

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

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

customer_id фамилия first_name favourite_website
4000 Джексон Джо techonthenet.com
5000 Смит Джейн digminecraft.com
6000 Фергюсон Саманта bigactivities.com
7000 Рейнольдс Шестигранник checkyourmath.com
8000 Андерсон Пейдж НЕТ
9000 Джонсон Дерек techonthenet.com

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

order_id customer_id дата заказа
1 7000 18.04.2016
2 5000 18.04.2016
3 8000 2016/04/19
4 4000 2016/04/20
5 НЕТ 01.05.2016

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

Попытайся
 ВЫБРАТЬ клиентов.customer_id, orders.order_id, orders.order_date
ОТ клиентов
ЗАКАЗЫ FULL OUTER JOIN
ВКЛ. Customers.customer_id = orders.customer_id
ЗАКАЗАТЬ ПО customers.customer_id; 

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

customer_id order_id дата заказа
ПУСТО 5 01.05.2016
4000 4 2016/04/20
5000 2 18.04.2016
6000 НЕТ НЕТ
7000 1 18.04.2016
8000 3 2016/04/19
9000 НЕТ НЕТ

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

Оставить комментарий

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

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