Внешнее соединение sql: | SQL | SQL-tutorial.ru

Создание внешних соединений — Visual Database Tools

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

Область применения: SQL Server (все поддерживаемые версии)

По умолчанию Конструктор запросов и представлений создает внутреннее соединение таблиц. Внутренние соединения исключают строки, не соответствующие строке из другой таблицы. Однако внешние соединения возвращают все строки хотя бы из одной таблицы или представления, упомянутых в предложении FROM, если эти строки удовлетворяют условиям поиска WHERE или HAVING. Если необходимо включить строки данных, которые не имеют совпадений в соединяемой таблице, в результирующий набор, можно создать внешнее соединение.

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

Создание внешнего соединения

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

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

    • Выберите первую таблицу для создания левого внешнего соединения.

    • Выберите вторую таблицу для создания правого внешнего соединения.

    • Выберите обе таблицы для создания полного внешнего соединения.

При указании внешнего соединения конструктор запросов и представлений изменяет линию соединения для отображения внешнего соединения.

Кроме того, конструктор запросов и представлений изменяет инструкцию SQL на панели SQL для отражения изменений типа соединения, как показано в следующей инструкции:

SELECT employee. job_id, employee.emp_id,  
   employee.fname, employee.minit, jobs.job_desc  
FROM employee LEFT OUTER JOIN jobs ON   
    employee.job_id = jobs.job_id  

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

employee , которая не содержит соответствующих строк в таблице jobs :

SELECT employee.emp_id, employee.job_id  
FROM employee LEFT OUTER JOIN jobs   
   ON employee.job_id = jobs.job_id  
WHERE (jobs.job_id IS NULL)  

Запросы с соединениями (визуальные инструменты для баз данных)
Диалоговое окно «Соединение» (визуальные инструменты для баз данных)

Введение в соединения / Хабр

По материалам статьи Craig Freedman: Introduction to Joins

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

Можно соединить две таблицы явно, перечислив обе таблицы в предложении FROM запроса. Также можно соединить две таблицы, используя для этого всё разнообразие подзапросов. Наконец, SQL Server во время оптимизации может добавить соединение в план запроса, преследуя свои цели.

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

  • Inner join

  • Outer join

  • Cross join

  • Cross apply

  • Semi-join

  • Anti-semi-join

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

create table Customers (Cust_Id int, Cust_Name varchar(10))
insert Customers values (1, 'Craig')
insert Customers values (2, 'John Doe')
insert Customers values (3, 'Jane Doe')
create table Sales (Cust_Id int, Item varchar(10))
insert Sales values (2, 'Camera')
insert Sales values (3, 'Computer')
insert Sales values (3, 'Monitor')
insert Sales values (4, 'Printer')

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

Внутренние соединения — самый распространённый тип соединений. Внутреннее соединение просто находит пары строк, которые соединяются и удовлетворяют предикату соединения. Например, показанный ниже запрос использует предикат соединения «S.Cust_Id = C.Cust_Id», позволяющий найти все продажи и сведения о клиенте с одинаковыми значениями Cust_Id:

select *
from Sales S inner join Customers C
on S.Cust_Id = C.Cust_Id
Cust_Id     Item       Cust_Id     Cust_Name
----------- ---------- ----------- ----------
2           Camera     2           John Doe
3           Computer   3           Jane Doe
3           Monitor    3           Jane Doe
Примечания:

Cust_Id = 3 купил два наименования, поэтому он фигурирует в двух строках результирующего набора.

Cust_Id = 1 не купил ничто и потому не появляется в результате.

Для Cust_Id = 4 тоже был продан товар, но поскольку в таблице нет такого клиента, сведения о такой продаже не появились в результате.

Внутренние соединения полностью коммутативны. «A inner join B» и «B inner join A» эквивалентны.

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

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

select *
from Sales S left outer join Customers C
on S.Cust_Id = C.Cust_Id
Cust_Id     Item       Cust_Id     Cust_Name
----------- ---------- ----------- ----------
2           Camera     2           John Doe
3           Computer   3           Jane Doe
3           Monitor    3           Jane Doe
4           Printer    NULL        NULL

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

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

select *
from Sales S full outer join Customers C
on S. Cust_Id = C.Cust_Id
Cust_Id     Item       Cust_Id     Cust_Name
----------- ---------- ----------- ----------
2           Camera     2           John Doe
3           Computer   3           Jane Doe
3           Monitor    3           Jane Doe
4           Printer    NULL        NULL
NULL        NULL       1           Craig

Следующая таблица показывает, строки какой из соединяемых таблиц попадут в результирующий набор (у оставшейся таблицы возможны замены NULL), она охватывает все типы внешних соединений:

Соединение

Выводятся …

A left outer join B

Все строки A

A right outer join B

Все строки B

A full outer join B

Все строки A и B

Полные внешние соединения коммутативны. Кроме того, «A left outer join B » и «B right outer join A» является эквивалентным.

Перекрестные соединения

Перекрестное соединение выполняет полное Декартово произведение двух таблиц. То есть это соответствие каждой строки одной таблицы — каждой строке другой таблицы. Для перекрестного соединения нельзя определить предикат соединения, используя для этого предложение ON, хотя для достижения практически того же результата, что и с внутренним соединением, можно использовать предложение WHERE.

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

select *
from Sales S cross join Customers C
 
Cust_Id     Item       Cust_Id     Cust_Name
----------- ---------- ----------- ----------
2           Camera     1           Craig
3           Computer   1           Craig
3           Monitor    1           Craig
4           Printer    1           Craig
2           Camera     2           John Doe
3           Computer   2           John Doe
3           Monitor    2           John Doe
4           Printer    2           John Doe
2           Camera     3           Jane Doe
3           Computer   3           Jane Doe
3           Monitor    3           Jane Doe
4           Printer    3           Jane Doe

CROSS APPLY

В SQL Server 2005 мы добавили оператор CROSS APPLY, с помощью которого можно соединять таблицу с возвращающей табличное значение функцией (table valued function — TVF), причём TVF будет иметь параметр, который будет изменяться для каждой строки. Например, представленный ниже запрос возвратит тот же результат, что и показанное ранее внутреннее соединение, но с использованием TVF и CROSS APPLY:

create function dbo.fn_Sales(@Cust_Id int)
returns @Sales table (Item varchar(10))
as
begin
  insert @Sales select Item from Sales where Cust_Id = @Cust_Id
  return
end
select *
from Customers cross apply dbo.fn_Sales(Cust_Id)
Cust_Id     Cust_Name  Item
----------- ---------- ----------
2           John Doe   Camera
3           Jane Doe   Computer
3           Jane Doe   Monitor

Также можно использовать внешнее обращение — OUTER APPLY, позволяющее нам найти всех клиентов независимо от того, купили ли они что-нибудь или нет. Это будет похоже на внешнее соединение.

select *
from Customers outer apply dbo.fn_Sales(Cust_Id)
Cust_Id     Cust_Name  Item
----------- ---------- ----------
1           Craig      NULL
2           John Doe   Camera
3           Jane Doe   Computer
3           Jane Doe   Monitor

Полусоединение и анти-полусоединение

Полусоединение — semi-join возвращает строки только одной из соединяемых таблиц, без выполнения соединения полностью. Анти-полусоединение возвращает те строки таблицы, которые не годятся для соединения с другой таблицей; т.е. они в обычном внешнем соединении выдавали бы NULL.

В отличие от других операторов соединений, не существует явного синтаксиса для указания исполнения полусоединения, но SQL Server, в целом ряде случаев, использует в плане исполнения именно полусоединения. Например, полусоединение может использоваться в плане подзапроса с EXISTS:

select *
from Customers C
where exists (
    select *
    from Sales S
    where S.Cust_Id = C.Cust_Id
)
Cust_Id     Cust_Name
----------- ----------
2           John Doe
3           Jane Doe

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

В плане запроса видно, что SQL Server действительно использует полусоединение:

|—Nested Loops(Left Semi Join, WHERE:([S].[Cust_Id]=[C].[Cust_Id]))
|—Table Scan(OBJECT:([Customers] AS [C]))
|—Table Scan(OBJECT:([Sales] AS [S]))

Существуют левые и правые полусоединения. Левое полусоединение возвращает строки левой (первой) таблицы, которые соответствуют строкам из правой (второй) таблицы, в то время как правое полусоединение возвращает строки из правой таблицы, которые соответствуют строкам из левой таблицы.

Подобным образом может использоваться анти-полусоединение для обработки подзапроса с NOT EXISTS.

Дополнение

Во всех представленных в статье примерах использовались предикаты соединения, который сравнивали, являются ли оба столбца каждой из соединяемых таблицы равными. Такой тип предикатов соединений принято называть «соединением по эквивалентности». Другие предикаты соединений (например, неравенства) тоже возможны, но соединения по эквивалентности распространены наиболее широко. В SQL Server заложено много альтернативных вариантов оптимизации соединений по эквивалентности и оптимизации соединений с более сложными предикатами.

SQL Server более гибок в выборе порядка соединения и его алгоритма при оптимизации внутренних соединений, чем при оптимизации внешних соединений и CROSS APPLY. Таким образом, если взять два запроса, которые отличаются только тем, что один использует исключительно внутренние соединения, а другой использует внешние соединения и/или CROSS APPLY, SQL Server сможет найти лучший план исполнения для запроса, который использует только внутренние соединения.

SQL FULL OUTER JOIN (с примерами)

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

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

Пример

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

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

Пример: SQL FULL OUTER JOIN

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

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


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

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

 SELECT columns
ИЗ таблицы1
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ table2
ON table1.column_name = table2.column_name; 

FULL OUTER JOIN с оператором WHERE

Команда SQL может иметь необязательное предложение WHERE с оператором FULL OUTER JOIN . Например,

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

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


SQL FULL OUTER JOIN With AS Alias ​​

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

 SELECT C.cat_name, P.prod_title
С категории AS C
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Продукты AS P
ON C.cat_id= P.cat_id; 

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


Полное внешнее соединение и другие соединения

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

Это означает,

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

аналогично

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

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

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

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

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

Выход

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

INNER JOIN

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

Вывод

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

FULL OUTER JOIN выбирает общие строки, а также все оставшиеся строки из обеих таблиц . Принимая во внимание, что LEFT JOIN выбирает общие строки, а также все остальные строки только из левый стол .

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

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

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

Вывод

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

LEFT JOIN

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

Вывод

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

FULL OUTER JOIN выбирает общие строки, а также все оставшиеся строки из обеих таблиц . В то время как RIGHT JOIN выбирает общие строки, а также все остальные строки из правой таблицы .

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

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

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

Вывод

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

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

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

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

Пример: Выходные данные SQL RIGHT JOIN

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

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

Содержание

Внешние соединения — Справочник по API ODBC

Редактировать

Твиттер LinkedIn Фейсбук Эл. адрес

  • Статья
  • 2 минуты на чтение

ODBC поддерживает синтаксис левого, правого и полного внешнего соединения SQL-92. Управляющая последовательность для внешних соединений:

{oj внешнее соединение }

, где внешнее соединение равно

ссылка на таблицу { LEFT | ПРАВО | FULL} OUTER JOIN { ссылка на таблицу | внешнее соединение } ON условие поиска

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

Запрос на внешнее соединение должен появиться после Ключевое слово FROM и перед предложением WHERE (если оно существует). Полную информацию о синтаксисе см. в разделе Escape-последовательность внешнего соединения в Приложении C: Грамматика SQL.

Например, следующие операторы SQL создают тот же набор результатов, в котором перечислены все клиенты и показаны открытые заказы. Первый оператор использует синтаксис escape-последовательности. Второй оператор использует собственный синтаксис для Oracle и несовместим.

 ВЫБЕРИТЕ Customers.CustID, Customers.Name, Orders.OrderID, Orders.Status
   FROM {oj Customers LEFT OUTER JOIN Orders ON Customers.CustID=Orders.CustID}
   ГДЕ Orders.Status='OPEN'
  
ВЫБЕРИТЕ Customers.CustID, Customers.Name, Orders.OrderID, Orders.Status
   ОТ клиентов, заказы
   ГДЕ (Orders.Status='OPEN') AND (Customers.CustID= Orders.CustID(+))
 

Чтобы определить типы внешних соединений, которые поддерживаются источником данных и драйвером, приложение вызывает SQLGetInfo с флагом SQL_OJ_CAPABILITIES. Могут поддерживаться следующие типы внешних соединений: левое, правое, полное или вложенное внешнее соединение; внешние соединения, в которых имена столбцов в предложении ON не имеют того же порядка, что и соответствующие имена таблиц в предложении OUTER JOIN ; внутренние соединения в сочетании с внешними соединениями; и внешние соединения с использованием любого оператора сравнения ODBC.

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

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

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