В этом руководстве вы узнаете о предложении SQL Server LEFT JOIN и о том, как запрашивать данные из нескольких таблиц.
Введение в предложение LEFT JOIN SQL Server
LEFT JOIN — это предложение оператора SELECT. Предложение LEFT JOIN позволяет запрашивать данные из нескольких таблиц.
LEFT JOIN возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице не найдено соответствующих строк, используются NULL.
Ниже показано, как объединить две таблицы T1 и T2 с помощью предложения LEFT JOIN:
SELECT select_list FROM T1 LEFT JOIN T2 ON join_predicate;
В этом синтаксисе T1 и T2 — это левая и правая таблицы соответственно.
Для каждой строки из таблицы T1 запрос сравнивает ее со всеми строками из таблицы T2. Если пара строк приводит к тому, что предикат соединения оценивается как TRUE, значения столбцов из этих строк будут объединены для формирования новой строки, которая затем включается в набор результатов.
Если строка из левой таблицы(T1) не имеет соответствующей строки из таблицы T2, запрос объединяет значения столбцов строки из левой таблицы со значением NULL для каждого значения столбца из правой таблицы.
Короче говоря, предложение LEFT JOIN возвращает все строки из левой таблицы(T1) и соответствующие строки или значения NULL из правой таблицы(T2).
Ниже показано LEFT JOIN двух таблиц T1(1, 2, 3) и T2(A, B, C). LEFT JOIN сопоставит строки из таблицы T1 со строками из таблицы T2, используя шаблоны:
На этой иллюстрации ни одна строка из таблицы T2 не соответствует строке 1 из таблицы T1, поэтому используется NULL. Строки 2 и 3 из таблицы T1 соответствуют строкам A и B из таблицы T2 соответственно.
Пример LEFT JOIN для SQL Server
См. следующие таблицы products и order_items:
Каждая позиция заказа на продажу включает один продукт. Связь между таблицами order_items и products — столбец product_id.
В следующем операторе используется предложение LEFT JOIN для запроса данных из таблиц products и order_items:
SELECT product_name, order_id FROM production.products p LEFT JOIN sales.order_items o ON o.product_id = p.product_id ORDER BY order_id;
Как ясно видно из набора результатов, список NULL в столбце order_id указывает на то, что соответствующие продукты еще не были проданы ни одному клиенту.
Можно использовать предложение WHERE для ограничения набора результатов. Следующий запрос возвращает продукты, которые не появляются ни в одном заказе на продажу:
SELECT product_name, order_id FROM production.products p LEFT JOIN sales.order_items o ON o.product_id = p.product_id WHERE order_id IS NULL
Как всегда, SQL Server обрабатывает предложение WHERE после предложения LEFT JOIN.
В следующем примере показано, как объединить три таблицы: production.products, sales.orders и sales.order_items с помощью предложений LEFT JOIN:
SELECT p.product_name, o.order_id, i.item_id, o.order_date FROM production.products p LEFT JOIN sales.order_items i ON i.product_id = p.product_id LEFT JOIN sales.orders o ON o.order_id = i.order_id ORDER BY order_id;
Вот что получилось:
SQL Server LEFT JOIN: условия в предложении ON и WHERE
Следующий запрос находит продукты, относящиеся к заказу с идентификатором 100:
SELECT product_name, order_id FROM production.products p LEFT JOIN sales.order_items o ON o.product_id = p.product_id WHERE order_id = 100 ORDER BY order_id;
Давайте перенесем условие order_id = 100 в предложение ON:
SELECT p.product_id, product_name, order_id FROM production.products p LEFT JOIN sales.order_items o ON o.product_id = p.product_id AND o.order_id = 100 ORDER BY order_id DESC;
Запрос вернул все продукты, но только заказ с идентификатором 100 содержит связанную с ним информацию о продукте.
Обратите внимание, что для предложения INNER JOIN условие в предложении ON функционально эквивалентно, если оно помещено в предложение WHERE.
В этом руководстве вы узнали, как использовать предложение SQL Server LEFT JOIN для извлечения данных из нескольких связанных таблиц.