Меня часто задают вопросы в интервью, что, "что такое внешнее объединение в SQL"?
В то время как этому можно ответить, интересно, каковы могли бы быть некоторые классические и хорошие реальные примеры, где (слева) ВНЕШНЕЕ ОБЪЕДИНЕНИЕ используется?
В базе данных Northwind в таблице «Клиенты и заказы».
Выполнение внутреннего соединения предоставит вам только тех клиентов, которые разместили заказы.
Выполнение внешнего соединения приведет к получению всех клиентов и заказов для клиентов, которые разместили заказы.
Ниже приводится визуальное представление левого внешнего соединения
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
. Подробнее о соединениях в статье ниже http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx (одна из лучших статей, которую необходимо прочитать)
A LEFT OUTER JOIN
можно использовать, когда вам нужны все записи из одной таблицы, а также записи из другой таблицы, если таковые имеются.
Например, данная таблица Пользователь
и Адрес
, где Адрес
имеет FK для пользователя
, и может быть 0 или более адресов. на пользователя:
select *
from User u
left outer join Address a on u.UserID = a.UserID
Это гарантирует, что вы получите все записи пользователя
, независимо от того, была ли соответствующая запись адреса
или нет.
Если вы хотите показать всех пользователей, у которых нет адресов, вы можете сделать это:
select *
from User u
left outer join Address a on u.UserID = a.UserID
where a.UserID is null
Классический пример - это клиенты и заказы. У одних клиентов есть заказы, у других - нет. Вы хотите показать список клиентов с общим объемом продаж. Таким образом, вы выполняете левое внешнее соединение клиента с заказом и получаете:
Клиент A: 100 долларов США; Клиент B: 0 долларов США; Клиент C: 500 долларов США
вместо:
Клиент A: 100 долларов США; Клиент C: 500 долларов США
Чтобы добавить к ответу Робина Дэя, вы также можете использовать левое внешнее соединение, чтобы захватить только тех клиентов, которые НЕ разместили заказы, проверив значение NULL.
SELECT *
FROM Customer
LEFT OUTER JOIN Order
ON Customer.CustomerId = Order.CustomerId
WHERE Order.CustomerId IS NULL
Вот пример:
Мне нужен список всех клиентов с их ваучерами, мне также нужны клиенты, которые никогда не использовали ваучеры.
SELECT *
FROM Customer
LEFT OUTER JOIN Voucher
ON Customer.CustomerId = Voucher.CustomerId
Получите список всех клиентов, включая подробную информацию о сделанных ими заказах. Некоторые клиенты, возможно, не сделали заказы, и поэтому ВНУТРЕННЕЕ СОЕДИНЕНИЕ исключит их из этого списка.
SELECT
*
FROM
Customer
LEFT OUTER JOIN
Order
ON
Customer.CustomerId = Order.CustomerId