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

Содержание

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

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

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

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

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


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

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

AuthorID AuthorName
1 Bruce Eckel
2 Robert Lafore
3 Andrew Tanenbaum

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

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

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

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

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

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

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

Authors.AuthorID Authors.AuthorName Books.BookID Books.BookName
3 Andrew Tanenbaum 3 Modern Operating System
1 Bruce Eckel 1 Thinking in Java
3 Andrew Tanenbaum 3 Computer Architecture

Соединение таблиц или действие оператора 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

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

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

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

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

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

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

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

INNER JOIN

Внутреннее присоединение. Равносильно просто JOIN или CROSS JOIN.


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



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

FROM `persons` p

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


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

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

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

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

OUTER JOIN

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

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

LEFT JOIN

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


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



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

FROM `persons` p

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


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

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

RIGHT JOIN

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


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



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

FROM `persons` p

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


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

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

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

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


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



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

FROM `persons` p

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

UNION

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

FROM `persons` p

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


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

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


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



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

FROM `persons` p

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

UNION ALL

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

FROM `persons` p

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

WHERE p.id IS NULL)


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

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

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


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



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

FROM `persons` p

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

WHERE ps.id is NULL


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

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

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


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



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

FROM `persons` p

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

WHERE p.id is NULL


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

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

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


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



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

FROM `persons` p

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

WHERE ps.id is NULL)

UNION ALL

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

FROM `persons` p

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

WHERE p.id is NULL)



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

Оператор соединения JOIN SQL — CodeTown.ru

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

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

Введение

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

В этой статье мы разберем несколько вариантов применения оператора JOIN:

  • INNER JOIN
  • OUTER JOIN
    • RIGHT OUTER JOIN
    • LEFT OUTER JOIN

Про эти варианты использования мы и поговорим подробнее.

Оператор INNER JOIN

Этот оператор осуществляет симметричное соединение — это означает, что ему неважен порядок тех двух таблиц, которые соединяются. По своей сути все операторы SQL в данной статье похожи с вложенными запросами, но алгоритм работы отличается, в этом и преимущество. Разберем пример из прошлой статьи, но выполним его уже по-другому:

Вывести сумму заказов и дату, которые проводил продавец с фамилией Колованов. Используйте оператор INNER JOIN.

SELECT amt, odate
FROM orders
INNER JOIN salespeople on orders.snum = salespeople.snum and sname = 'Колованов'

В этом запросе четко видно, что мы берем два поля из таблицы orders, а затем присоединяем таблицу salespeople с нужными нам условиями, которые задаются после ключевого слова ON. В данном случае проверка идет по snum и фамилии продавца. Вывод запроса аналогичен предыдущей статье:

amt odate
348 2017-04-08
80 2017-09-02

Рассмотрим еще один пример на оператор INNER JOIN, уже сложнее:

Вывести среднюю суму заказов для каждого продавца.

SELECT AVG(amt) as 'Средняя цена', salespeople.sname
FROM orders
INNER JOIN salespeople on orders.snum = salespeople.snum 
GROUP BY salespeople.sname

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

Средняя цена sname
214 Колованов
315. 667 Кучеров
1180 Мозякин
640 Плотников
900 Проворов

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

Также заметьте, что всего в нашей таблицы 8 продавцов, а тут всего 5 строк — просто у других продавцов нет заказов в таблице orders.

Оператор OUTER JOIN

В языке SQL оператор OUTER JOIN используется гораздо реже, но иногда является очень полезным. Сейчас мы рассмотрим два варианта использования этого оператора. Оператор осуществляет несимметричное внешнее соединение двух таблиц — то есть порядок таблиц важен.

Оператор RIGHT OUTER JOIN

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

SELECT AVG(amt) as 'Средняя цена', salespeople.sname
FROM orders
RIGHT OUTER JOIN salespeople on orders.snum = salespeople.snum 
GROUP BY salespeople.sname

И вот, что поменялось в выводе:

Средняя цена sname
214 Колованов
315.667 Кучеров
NULL Малкин
1180 Мозякин
NULL Петров
640 Плотников
900 Проворов
NULL Шипачев

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

Оператор LEFT OUTER JOIN

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

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

Итак, нам нужны все покупатели — значит в качестве первой (левой) таблицы возьмем таблицу customers, а затем будем присоединять таблицу orders.

SELECT customers.cname, odate
FROM customers
LEFT OUTER JOIN orders on orders.cnum = customers.cnum

Вывод:

cname odate
Чудинов 2016-01-01
Лосев 2016-04-10
Краснов 2017-04-08
Кириллов 2016-06-07
Колесников 2017-12-04
Колесников 2016-03-03
Лермонтов 2017-09-02
Деснов 2016-03-07
Кириллов 2017-10-07
Пушкин 2016-01-08
Ермолаев NULL
Белый NULL

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

Примеры на соединение таблиц в SQL

1.Напишите запрос, который бы использовал оператор INNER JOIN для получения всех Заказов для покупателя с фамилией Краснов.

SELECT onum, amt, odate, cname
FROM orders
INNER JOIN customers on orders.cnum = customers.cnum and cname = 'Краснов'

2.Напишите запрос, который бы вывел фамилии и города продавцов, комиссия которых составляет более 20%.

SELECT DISTINCT(sname), city, comm
FROM salespeople
INNER JOIN orders on orders.snum = salespeople.snum and comm > 20

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

SELECT SUM(amt), salespeople.city
FROM orders
INNER JOIN salespeople on orders.snum = salespeople.snum 
GROUP BY salespeople.city

4.Повторите предыдущий запрос, но выведите все города, даже если в них не совершалась сделка.

SELECT SUM(amt), salespeople.city
FROM orders
RIGHT OUTER JOIN salespeople on orders. snum = salespeople.snum 
GROUP BY salespeople.city

5.Напишите запрос, который бы вывел максимальную сумму заказов для городов в которых проживают покупатели, даже если в этих городах не было произведено сделки.

SELECT customers.city, MAX(amt)
FROM customers
LEFT OUTER JOIN orders on orders.cnum = customers.cnum 
GROUP BY customers.city

Заключение

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

Поделиться ссылкой:

Похожее

Операторы Inner Join и Outer (left, right, full) Join в SQL (Oracle)


2006-01-06

Базы данных и язык запросов SQL


Ключевое слово join в SQL используется при построении select выражений. Инструкция Join позволяет объединить колонки из нескольких таблиц в одну. Объединение происходит временное и целостность таблиц не нарушается. Существует три типа join-выражений:

  • inner join;
  • outer join;
  • cross join;

В свою очередь, outer join может быть left, right и full (слово outer обычно опускается).

В качестве примера (DBMS Oracle) создадим две простые таблицы и сконструируем для них SQL-выражения с использованием join.


В первой таблице будет хранится ID пользователя и его nick-name, а во второй — ID ресурса, имя ресурса и ID пользователя, который может этот ресурс администрировать.


create table t_users (
t_id number(11, 0),
t_nick varchar(16),
primary key (t_id) )

create table t_resources (
t_id number(11, 0),
t_name varchar(16),
t_userid number (11, 0),
primary key (t_id) )

Содержимое таблиц пусть будет таким:


T_ID  T_NICK
  1    user1     
  3    user3
  4    user4 

T_ID  T_NAME  T_USERID    
  1    res1     3           
  2    res2     1           
  3    res3     2           
  5    res5     3   

Конструкция join выглядит так:


. .. join_type join table_name on condition ...

Где join_type — тип join-выражения, table_name — имя таблицы, которая присоединяется к результату, condition — условие объединения таблиц.


Кострукция join располагается сразу после select-выражения. Можно использовать несколько таких конструкций подряд для объединения соответствующего кол-ва таблиц. Логичнее всего использовать join в том случае, когда таблица имеет внешний ключ (foreign key).


Inner join необходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда. Пример:


select t_resources.t_name, t_users.t_nick
  from t_resources 
  inner join t_users on t_users.t_id = t_resources.t_userid

Результат будет таким:


 T_NAME  T_NICK      
  res2    user1          
  res1    user3    
  res5    user3          


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



select t_resources.t_name, t_users.t_nick
  from t_resources 
  left join t_users on t_users.t_id = t_resources.t_userid

Результат выполнения запроса:


 T_NAME  T_NICK    
  res1    user3     
  res2    user1 
  res3    (null)    
  res5    user3     

Результат показывает все ресурсы и их администраторов, вне зависимотсти от того есть они или нет.


Right join отображает все строки удовлетворяющие правой части условия condition, даже если они не имеют соответствия в главной (левой) таблице:


select t_resources.t_name, t_users.t_nick
  from t_resources 
  right join t_users on t_users.t_id = t_resources.t_userid

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


 T_NAME  T_NICK    
  res2    user1     
  res1    user3     
  res5    user3     
  (null)  user4   

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


Full outer join (ключевое слово outer можно опустить) необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и right join.


select t_resources.t_name, t_users.t_nick
  from t_resources 
  full join t_users on t_users.t_id = t_resources.t_userid

А результат будет таким:


 T_NAME  T_NICK    
  res1      user3     
  res2      user1     
  res3      (null)    
  res5      user3     
 (null)     user4  

Некоторые СУБД не поддерживают такую функциональность (например, MySQL), в таких случаях обычно используют объединение двух запросов:


select t_resources.t_name, t_users.t_nick
  from t_resources
  left join t_users on t_users. t_id = t_resources.t_userid
union
select t_resources.t_name, t_users.t_nick
  from t_resources
  right join t_users on t_users.t_id = t_resources.t_userid

Наконец, cross join. Этот тип join еще называют декартовым произведением (на английском — cartesian product). Настоятельно рекомендую использовать его с умом, так как время выполнения запроса с увеличением числа таблиц и строк в них растет нелинейно.
Вот пример запроса, который аналогичен cross join:


select t_resources.t_name, t_users.t_nick 
  from t_resources, t_users


Конструкция Join (в сочетании с другими SQL конструкциями, например, group by) часто встречается при программировании под базы данных. Думаю, эта статья будет вам полезна.

Кстати, для проверки своих знаний в области баз данных (и в частности Oracle) рекомендую воспользоваться этим сайтом онлайн тестирования — Тесты по базам данных.

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_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

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

order_id customer_id order_date
1 7000 2019/06/18
2 5000 2019/06/18
3 8000 2019/06/19
4 4000 2019/06/20
5 NULL 2019/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_id order_id order_date
4000 4 2019/06/20
5000 2 2019/06/18
7000 1 2019/06/18
8000 3 2019/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_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

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

order_id customer_id order_date
1 7000 2019/06/18
2 5000 2019/06/18
3 8000 2019/06/19
4 4000 2019/06/20
5 NULL 2019/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_id order_id order_date
4000 4 2019/06/20
5000 2 2019/06/18
6000 NULL NULL
7000 1 2019/06/18
8000 3 2019/06/19
9000 NULL NULL

Этот пример 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_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

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

order_id customer_id order_date
1 7000 2019/06/18
2 5000 2019/06/18
3 8000 2019/06/19
4 4000 2019/06/20
5 NULL 2019/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_id order_id order_date
NULL 5 2019/07/01
4000 4 2019/06/20
5000 2 2019/06/18
7000 1 2019/06/18
8000 3 2019/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_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

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

order_id customer_id order_date
1 7000 2019/06/18
2 5000 2019/06/18
3 8000 2019/06/19
4 4000 2019/06/20
5 NULL 2019/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_id order_id order_date
NULL 5 2019/07/01
4000 4 2019/06/20
5000 2 2019/06/18
6000 NULL NULL
7000 1 2019/06/18
8000 3 2019/06/19
9000 NULL NULL

Это пример 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 — Оператор LEFT JOIN

LEFT JOIN в SQL возвращает все строки из левой таблицы, даже если нет совпадений в таблице справа. Это означает, что если положение ON соответствует 0 (ноль) в записи в таблице справа, объединение будет возвращать строку результата, но с NULL в каждом столбце из правой таблицы.

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

Синтаксис

Основной синтаксис LEFT JOIN следующий:

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;

 

Здесь, данное условие может быть любое данное выражение основанное на вашем требовании.

Пример

Рассмотрим следующие две таблицы,

Таблица 1 – Таблица CUSTOMERS выглядит следующим образом:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Maxim    |  35 | Moscow    | 21000.00 |
|  2 | AndreyEx |  38 | Krasnodar | 55500.00 |
|  3 | Oleg     |  33 | Rostov    | 34000.00 |
|  4 | Masha    |  35 | Moscow    | 34000.00 |
|  5 | Ruslan   |  34 | Omsk      | 45000.00 |
|  6 | Dima     |  32 | SP        | 45000.00 |
|  7 | Roma     |  34 | SP        | 10000.00 |
+----+----------+-----+-----------+----------+

 

Таблица 2 – Заказы ORDERS:

+-----+---------------------+-------------+--------+
|OID  | DATE                | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2017-01-11 00:00:00 |           3 |  34000 |
| 100 | 2017-01-11 00:00:00 |           3 |  34000 |
| 101 | 2017-02-02 00:00:00 |           2 |  12500 |
| 103 | 2017-03-05 00:00:00 |           4 |  45000 |
+-----+---------------------+-------------+--------+

 

Теперь, давайте объединим эти две таблицы с помощью LEFT JOIN следующим образом.

SQL> SELECT  ID, NAME, AMOUNT, DATE
   FROM CUSTOMERS
   LEFT JOIN ORDERS
   ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

 

Это произведет следующий результат:

+----+----------+--------+---------------------+
| ID | NAME     | AMOUNT | DATE                |
+----+----------+--------+---------------------+
|  1 | Maxim    |  NULL  | NULL                |
|  3 | Oleg     |  34000 | 2017-01-11 00:00:00 |
|  3 | Oleg     |  34000 | 2017-01-11 00:00:00 |
|  2 | AndreyEx |  12500 | 2017-02-02 00:00:00 |
|  4 | Masha    |  45000 | 2017-03-05 00:00:00 |
|  5 | Ruslan   |  NULL  | NULL                |
|  6 | Dima     |  NULL  | NULL                |
|  7 | Roma     |  NULL  | NULL                |
+----+----------+--------+---------------------+

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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


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

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

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

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

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

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

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

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

Пример

ВЫБЕРИТЕ Orders.OrderID, Customers.CustomerName, Orders.OrderDate
ИЗ Orders
ВНУТРЕННИЕ СОЕДИНЯЙТЕСЬ с клиентами НА Orders.CustomerID = Customers.CustomerID;

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

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

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

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

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

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

SQL JOIN, JOIN Syntax, JOIN Differences, 3 таблицы — с примерами

Как получить данные из нескольких таблиц?

SQL JOIN объединяет записи из двух таблиц.
JOIN находит связанные значения столбцов в двух таблицах.
Запрос может содержать ноль, одну или несколько операций JOIN.
INNER JOIN — это то же самое, что и JOIN; ключевое слово INNER необязательно.


Четыре различных типа СОЕДИНЕНИЙ

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

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

Синтаксис SQL JOIN

Общий синтаксис:

ВЫБЕРИТЕ имена столбцов
  FROM table-name1 ПРИСОЕДИНЯТЬСЯ к table-name2
    ON имя-столбца1 = имя-столбца2
 ГДЕ условие
 

Общий синтаксис INNER:

ВЫБЕРИТЕ имена столбцов
  ИЗ имя-таблицы1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ имя-таблицы2
    ON имя-столбца1 = имя-столбца2
 ГДЕ условие
 

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


КЛИЕНТ
Идентификатор
Имя
Фамилия
Город
Страна
Телефон

Дата заказа

ЗАКАЗ
Идентификатор
Номер заказа
CustomerId
TotalAmount

Примеры SQL JOIN

Проблема: Список всех заказов с информацией о покупателе

ВЫБЕРИТЕ OrderNumber, TotalAmount, FirstName, LastName, City, Country
  ОТ [Заказ] ПРИСОЕДИНЯЙТЕСЬ к клиенту
    На заказ].CustomerId = Customer.Id
 

В этом примере может оказаться полезным использование псевдонимов таблицы для [Order] и Customer.

Результат: 830 записей.

Номер заказа Всего Имя Фамилия Город Страна
542378 440.00 Пол Анрио Реймс Франция
542379 1863,40 Карин Джозефс Мюнстер Германия
542380 1813,00 Марио Понты Рио-де-Жанейро Бразилия
542381 670.80 Мэри Савелей Лион Франция
542382 3730,00 Паскаль Картрейн Шарлеруа Бельгия
542383 1444,80 Марио Понты Рио-де-Жанейро Бразилия
542384 625.20 Ян Ван Берн Швейцария

ПРОДУКТ
Идентификатор
Название продукта
Идентификатор поставщика
Цена за единицу
Упаковка
Снята с производства

OrderId

ProductId
UnitPrice
Количество
ORDER
Id
OrderDate
OrderNumber
CustomerId

Задача: Список всех заказов
с названиями продуктов,
количества и цены

ВЫБЕРИТЕ O.OrderNumber, CONVERT (date, O.OrderDate) AS Date,
       P.ProductName, I.Quantity, I.UnitPrice
  ОТ [Заказ] O
  ПРИСОЕДИНЯЙТЕСЬ к OrderItem I ON O.Id = I.OrderId
  ПРИСОЕДИНЯЙТЕСЬ к продукту P ON P.Id = I.ProductId
ЗАКАЗ ПО O.OrderNumber
 

Результат: 2155 записей

Номер заказа Дата Название продукта Кол. Акций Цена за единицу
542378 04.07.2012 00:00:00 Queso Cabrales 12 14.00
542378 04.07.2012 00:00:00 Сингапурский Хоккиен Фрид Ми 10 9,80
542378 04.07.2012 00:00:00 Моцарелла ди Джованни 5 34,80
542379 05.07.2012 00:00:00 Тофу 9 18.60
542379 05.07.2012 00:00:00 Сушеные яблоки Манджимуп 40 42,40
542380 8.07.2012 00:00:00 Похлебка из моллюсков из Новой Англии Джека 10 7,70
542380 8.07.2012 00:00:00 Сушеные яблоки Манджимуп 35 42.40
542380 8.07.2012 00:00:00 Соус Луизиана Огненный Острый Перец 15 16,80
542381 8.07.2012 00:00:00 Knäckebröd Густава 6 16,80
542381 8.07.2012 00:00:00 Равиоли Анджело 15 15.60
542381 8.07.2012 00:00:00 Соус Луизиана Огненный Острый Перец 20 16,80
542382 09.07.2012 00:00:00 Мармелад сэра Родни 40 64,80
542382 09.07.2012 00:00:00 Geitost 25 2.00

SQL | Соединение (внутреннее, левое, правое и полное соединение)

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

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

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

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

Student

958 9069

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

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

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

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

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

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

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

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

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

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

    Выход :

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

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

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

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

    Выход:

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

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

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

    Выход:


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

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

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

Как объединить две таблицы в SQL

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

Как запросить отдельную таблицу

Во-первых, напомню, как выбирать данные из одной таблицы. Рассмотрим следующую таблицу: продукт :

id наименование цена
1 Умные часы Erin 234.00
2 Умные часы Sun 455,00
3 Smartband Eli 300,00
4 Smartband Белый 124,00

Чтобы выбрать данные из всех столбцов и всех строк в этой таблице, вы можете использовать запрос:

ВЫБЕРИТЕ id, имя, цену
ОТ продукта;
 

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

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

ВЫБЕРИТЕ название, цену
ОТ ПРОДУКТА
ГДЕ цена

 

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

наименование цена
Умные часы Erin 234.00
Smartband Белый 124,00

Столбцы перечислены после SELECT , тогда ключевое слово FROM помогает указать таблицу, из которой вы извлекаете данные. В конце запроса за ключевым словом WHERE следует условие фильтрации. В этом примере условие сравнивает значение в столбце цена с 250,00. Запрос возвращает сведения о продукте, только если цена этого продукта меньше 250.00.

Запрос данных из нескольких таблиц с помощью WHERE

Реляционные базы данных состоят из нескольких таблиц, которые ссылаются друг на друга. Строки из одной таблицы относятся к определенным строкам в другой таблице, которые связаны некоторым столбцом (столбцами) идентификатора. Теперь мы посмотрим, как объединить данные из одной таблицы с данными из другой таблицы.

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

товар

id product_name price category_id
1 умные часы 235.00 2
2 кирпич 26,70 3
3 Лампа 128,00 2
4 диван 3200.00 1
5 рабочий стол 1350.00 1
6 удлинитель 29,00 2

категория

id имя_категории
1 мебель
2 электроника
3 игрушки

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

ВЫБЕРИТЕ product.product_name, product.price, category.category_name
ОТ продукта, категории
ГДЕ product.category_id = category.id;
 

Вот результат:

название_продукта цена название_категории
умные часы 235.00 электроника
кирпичи 26,70 игрушки
лампа 128,00 электроника
диван 3200.00 мебель
рабочий стол 1350.00 мебель
удлинитель 29,00 электроника

SELECT в этом запросе перечисляет столбцы из обеих таблиц: product_name и price из product table и category_name из category table.Каждому имени столбца предшествует имя соответствующей таблицы, разделенное точкой.

Далее имена таблиц перечислены после ключевого слова ИЗ , разделенных запятыми.

Последняя часть этого запроса — это WHERE с условием, определяющим, как объединить строки из обеих таблиц. Здесь значения столбца category_id из таблицы product соответствуют значениям в столбце id из таблицы category , а строки объединяются, когда значения равны ( product.category_id = category.id ). Умные часы в таблице , продукт имеет идентификатор категории 2. То же значение в столбце id в таблице категория указывает на «игрушки», как выделено синим цветом выше.

Если в обеих таблицах есть столбцы с одинаковыми именами, их необходимо различать при присвоении им имени в SELECT . Вы делаете это, называя таблицу, ставя точку, а затем имя столбца. В нашем примере, однако, таблицы имеют разные имена столбцов, у которых нет общих имен.Мы можем использовать только имена столбцов в SELECT , не указывая, из каких таблиц они берутся, как в запросе ниже:

ВЫБЕРИТЕ product_name, price, category_name
ОТ продукта, категории
ГДЕ product.category_id = category.id;
 

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

Запрос данных из нескольких таблиц с помощью JOIN

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

товар

id наименование цена category_id
1 умные часы 235,00 2
2 кирпич 26,70 3
3 лампа 128.00 2
4 диван 3200.00 1
5 рабочий стол 1350.00 1
6 удлинитель 29,00 2

категория

id имя
1 мебель
2 электроника
3 игрушки

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

ВЫБРАТЬ
  product.name AS product_name,
  имя_категории AS имя_категории
ОТ ПРОДУКТА
ПРИСОЕДИНЯЙТЕСЬ к категории НА product.category_id = category.id;
 

Соединение выполняется оператором JOIN . В предложении FROM за именем первой таблицы ( продукт ) следует ключевое слово JOIN , затем имя второй таблицы ( категория ). Затем следует ключевое слово ON и условие объединения строк из разных таблиц.Имя категории присваивается на основе столбца id таблицы d, что эквивалентно category_id в таблице product (product.category_id = category.id).

Вот результат:

название_продукта название_категории
умные часы электроника
кирпичи игрушки
лампа электроника
диван мебель
рабочий стол мебель
удлинитель электроника

Умные часы имеют значение category_id , равное 2.В столбце id таблицы категории значение 2 связано с электроникой, поэтому смарт-часы относятся к электронике.

Использование оператора JOIN — наиболее распространенный метод объединения нескольких таблиц в базе данных. В статье «Иллюстрированное руководство по SQL INNER JOIN» я подробно рассказываю об этом операторе. Статья «SQL INNER JOIN, объясненная простыми словами» также углубляется в эту тему. Как упоминалось ранее, оператор INNER JOIN эквивалентен JOIN ; вы можете использовать их как взаимозаменяемые.

Выбор данных из таблиц с помощью JOIN и WHERE

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

ВЫБРАТЬ
  product.name AS product_name,
  имя_категории AS имя_категории
ОТ ПРОДУКТА
ПРИСОЕДИНЯЙТЕСЬ к категории НА product.category_id = category.id
ГДЕ category.name! = ’Toys’;
 

Вот результат:

название_продукта название_категории
умные часы электроника
лампа электроника
диван мебель
рабочий стол мебель
удлинитель электроника

Первая часть этого запроса такая же, как и последняя.Однако в этом запросе исключаются товары категории «игрушки». Мы фильтруем строки в наборе результатов, используя предложение WHERE , чтобы проверить, является ли категория отличной от «игрушки» ( category.name! = ’Toys’ ).

Для получения дополнительной практики JOIN в SQL я предлагаю вам прочитать статью «Как практиковать SQL JOIN» или посмотреть видео «Основы SQL JOIN» из серии «Мы изучаем SQL».

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

Объединение таблиц в SQL

Мы видели, как вы можете получить полную информацию об объектах, объединив несколько таблиц, которые ссылаются друг на друга в реляционной базе данных. Вы можете сделать это, используя WHERE или JOIN . Чтобы узнать больше о различиях между этими методами, я рекомендую очень интересную статью «В чем разница между наличием нескольких таблиц в FROM и использованием JOIN?».

Я дал вам только беглое представление об этой теме, так что продолжайте учиться!

Изучение SQL: объединение нескольких таблиц

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

Модель

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

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

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

Что мы знаем на данный момент?

В этой серии мы рассмотрели:

Мы воспользуемся знаниями из обеих этих статей и объединим их, чтобы написать более сложные операторы SELECT, которые будут
присоединиться к нескольким столам.

Объединение нескольких таблиц с помощью INNER JOIN

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

# 1 Нам нужно перечислить все вызовы с указанием времени их начала и окончания. Для каждого вызова мы хотим отображать, что было
результат, а также имя и фамилия сотрудника, который звонил.Мы отсортируем звонки по началу
время по возрастанию.

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

Запрос, выполняющий эту работу, приведен ниже:

SELECT сотрудник.first_name, employee.last_name, call.start_time, call.end_time, call_outcome.outcome_text

ОТ сотрудника

INNER JOIN call ON call.employee_id = employee.id

INNER JOIN call_outcome ON call.call_outcome_id =

ПО call.start_time ASC;

Результат запроса представлен ниже:

Здесь я хотел бы отметить несколько моментов:

  • Таблицы, которые мы объединили, находятся здесь, потому что нужные нам данные находятся в этих трех таблицах.
  • Каждый раз, когда я упоминаю какой-либо атрибут из любой таблицы, я использую формат table_name.attribute_name (например,
    имя сотрудника ). Хотя в этом нет необходимости, это хорошая практика, потому что иногда в двух или более таблицах в одном запросе могут использоваться одни и те же имена атрибутов, что может привести к ошибке.
  • Мы использовали INNER JOIN 2 раза, чтобы объединить 3 таблицы. Это приведет к возврату только строк, имеющих пары в другой таблице
  • Когда вы используете только ВНУТРЕННИЕ СОЕДИНЕНИЯ для объединения нескольких таблиц, порядок этих таблиц в объединениях не имеет значения.Единственное, что важно, это то, что вы используете соответствующие условия соединения после «ON» (соединение с использованием внешних ключей).

Поскольку все звонки связаны с сотрудником и результатом звонка, мы получили бы тот же результат, если бы вместо этого использовали LEFT JOIN
ВНУТРЕННЕГО СОЕДИНЕНИЯ.

Соедините несколько таблиц с помощью LEFT JOIN

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

Это проблема, которую мы хотим решить.

# 2 Перечислите все округа и клиентов, относящихся к этим странам. Для каждой страны отображается ее название на английском языке,
имя города-покупателя, а также имя этого покупателя. Вернуть даже страны без
родственные города и заказчики.

Таблицы, содержащие нужные нам данные, представлены на картинке ниже:

Во-первых, давайте быстро проверим, что содержится в этих трех таблицах.

Мы можем отметить две важные вещи:

  • Хотя каждому городу соответствует страна , не все страны имеют связанные города.
    (В Испании и России их нет)
  • То же самое и с покупателями. Каждому клиенту определено значение city_id ,
    но используются только 3 города (Берлин, Загреб и Нью-Йорк)

Давайте сначала запишем запрос, используя INNER JOIN:

ВЫБЕРИТЕ страну.country_name_eng, city.city_name, customer.customer_name

ИЗ страны

INNER JOIN city ON city.country_id = country.id

INNER JOIN customer ON customer.city_id = city.id;

Результат запроса показан на картинке ниже:

В нашей базе данных 7 округов и 6 городов, но наш запрос возвращает только 4 строки. Это результат того, что в нашей базе всего 4 клиента.Каждый из этих 4 связан со своим городом, а город связан со страной. Таким образом, INNER JOIN устранил все эти страны и города без клиентов. Но как включить их в результат?

Для этого мы будем использовать LEFT JOIN. Мы просто заменим все «INNER» на «LEFT», чтобы наш запрос был следующим:

ВЫБЕРИТЕ country.country_name_eng, city.city_name, customer.customer_name

FROM country

LEFT JOIN city ON city.country_id = country.id

ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ к клиенту НА customer.city_id = city.id;

Результат показан на картинке ниже:

Вы можете легко заметить, что теперь у нас есть все страны, даже без родственных городов (Россия и Испания),
а также все города, даже те, где нет клиентов (Варшава, Белград и Лос-Анджелес). Остальные 4 строки такие же, как в запросе с использованием INNER JOIN.

LEFT JOIN — Порядок таблиц имеет значение

Хотя порядок JOIN во INNER JOIN не важен, он не относится к LEFT JOIN. Когда мы используем LEFT
JOIN, чтобы объединить несколько таблиц, важно помнить, что это объединение будет включать все строки из таблицы с ЛЕВОЙ стороны JOIN. Давайте изменим предыдущий запрос:

ВЫБЕРИТЕ country.country_name_eng, city.city_name, customer.customer_name

ОТ клиента

LEFT JOIN city ON customer.city_id = city.id

LEFT JOIN country ON city.country_id = country.id;

Сначала можно было легко сказать, что этот запрос и предыдущий совпадают (это верно при использовании INNER
ПРИСОЕДИНИТЬСЯ). Мы использовали те же таблицы, LEFT JOINs и те же условия соединения. Давайте сначала посмотрим на результат:

Итак, что здесь произошло? Почему у нас 4 строки (те же 4, что и при использовании INNER JOIN)?

Ответ прост, и он связан с тем, как работает LEFT JOIN.Берется первая таблица ( заказчик )
и объединяет все свои строки (4 из них) в следующую таблицу ( город ). В результате получается 4 строки, потому что покупатель может принадлежать только 1 городу. Затем мы соединяем эти 4 строки со следующей таблицей ( страна ),
и снова у нас есть 4 строки, потому что город может принадлежать только 1 стране.

Причина, по которой мы не стали бы объединять эти 3 таблицы таким образом, объясняется текстом примера №2. Запрос написан таким образом, что он возвращает 4 строки, которые будут ответом на следующее: Возвращение имен всех клиентов, а также городов и стран, в которых они находятся.Возвращайте даже клиентов без родственных городов и стран.

  • Примечание: Когда вы используете LEFT JOIN, порядок таблиц в этом операторе важен, и запрос вернет другой результат, если вы измените этот порядок. Порядок на самом деле зависит от того, что вы хотите вернуть в результате.

Объедините несколько таблиц, используя оба — INNER JOIN и LEFT JOIN

Это тоже возможно. Давайте снова приведем пример.

# 3 Возвращает список всех стран и городов, у которых есть пара (исключая страны, на которые не ссылаются никакие
город).По таким парам возвращаются все покупатели. Возвращайте даже пары, не имеющие единого покупателя.

Запрос, выполняющий эту работу:

ВЫБРАТЬ country.country_name_eng, city.city_name, customer.customer_name

FROM country

INNER JOIN city ON city.country_id = country.id

LEFT JOIN customer ON customer.city_id = city.id;

Результат запроса представлен на картинке ниже:

Вы можете легко заметить, что у нас нет стран, в которых нет родственных городов (это были Испания и Россия).В
INNER JOIN удалил эти строки. Тем не менее, у нас есть сайты без клиентов (Белград, Лос-Анджелес и
Варшава). Это результат того факта, что мы использовали LEFT JOIN между таблицами city и
заказчик .

Заключение

Когда вам нужно объединить несколько таблиц, в вашем распоряжении есть INNER & LEFT JOIN (RIGHT JOIN используется редко и может быть легко заменен LEFT JOIN). Какое соединение вы будете использовать, напрямую зависит от задачи, которую вам нужно решить, и вы почувствуете это в процессе.В следующих статьях мы обсудим, как думать и организовывать себя, когда вам нужно писать более сложные запросы.

Содержание

Эмиль — профессионал в области баз данных с более чем 10-летним опытом работы во всем, что связано с базами данных. В течение многих лет он работал в сфере информационных технологий и финансов, а сейчас работает фрилансером.

Его прошлые и настоящие занятия варьируются от проектирования и программирования баз данных до обучения, консультирования и написания статей о базах данных.Также не забывайте, BI, создание алгоритмов, шахматы, филателия, 2 собаки, 2 кошки, 1 жена, 1 ребенок …

Вы можете найти его в LinkedIn

Посмотреть все сообщения Эмиля Drkusic

Последние сообщения Эмиля Drkusic (увидеть все)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(

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

[CompanyName] [varchar] (50),

[CompanyCity] [ varchar] (30)

)

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

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

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

ВСТАВИТЬ В [dbo]. [PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES (3, ‘Papa johns’, ‘San Diego’);

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

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

14

18

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

(

[ItemId] INT PRIMARY KEY CLUSTERED,

[ItemName] Varchar (50),

[UnitsSold] int,

CompanyID int,

FOREIGN KEY (CompanyID) REFERENCES Pizza

)

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

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

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

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

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

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

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

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

ВЫБРАТЬ * ИЗ Foods

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

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

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

FROM PizzaCompany pz

INNER JOIN Foods ON f

CompanyId

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

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

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

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

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

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

(

[WaterParkLocation] VARCHAR (50),

[CompanyId] int,

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

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

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

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

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

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

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

ВЫБРАТЬ * ИЗ WaterPark

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

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

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

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

w.WaterParkLocation

ОТ PizzaCompany pz

INNER JOIN Foodpanys f ON pz.CompanyId =

ПРИСОЕДИНЯЙТЕСЬ к аквапарку w.CompanyId = pz.CompanyId

ЗАКАЗАТЬ pz.CompanyId

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

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

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

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

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

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

FROM PizzaCompany pz

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

WHERE f.U

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

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

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

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

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

FROM PizzaCompany pz

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

GROUP BY pz.CompanyCity

ЗАКАЗАТЬ pz.CompanyCity

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

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

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

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

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

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

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

fs.SalesAmountQuota ОТ DimEmployee e

INNER JOIN FactSalesQuota fs

ON e.EmployeeKey = fs.Employee22Key

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

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

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

Заключение

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

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

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

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

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

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

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


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

Описание

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

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

  • ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL (иногда называемое простым соединением)
  • 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 фамилия имя любимый_сайт
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 19.04.2016
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 19.04.2016

В этом примере будут возвращены все строки из таблиц 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 фамилия имя любимый_сайт
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 19.04.2016
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 19.04.2016
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 фамилия имя любимый_сайт
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 19.04.2016
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 дата заказа
NULL 5 01.05.2016
4000 4 2016/04/20
5000 2 18.04.2016
7000 1 18.04.2016
8000 3 19.04.2016

Этот пример ПРАВОГО ВНЕШНЕГО СОЕДИНЕНИЯ вернет все строки из таблицы orders и только те строки из таблицы customers , в которых объединенные поля равны.

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

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

Другой тип соединения называется ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ SQL. Этот тип соединения возвращает все строки из таблиц ЛЕВОЙ и ПРАВОЙ со значениями 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 фамилия имя любимый_сайт
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 19.04.2016
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 дата заказа
NULL 5 01.05.2016
4000 4 2016/04/20
5000 2 18.04.2016
6000 НУЛЬ НУЛЬ
7000 1 18.04.2016
8000 3 19.04.2016
9000 НУЛЬ НУЛЬ

В этом примере 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.

.

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

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