Читайте также:
|
|
Нотация, используемая в данной книге для соединения таблиц, была введена в версии SQL92 стандарта ANSI SQL. Во всех основных СУБД (Oracle Database, Microsoft SQL Server, MySQL, IBM DB2 Universal Da_ tabase, Sybase Adaptive Server) принят синтаксис соединения SQL92. Поскольку многие серверы существовали еще до выхода специфика_ ции SQL92, все они включают и старый синтаксис соединения. Напри_ мер, всем этим серверам был бы понятен такой вариант предыдущего запроса:
mysql> SELECT e.fname, e.lname, d.name
_> FROM employee e, department d _> WHERE 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 | | |
Глава 5. Запрос к нескольким таблицам | |||
| 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)
Этот старый метод описания соединений не включает подблок on. Таб_ лицы указаны в блоке from через запятую, а условия соединения вклю_ чены в блок where. Хотя можно игнорировать синтаксис SQL92 в поль_ зу старого синтаксиса соединений, у синтаксиса ANSI есть следующие преимущества:
• Условия соединения и фильтрации разнесены в два разных блока (подблок on и блок where соответственно), что упрощает понимание запроса.
• Условия соединения для каждой пары таблиц содержатся в собст_ венном блоке on, что уменьшает вероятность ошибочного исключе_ ния части соединения.
• Запросы, использующие синтаксис соединения SQL92, портируют_ ся на разные серверы БД, тогда как старый синтаксис немного от_ личается для каждого сервера.
Преимущества синтаксиса соединения SQL92 заметнее в сложных за_ просах, включающих как условия соединения, так и условия фильт_ рации. Рассмотрим следующий запрос, по которому возвращаются все счета, открытые опытными операционистами (нанятыми до 2003 го_ да), в настоящее время приписанными к отделению Woburn:
mysql> | SELECT a.account_id, a.cust_id, a.open_date, a.product_cd | ||||||
_> | FROM account a, | branch b, employee e | |||||
_> | WHERE | a.open_emp_id = e.emp_id | |||||
_> | AND | e.start_date <= '2003_01_01' | |||||
_> | AND | e.assigned_branch_id = | b.branch_id | ||||
_> | AND | (e.title = 'Teller' OR e.title = 'Head Teller') | |||||
_> | AND | b.name = 'Woburn Branch'; | |||||
+____________+_________+____________+____________+ | |||||||
| account_id | | cust_id | | open_date | | | product_cd | | |||
+____________+_________+____________+____________+ | |||||||
| | | | | 2000_01_15 | | | CHK | | | ||
| | | | | 2000_01_15 | | | SAV | | | ||
| | | | | 2004_06_30 | | | CD | | | ||
| | | | | 2001_03_12 | | | CHK | | | ||
| | | | | 2001_03_12 | | | SAV | | |
Соединение трех и более таблиц | ||||||||
| | | | | | 2004_01_12 | | | CD | | | ||
| | | | | | 2004_03_22 | | | BUS | | |
+____________+_________+____________+____________+ 7 rows in set (0.01 sec)
В этом запросе не так просто определить, какие условия блока where являются условиями соединения, а какие – условиями фильтрации. Также не вполне очевидно, какой тип соединения используется (для установления типа соединения необходимо внимательно рассмотреть условия соединения в блоке where – нет ли там каких_либо специаль_ ных символов), и сложно определить, не были ли упущены какие_либо условия соединения. Вот тот же запрос, записанный с использованием синтаксиса соединения SQL92:
mysql> SELECT a.account_id, a.cust_id, a.open_date, a.product_cd _> FROM account a INNER JOIN employee e
_> ON a.open_emp_id = e.emp_id _> INNER JOIN branch b
_> ON e.assigned_branch_id = b.branch_id _> WHERE e.start_date <= '2003_01_01'
_> AND (e.title = 'Teller' OR e.title = 'Head Teller') _> AND b.name = 'Woburn Branch';
+____________+_________+____________+____________+ | account_id | cust_id | open_date | product_cd | +____________+_________+____________+____________+
| | | | | | 2000_01_15 | | CHK | | | |||
| | | | | | 2000_01_15 | | SAV | | | |||
| | | | | | 2004_06_30 | | CD | | | |||
| | | | | | 2001_03_12 | | | CHK | | | ||
| | | | | | 2001_03_12 | | | SAV | | | ||
| | | | | | 2004_01_12 | | | CD | | | ||
| | | | | | 2004_03_22 | | | BUS | | |
+____________+_________+____________+____________+ 7 rows in set (0.36 sec)
Надеюсь, все согласятся, что понятнее версия, использующая синтак_ сис SQL92.
Дата добавления: 2015-08-17; просмотров: 101 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Внутренние соединения | | | Соединение трех и более таблиц |