Часто молодые проектировщики баз данных, выучив основные SQL команды, относятся к некоторым из них с определенным непониманием, считая что можно обойтись "стандартным" набором запросов. К подобным запросам, не находящим понимания, относится команда LEFT JOIN, о которой пойдет речь в этой заметке.
Команда Left Join SQL - смысл использования
Предположим, у нас есть микро-база данных автопарка, состоящая из 2-х таблиц:Drivers & Cars.
Как видно на картинке справа, у левой таблицы водителей условно предусмотрены поля Имя и Фамилия.
Таблица же автомобилей содержит идентификатор водителя, производителя автомобиля и условное количество лет.
Заполним нашу базу данных, добавив туда несколько записей как в одну, так и в другую таблицы.
Для примера использована СУБД Microsoft Access, поскольку последняя позволяет наглядно отобразить на скриншотах результаты. Однако, язык SQL является универсальным и SQL примеры как на Left Join, так и другие, приведенные здесь, пойдут для альтернативных баз данных - MySQL, MSSQL и пр.
Первыми представлены записи в таблице Drivers. Они содержат 5 случайных имен-фамилий водителей.
Теперь рассмотрим таблицу водителей - внесено 3 записи. Записи полей Manufacturer и Years созданы исключительно для наполнения. Однако, обратите внимание на поле Id_Driver - туда сознательно внесено в 1-е поле идентификатор 1, а во второе и третье поле - 5. Таким образом, мы получаем ситуацию:
- Вася Пупкин владеет автомобилем Honda
- Александр Фомин владеет двумя автомобилями - Мазда и Форд
- Сергей Михалков, Василий Кривоносов, Виктор Медведев не владеют автомобилями
Если упустить на данный момент left join и обратиться к другим элементарным SQL командам, то, к примеру, выбрать водителя, имеющего в распоряжении какую-то определенную машину не составит труда.
Однако, предствате себе, что вам нужно выбрать всех водителей, не имеющих автомобилей. Здесь задача не может быть решена простой простановкой связей - нужно использовать или Left Join или воспользоваться подзапросом SQL.
SQL запрос с Left Join:
SELECT *
FROM Drivers AS D
LEFT JOIN Cars AS C ON D.ID=C.Id_Driver
WHERE C.Id_Driver is NULL;
Пояснение:
Команда Left Join создает виртуальную таблицу, на основе таблиц, указанных в условии AS. Проставляется связь между данными таблицами, однако, даже если в правой таблице не окажется соответствий левому ID, то данному полю при слиянии будет присвоено значение NULL.
Слева на скриншоте показан результат отработки SQL запроса примера, приведенного выше.
Вывод: Команда SQL Left Join может быть эффективным средством, когда нужно выбрать данные в связанных таблицах, наличие данных в которых не позволяет провести классический запрос через связи, указанные в условии WHERE.
P.S:Как было указано выше, данный пример можно решить подзапросом, однако, Left Join выглядит проще, с моей личной точки зрения. Впрочем, кому-то, возможно подзапросы будут удобнее.
Пример SQL запроса по примеру выше с использованием подзапроса:
SELECT *
FROM Drivers AS D
WHERE NOT EXISTS
(SELECT C.Id_Driver FROM Cars AS C WHERE D.ID=C.Id_Driver)
|
Комментарии
и тормозов не наблюдаю. как сравнение рабочая с ними работает быстрее и нагрузки на сервер меньше, а уж темболее не создаётся и разрушается временная таблицаЦитировать
RSS лента комментариев этой записи.