Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
conspect.pdf
Скачиваний:
376
Добавлен:
17.03.2016
Размер:
27.86 Mб
Скачать

Базы данных

БГУИР, ПОИТ

 

 

6.4.4. Основные разновидности JOIN

Втолько что рассмотренных примерах мы использовали несколько разновидностей JOIN’ов.

Сейчас мы рассмотрим их подробнее.

Впервую очередь нас буду интересовать:

JOIN

LEFT JOIN

RIGHT JOIN

LEFT OUTER JOIN

RIGHT OUTER JOIN

«Просто» JOIN

JOIN без дополнительных «параметров» возвращает совпадения по всем указанным столбцам (и таблицам). Если для какой-то строки в какой-то из таблиц нет совпадений, она не попадает в итоговый результат. Так, например, здесь не показаны комнаты без компьютеров и компьютеры, не установленные ни в одну из комнат.

Запрос

 

SELECT `r_name`, `c_name`

 

 

 

FROM `rooms` JOIN `computers`

 

 

 

ON `r_id`=`c_room`

 

Результат

 

 

 

 

 

 

 

LEFT [OUTER] JOIN

LEFT JOIN возвратит строки из левой таблицы даже тогда, когда для них нет совпадения в правой таблице. Так, например, здесь показаны комнаты без компьютеров, но не показаны компьютеры, не установленные ни в одну из комнат.

 

Запросы

 

SELECT `r_name`, `c_name`

 

 

 

 

FROM `rooms` LEFT JOIN `computers` ON `r_id`=`c_room`

 

 

 

 

 

 

 

 

 

 

SELECT `r_name`, `c_name`

 

 

 

 

FROM `rooms` LEFT OUTER JOIN `computers` ON `r_id`=`c_room`

 

 

Результат

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стр: 189/248

Базы данных БГУИР, ПОИТ

RIGHT [OUTER] JOIN

Запросы

 

SELECT `r_name`, `c_name`

 

 

 

FROM `rooms` RIGHT JOIN `computers` ON `r_id`=`c_room`

 

 

 

 

 

 

 

SELECT `r_name`, `c_name`

 

 

 

FROM `rooms` RIGH OUTER JOIN `computers` ON `r_id`=`c_room`

 

Результат

 

 

 

 

 

 

 

Стр: 190/248

Базы данных

БГУИР, ПОИТ

 

 

6.4.5. ВСЕ разновидности JOIN

Теперь рассмотрим подробно, какие бывают JOIN’ы.

{JOIN, INNER JOIN, CROSS JOIN} + USING или ON

В MySQL JOIN, INEER JOIN и CROSS JOIN – эквивалентны – обеспечивает-

ся поиск совпадений по всем таблицам по указанным полям.

Запрос

SELECT * FROM `rooms` JOIN `computers` ON

 

 

`r_id`=`c_room`

 

Результат

 

 

Пояснение с помощью кругов Эйлера

Стр: 191/248

Базы данных

БГУИР, ПОИТ

 

 

{JOIN, INNER JOIN, CROSS JOIN} БЕЗ USING или ON; «,»

В случае отсутствия условия объединения (ON, USING) JOIN, INEER JOIN и CROSS JOIN и «,» эквивалентны – обеспечивается поиск всех комбинаций всех записей всех таблиц.

Запрос

SELECT * FROM `rooms` JOIN `computers`

 

 

 

 

Результат

 

 

Пояснение с помощью кругов Эйлера

Стр: 192/248

Базы данных

БГУИР, ПОИТ

 

 

JOIN, STRAIGHT_JOIN

STRAIGHT_JOIN эквивалентен JOIN, но указывает, что левая таблица обязательно должна быть прочитана первой. Используется для указания оптимизатору запросов желаемого сценария работы.

Запросы

 

SELECT * FROM `rooms` STRAIGHT_JOIN `computers`

 

 

 

ON `r_id`=`c_room`

 

 

 

 

 

 

 

SELECT * FROM `rooms` STRAIGHT_JOIN `computers`

 

Пояснение с помощью кругов

 

 

 

Эйлера

 

 

 

 

 

 

 

LEFT [OUTER] JOIN, RIGHT [OUTER] JOIN

ВАЖНО! Слово OUTER можно не писать, т.к. в MySQL левые и правые объединения всегда выполняются как OUTER. Само слово введено для обеспечения совместимости.

LEFT [OUTER] JOIN

При использовании LEFT [OUTER] JOIN происходит выборка всех строк ЛЕВОЙ таблицы + совпадений из правой таблицы. Если совпадений нет – на их место подставляются NULL.

Запрос

SELECT * FROM `rooms` LEFT JOIN `computers` ON

 

 

`r_id`=`c_room`

 

Результат

 

 

Пояснение с помощью кругов Эйлера

Стр: 193/248

Базы данных

БГУИР, ПОИТ

 

 

RIGHT [OUTER] JOIN

При использовании RIGHT [OUTER] JOIN происходит выборка всех строк ПРАВОЙ таблицы + совпадений из левой таблицы. Если совпадений нет – на их место подставляются NULL.

Запрос

SELECT * FROM `rooms` RIGHT JOIN `computers` ON

 

 

`r_id`=`c_room`

 

Результат

 

 

Пояснение с помощью кругов Эйлера

NATURAL [{LEFT|RIGHT} [OUTER]] JOIN

Редкий случай. Для объединения используются ВСЕ поля, существующие в обеих таблицах.

Фактически, это запрос на поиск записей-дубликатов в двух и более таблицах (в т.ч. Относящихся к разным базам данных).

Выглядеть результат будет так (запрос не приводим в силу экзотичности задачи):

{ OJ ... LEFT OUTER JOIN ...}

Существует только для совместимости с ODBC. Если вас это заинтересо-

вало, милости просим сюда: http://dev.mysql.com/doc/refman/5.5/en/join.html

Стр: 194/248

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]