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

24:01:2010 –≥.

„асто молодые проектировщики баз данных, выучив основные SQL команды, относ€тс€ к некоторым из них с определенным непониманием, счита€ что можно обойтись "стандартным" набором запросов.   подобным запросам, не наход€щим понимани€, относитс€ команда LEFT JOIN, о которой пойдет речь в этой заметке.

 оманда Left Join SQL - смысл использовани€

ѕредположим, у нас есть микро-база данных автопарка, состо€ща€ из 2-х таблиц:Drivers & Cars.  —хема Ѕƒ
 ак видно на картинке справа, у левой таблицы водителей условно предусмотрены пол€ »м€ и ‘амили€.
“аблица же автомобилей содержит идентификатор водител€, производител€ автомобил€ и условное количество лет.

«аполним нашу базу данных, добавив туда несколько записей как в одну, так и в другую таблицы.

ƒл€ примера использована —”Ѕƒ Microsoft Access, поскольку последн€€ позвол€ет нагл€дно отобразить на скриншотах результаты. ќднако, €зык SQL €вл€етс€ универсальным и SQL примеры как на Left Join, так и другие, приведенные здесь, пойдут дл€ альтернативных баз данных - MySQL, MSSQL и пр.

“аблица Carsѕервыми представлены записи в таблице Drivers. ќни содержат 5 случайных имен-фамилий водителей.

Cars



“еперь рассмотрим таблицу водителей - внесено 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 запоса Left Join
—лева на скриншоте показан результат отработки 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)

 

 омментарии  

 
-6#8јзамат2014-07-17 06:36’ороша€ стать€. —разу стало €сно, как всЄ работает.÷итировать
 
 
-10#7джим2013-06-26 16:14можно просто усложнить добавив AND.
и тормозов не наблюдаю. как сравнение рабоча€ с ними работает быстрее и нагрузки на сервер меньше, а уж темболее не создаЄтс€ и разрушаетс€ временна€ таблица
÷итировать
 
 
+2#6¬иктор2013-01-21 04:09Cпасибо за пример с вложенным запросом, очень помог!! :-)÷итировать
 
 
+9#5—ергей2012-08-10 05:58—пасибо÷итировать
 
 
+14#4Alex2012-07-01 19:06"“еперь рассмотрим таблицу водителей" - не водителей, а машин÷итировать
 
 
+5#3vitalik2012-06-02 14:06толково разжевано! пробовал разобратьс€ по двум книгам - пошло, но не очень. с этой статьей все стало на свои места за пару минут.÷итировать
 
 
-1#2ёра2012-04-22 22:19ќтлично что забил сразу в SQL Microsoft Server и все работает! —пасибо автору!÷итировать
 
 
-19#1матвей2011-12-26 17:54хмм...интересно и мудрЄно написано÷итировать
 

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


«ащитный код
ќбновить

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

‘отоальбом

fotic.jpg

ќблако “егов