Что такое соединение?
91
| Field | Type | Null | Key | Default |
++++++
|
dept_id
| smallint(5) unsigned | | PRI | NULL |
| name | varchar(20) | | | |
++++++
2 rows in set (0.03 sec)
Скажем, требуется выбрать имя и фамилию каждого сотрудника, а так
же название отдела, в котором он работает.
Поэтому запрос должен бу
дет извлекать столбцы
employee.fname
,
employee.lname
и
department.name
.
Но как можно получить данные двух таблиц одним запросом? Ответ
кроется в столбце
employee.dept_id
, в котором
хранится ID отдела каж
дого сотрудника (более формально, столбец
employee.dept_id
является
внешним ключом
,
ссылающимся на таблицу
department
). Запрос, кото
рый вскоре будет представлен, указывает серверу использовать стол
бец
employee.dept_id
как
мост
между
таблицами
employee
и
department
,
обеспечивая таким образом возможность включения столбцов обеих
таблиц в результирующий набор запроса. Такой тип операции называ
ется соединением.
Декартово произведение
Начнем с самого простого: поместим таблицы
employee
и
department
в блок
from
запроса и посмотрим, что произойдет.
Вот запрос, выбираю
щий имена и фамилии сотрудников, а также название отдела. Здесь
в блоке
from
указаны
обе таблицы, разделенные ключевым словом
join
:
mysql>
SELECT e.fname, e.lname, d.name
> FROM employee e JOIN department d;
++++
| fname | lname | name |
++++
| Michael | Smith | Operations |
| Susan | Barker | Operations |
| Robert | Tyler | Operations |
| Susan | Hawthorne | Operations |
| John | Gooding | Operations |
| Helen | Fleming | Operations |
| Chris | Tucker | Operations |
| Sarah | Parker | Operations |
| Jane | Grossman | Operations |
| Paula | Roberts | Operations |
| Thomas | Ziegler | Operations |
| Samantha | Jameson | Operations |
| John | Blake | Operations |
| Cindy | Mason | Operations |
| Frank | Portman | Operations |
| Theresa | Markham | Operations |
| Beth | Fowler | Operations |
| Rick | Tulman | Operations |