Использование LEFT JOIN / RIGHT JOIN онлайн урок.


В предыдущем уроке мы рассмотрели соединение таблиц при помощи JOIN. Мы могли составить выборку из поля названия группы и имени студента, который в ней состоит.

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

INSERT INTO `group` (name, description) VALUES ('desm-81-C', 'Chemistry');
+----+-----------+-------------+
| id | name | description |
+----+-----------+-------------+
| 1 | ifka-33-M | Mathematics |
| 2 | satr-41-P | Physics |
| 3 | oskt-56-B | Biology |
| 4 | desm-81-C | Chemistry |
+----+-----------+-------------+

Тогда, при попытке вывести, например, имена студентов и описания их групп, получим следующее:

SELECT student.name, `group`.description
FROM student JOIN `group`
ON student.group_id = `group`.id;
+---------+-------------+
| name | description |
+---------+-------------+
| Mike | Physics |
| John | Mathematics |
| Andy | Biology |
| Debra | Mathematics |
| Andy | Mathematics |
| Mike | Biology |
| Jeff | Physics |
| Stanley | Biology |
+---------+-------------+
8 rows in set (0.04 sec)

Как видим, тут нету в списке Chemistry, так как для этой записи не выполняется условие соединения student.group_id = `group`.id;

Для того, чтобы получить полный список групп и, возможно, студентов, которые там есть, используется один из операторов RIGHT JOIN или LEFT JOIN. В нашем случае необходимо использовать RIGHT JOIN:

SELECT student.name, `group`.description
FROM student RIGHT JOIN `group`
ON student.group_id = `group`.id;
+---------+-------------+
| name | description |
+---------+-------------+
| Mike | Physics |
| John | Mathematics |
| Andy | Biology |
| Debra | Mathematics |
| Andy | Mathematics |
| Mike | Biology |
| Jeff | Physics |
| Stanley | Biology |
| NULL | Chemistry |
+---------+-------------+
9 rows in set (0.02 sec)

Как видим, в правой колонке добавилась группа по химии. Но т.к. студентов в ней нет (нету записей с нужным id в таблице student), то значение напротив Chemistry равно NULL - значение неизвестно.

Заметим, что все, что мы исправили - это написали вместо JOIN оператор RIGHT JOIN.

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

SELECT student.name, `group`.description
FROM student RIGHT JOIN `group`
ON student.group_id = `group`.id;


SELECT student.name, `group`.description
FROM `group` LEFT JOIN student
ON student.group_id = `group`.id;


Результатом последнего, как уже было сказано, будет то же самое:

+---------+-------------+
| name | description |
+---------+-------------+
| Mike | Physics |
| John | Mathematics |
| Andy | Biology |
| Debra | Mathematics |
| Andy | Mathematics |
| Mike | Biology |
| Jeff | Physics |
| Stanley | Biology |
| NULL | Chemistry |
+---------+-------------+
9 rows in set (0.02 sec)


Проверьте свои знания
Добавить в таблицу languages новые языки. Получить выборку тех языков, которые не используются в имеющихся в базе данных странах. Использовать оператор сравнения IS NULL