После авторизации Вы получите доступ к файлам, скрытым материалам сайта, исходным кодам
возможность комментировать и т.д.

Вы можете авторизоваться на сайте всего одним кликом:

2016-07-08
SQL → Оператор левого объединения
Объединение таблиц

Помимо оператора INNER JOIN (внутреннее объединение), которым вы пользо­ вались до сих пор, в MySQL существует еще оператор левого объединения. Чтобы понять, в чем заключается его особенность, вспомните, как работает INNER JOIN...

Оператор левого объединения

Для стандартного объединения двух таблиц MySQL перебирает все возможные комбинации строк. В простейшем случае, когда две таблицы имеют по две записи каждая, объединение выполняется следующим образом: строка 1 таблицы 1 со строкой 1 таблицы 2; строка 1 таблицы 1 со строкой 2 таблицы 2; строка 2 таблицы 1 со строкой 1 таблицы 2 и, наконец, строка 2 таблицы 1 со строкой 2 та­блицы 2. Получив результат, MySQL смотрит на условие ON и решает, какие строки нужно оставить, например те, в которых столбец id первой таблицы совпадает со столбцом authorid второй.

В некоторых случаях это решение не подходит потому, что в результирующий набор необходимо включить строки из таблицы 1 (author), которые не имеют соответствий в таблице 2 (material). Оператор левого объединения добавит в список результатов все строки первой таблицы (расположенной слева), даже если для них не удастся найти связанных записей во второй (расположенной справа). Всем столбцам таких строк, взятым из правой таблицы, будут присвоены значения NULL.

Чтобы выполнить в MySQL левое объединение двух таблиц, достаточно ис­пользовать команду LEFT JOIN вместо INNER JOIN в операторе FROM. Вот скор­ректированный запрос, который перечисляет авторов и количество их материалов:

SELECT author.name, COUNT(material.id) AS nummaterial
FROM author LEFT JOIN material
ON authorid = author.id
GROUP BY author.id

В данном запросе стоит отметить два важных момента:

  1. Необходимо писать author LEFT JOIN material, а не material LEFT JOIN author. Порядок, в котором перечисляются таблицы для объединения, очень важен. Запись LEFT JOIN приведет к отображению в результатах запроса всех строк из таблицы, которая находится слева (author).
  2. Вместо GROUP BY authored следует использовать GROUP BY author, id. author.id — это столбец id в таблице author, a authored — это столбец в таблице material. В предыдущих запросах SELECT объединение основывалось на том, что значения этих столбцов совпадают. Однако когда оператор LEFT JOIN создает результирующую строку, основанную на строке из таблицы author, не имеющей соответствия в таблице material, он присваивает NULL всем полям, которые взяты из таблицы material. Это касается и поля authorid. Если бы вы написали GROUP BY authorid, запрос сгруппировал бы всех авторов, у которых нет ни одного материала, поскольку в таком случае после вы­ полнения оператора LEFT JOIN соответствующий им столбец authorid был бы равен NULL.
520
0
Пожалуйста, авторизируйтесь, чтобы скачать архив с файлами урока