Соединение таблиц: выборка из нескольких таблиц онлайн урок.


У нас есть две таблицы - group и student, которые связаны между собой связью один ко многим.

В этому уроке мы попытаемся получить данные из обеих таблиц в одной результирующей таблице. Это называется соединение - мы записываем столбцы одной таблицы рядом со столбцами второй таблицы.

Для этого, во-первых, необходимо после предложения FROM записать те таблицы, которые выбираем - через запятую. А после SELECT записать поля с указанием таблиц. Рассмотрим пример:

SELECT student.name, `group`.description FROM student, `group`;

Выбираем указанные поля из указанных таблиц. Но СУБД не знает как сопоставить эти данные, не взирая на присутствие внешнего ключа. Как результат - СУБД выдаст все комбинации записей из двух таблиц:

+---------+-------------+
| name | description |
+---------+-------------+
| Mike | Mathematics |
| Mike | Physics |
| Mike | Biology |
| John | Mathematics |
| John | Physics |
| John | Biology |
... . ...
... . ...
... . ...
| Jeff | Mathematics |
| Jeff | Physics |
| Jeff | Biology |
| Stanley | Mathematics |
| Stanley | Physics |
| Stanley | Biology |
+---------+-------------+
24 rows in set (0.00 sec)

Как видим - практической пользы этот результат не принесет. Для того, чтоб СУБД сопоставила значения из разных таблиц - это необходимо указать в предложении WHERE:

SELECT student.name, `group`.description FROM student, `group` WHERE 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.01 sec)

Тут мы задали условие что нужны только те записи двух таблиц, где совпадают значения `group`.id и student.group_id.

Также можно соединить полностью две таблицы, записав * после SELECT:

SELECT * FROM student, `group` WHERE student.group_id = `group`.id;
+----+---------+------+-----------+----------+----+-----------+-------------+
| id | name | age | phone | group_id | id | name | description |
+----+---------+------+-----------+----------+----+-----------+-------------+
| 1 | Mike | 25 | 345-65-78 | 2 | 2 | satr-41-P | Physics |
| 2 | John | 27 | 123-65-12 | 1 | 1 | ifka-33-M | Mathematics |
| 4 | Andy | 20 | 244-34-12 | 3 | 3 | oskt-56-B | Biology |
| 5 | Debra | 21 | 987-65-43 | 1 | 1 | ifka-33-M | Mathematics |
| 6 | Andy | 24 | 323-43-98 | 1 | 1 | ifka-33-M | Mathematics |
| 7 | Mike | 23 | 313-54-21 | 3 | 3 | oskt-56-B | Biology |
| 8 | Jeff | 25 | 213-56-23 | 2 | 2 | satr-41-P | Physics |
| 9 | Stanley | 23 | 111-23-43 | 3 | 3 | oskt-56-B | Biology |
+----+---------+------+-----------+----------+----+-----------+-------------+
8 rows in set (0.00 sec)

Таким образом к столбцам одной таблице мы присоединили столбцы второй. Соединять можно любое количество таблиц. Для избежания повторов в названиях полей результирующей таблицы необходимо использовать псевдонимы.

Проверьте свои знания
Соединить таблицы country, continent для получения названий стран и названий континентов