Объединение таблиц (внешнее объединение)

Пусть надо вывести всех пользователей и темы, которые они создавали, если таковые имеются. Если воспользоваться внутренним объединением, то получим в итоге следующее:

В результирующей таблице есть только те пользователи, которые создавали темы. А по условиям задачи надо, чтобы выводились все имена. Для этого немного изменим запрос:

SELECT users.name, topics.topic_name FROM users

LEFT OUTER JOIN topics ON users.id_user=topics.id_author;

В итоге получаем желаемый результат – все пользователи и темы, ими созданные. Если пользователь не создавал тему, то в соответствующем столбце стоит значение NULL.

Итак, в запрос было добавлено ключевое слово – LEFT OUTER JOIN, указывающее, что из таблицы слева надо взять все строки, и произошла замена ключевого слова WHERE на ON. Кроме ключевого слова LEFT OUTER JOIN может быть использовано ключевое слово RIGHT OUTER JOIN. Тогда будут выбираться все строки из правой таблицы и имеющиеся связанные с ними из левой таблицы. И наконец, возможно полное внешнее объединение, которое извлечет все строки из обеих таблиц и свяжет между собой те, которые могут быть связаны. Ключевое слово для полного внешнего объединения – FULL OUTER JOIN.

Изменим в запросе левостороннее объединение на правостороннее:

Как видно, теперь есть все темы (все строки из правой таблицы), а вот пользователи только те, которые темы создавали (т.е. из левой таблицы выбираются только те строки, которые связаны с правой таблицей). К сожалению, полное объединение СУБД MySQL не поддерживает.

Синтаксис для внешнего объединения следующий:

SELECT имя_таблицы_1.имя_столбца, имя_таблицы_2.имя_столбца FROM имя_таблицы_1 ТИП ОБЪЕДИНЕНИЯ имя_таблицы_2 ON условие_объединения; где ТИП ОБЪЕДИНЕНИЯ – либо LEFT OUTER JOIN, либо RIGHT OUTER JOIN.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: