Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

ANSI_синтаксис соединения

Условия вхождения в диапазон | Mysql> SELECT account_id, product_cd, cust_id, avail_balance _> FROM account | Условия членства | Подзапросы | Оператор not in | Символы маски | Регулярные выражения | Упражнения | Что такое соединение? | Декартово произведение |


Читайте также:
  1. А) определение группы соединения обмоток;
  2. Бор и его соединения. Нахождение в породах, в вулканических и поствулканических процессах. Источники бора в осадочных породах.
  3. В основе процесов получения уретановых эластомеров лежит реакция поликонденсации диизоцианатов с соединениями, имеющими по крайней мере две гидроксильные группы.
  4. Внешние соединения
  5. Внутренние соединения
  6. Геохимия As. Гидротермальный процесс и соединения As.

 

Нотация, используемая в данной книге для соединения таблиц, была введена в версии 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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Внутренние соединения| Соединение трех и более таблиц

mybiblioteka.su - 2015-2024 год. (0.008 сек.)