Left Join SQL пример запроса с объяснением

24:01:2010 Рі.

Часто молодые проектировщики баз данных, выучив основные 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)

 

Комментарии  

 
-7#8Азамат2014-07-17 06:36Хорошая статья. Сразу стало ясно, как всё работает.Цитировать
 
 
-11#7джим2013-06-26 16:14можно просто усложнить добавив AND.
и тормозов не наблюдаю. как сравнение рабочая с ними работает быстрее и нагрузки на сервер меньше, а уж темболее не создаётся и разрушается временная таблица
Цитировать
 
 
+1#6Виктор2013-01-21 04:09Cпасибо за пример с вложенным запросом, очень помог!! :-)Цитировать
 
 
+8#5Сергей2012-08-10 05:58СпасибоЦитировать
 
 
+13#4Alex2012-07-01 19:06"Теперь рассмотрим таблицу водителей" - не водителей, а машинЦитировать
 
 
+4#3vitalik2012-06-02 14:06толково разжевано! пробовал разобраться по двум книгам - пошло, но не очень. с этой статьей все стало на свои места за пару минут.Цитировать
 
 
-2#2Юра2012-04-22 22:19Отлично что забил сразу в SQL Microsoft Server и все работает! Спасибо автору!Цитировать
 
 
-21#1матвей2011-12-26 17:54хмм...интересно и мудрёно написаноЦитировать
 

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



Обновить

« ASP.NET 4.0 публикация проекта и проблемы с ASPNETDB.MDF   Передача произвольного количества аргументов в функции PHP »
← Раньше

Фотоальбом

fotic.jpg

Облако Тегов