SQL Join: возвращаем строки из левой таблицы без совпадений

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для вывода строк из левой таблицы, которые не присутствуют в правой, используйте конструкцию LEFT JOIN в связке с проверкой на NULL в соответствующем поле правой таблицы:

SQL
Скопировать код
SELECT l.*
FROM left_table l
LEFT JOIN right_table r ON l.id = r.id
WHERE r.id IS NULL;

Такой SQL-запрос выберет все записи из left_table, которые не нашли соответствия в right_table.

Кинга Идем в IT: пошаговый план для смены профессии

Анализ и вариации

Использование NOT EXISTS для больших наборов данных

В случае работы с большими объемами данных, запросы с использованием NOT EXISTS могут выполняться быстрее благодаря эффективному использованию индексов. Это можно сравнить с пользованием быстрым спорткаром в мире SQL:

SQL
Скопировать код
SELECT l.*
FROM left_table l
WHERE NOT EXISTS (
    SELECT 1
    FROM right_table r
    WHERE l.id = r.id
);

Помните о важности процесса индексирования: это как проверка мощности двигателя вашего автомобиля.

NOT IN для простоты написания запроса

NOT IN идеально подходит для обработки небольших объемов данных или когда у вас есть определенный перечень значений. Это удобный способ отфильтровать ненужные строки:

SQL
Скопировать код
SELECT l.*
FROM left_table l
WHERE l.id NOT IN (
    SELECT r.id
    FROM right_table r
);

Однако, если ваши столбцы могут содержать NULL, будьте дополнительно внимательны: NOT IN может дать неожиданные результаты.

Визуализация

Представьте себе, что вы – владелец строительной компании. Ваша задача — определить, какие материалы есть на складе, но ещё не были использованы на строительстве:

Markdown
Скопировать код
Материалы на складе: [🧱1, 🧱2, 🧱3]
Материалы на стройке: [🧱2, 🧱3, 🧱4]

Ваша задача — найти материалы, которые находятся только на складе и не использовались на стройке.

SQL
Скопировать код
SELECT S.*
FROM Storage S
LEFT JOIN Construction_Site C ON S.material = C.material
WHERE C.material IS NULL;

Результат:

Markdown
Скопировать код
Материалы на складе: [🧱1]

Таким образом с помощью SQL-запроса вы определяете какие материалы находятся на складе, но ещё не использовались на строительстве.

Мелкие детали и особенности

Типы объединений и их нюансы

Важно четко понимать различия между LEFT, RIGHT и FULL объединениями, чтобы правильно ориентироваться при сравнении таблиц, подобно тому, как важно знать правила шахмат.

Работа с колонками, имеющими одинаковые имена

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

Отладка сложных запросов

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

Полезные материалы

  1. Визуальное представление объединений SQL – CodeProject — графическое объяснение объединений SQL, полезное для понимания принципов их работы, как обучение катанию на велосипеде.
  2. Читает ли SQL Server все аргументы функции COALESCE, если первый аргумент не NULL? – Database Administrators Stack Exchange — дискуссия о том, как SQL Server работает с функцией COALESCE и вопросы производительности, связанные с этим.