Читайте также:
|
|
Чтобы изменить предыдущий запрос и получить результирующий на_ бор, включающий только 18 строк (по одной для каждого сотрудника), понадобится описать взаимосвязь двух таблиц. Я уже показал, что связью между двумя таблицами служит столбец employee.dept_id, оста_ лось только добавить эту информацию в подблок on блока from:
mysql> SELECT e.fname, e.lname, d.name
_> FROM employee e JOIN department d _> ON e.dept_id = d.dept_id;
+__________+___________+________________+ | fname | lname | name | +__________+___________+________________+
| Susan | | Hawthorne | | 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 | | |
| John | | Gooding | | Loans | | |
| Michael | | Smith | | Administration | | |
| Susan | | Barker | | Administration | | |
| Robert | | Tyler | | Administration | |
+__________+___________+________________+ 18 rows in set (0.00 sec)
Теперь благодаря добавлению подблока on, предписывающего серверу соединять таблицы employee и department, прослеживая связь от одной таблицы к другой по столбцу dept_id, имеем вместо 54 строк ожидае_ мые 18. Например, строка Сьюзен Хоторн (Susan Hawthorne) в табли_ це employee в столбце dept_id содержит 1 (в примере не показано). Сер_ вер использует это значение для поиска строки в таблице department, столбец dept_id которой содержит 1, и извлекает значение 'Operations' из столбца name этой строки.
Если определенное значение столбца dept_id присутствует в одной таб_ лице, но его нет в другой, соединение строк не происходит, и они не включаются в результирующий набор. Такой тип соединения называ_ ют внутренним соединением (inner join); это наиболее широко исполь_ зуемый тип соединения. Поясню: если в таблице department есть четвер_ тая строка для отдела маркетинга, но ни один сотрудник не приписан к нему, отдел маркетинга не попадет в результирующий набор. Анало_
94 Глава 5. Запрос к нескольким таблицам
гично, если некоторые сотрудники зарегистрированы в отделе с ID 99, которого нет в таблице department, эти сотрудники не попадут в резуль_ тирующий набор. Если требуется включить все строки той или иной таблицы независимо от наличия соответствия, можно воспользоваться внешним соединением (outer join), но мы рассмотрим это в главе 10.
В предыдущем примере в блоке from я не указал тип используемого со_ единения. Однако если требуется соединить две таблицы путем внут_ реннего соединения, это следует явно указать в блоке from. Вот тот же пример с добавлением типа соединения (обратите внимание на ключе_ вое слово INNER (внутренний)):
mysql> SELECT e.fname, | e.lname, d.name | |||
_> FROM employee e | INNER JOIN department d | |||
_> | ON e.dept_id = d.dept_id; | |||
+__________+___________+________________+ | ||||
| fname | | | lname | | name | | |
+__________+___________+________________+ | ||||
| Susan | | Hawthorne | 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 | | | |
| John | | Gooding | | Loans | | | |
| Michael | | Smith | | Administration | | ||
| Susan | | Barker | | Administration | | ||
| Robert | | Tyler | | Administration | | ||
+__________+___________+________________+ 18 rows in set (0.00 sec)
Если тип соединения не задан, сервер по умолчанию проведет внутрен_ нее соединение. Однако, как выяснится в главе 10, есть несколько ти_ пов соединений, поэтому указание точного типа требуемого соедине_ ния должно войти в привычку.
Если имена столбцов, используемых для соединения двух таблиц, сов_ падают (что имеет место в предыдущем запросе), можно вместо под_ блока on применить подблок using:
mysql> SELECT e.fname, e.lname, d.name
_> FROM employee e INNER JOIN department d _> USING (dept_id);
+__________+___________+________________+
Что такое соединение? | ||||
| fname | | | lname | | name | | |
+__________+___________+________________+ | ||||
| Susan | | Hawthorne | 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 | | |
| John | | | Gooding | | Loans | | |
| Michael | | | Smith | | Administration | | |
| Susan | | | Barker | | Administration | | |
| Robert | | | Tyler | | Administration | |
+__________+___________+________________+ 18 rows in set (0.01 sec)
Поскольку using – сокращенная запись, которая может использовать_ ся только в определенной ситуации, во избежание путаницы я всегда предпочитаю подблок on.
Дата добавления: 2015-08-17; просмотров: 60 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Декартово произведение | | | ANSI_синтаксис соединения |