Основными на этом уроке будут следующие темы.
• Основные подходы к связыванию таблиц
• Различные типы связей
• Как и когда следует использовать связывание таблиц
• Ряд практических примеров связывания таблиц
• Последствия неправильного связывания таблиц
• Использование псевдонимов таблиц в запросах
Возможность отбора данных из нескольких таблиц является одной из самых полезных возможностей SQL Без такой возможности теряет смысл сама идея реляционной базы данных. Запросы к одной таблице могут быть весьма информативными, но в реальных базах данных чаще всего бывают нужны данные сразу из нескольких таблиц.
В ходе урока по нормализации вас пытались убедить в том, что база данных должна быть разделена на более мелкие и лучше поддающиеся управлению таблицы. После разделения таблиц на более мелкие у родственных таблиц оказываются общие столбцы -
Вы можете удивиться - зачем нормализовать таблицы, если в конце концов снова приходится объединять их, чтобы извлечь необходимые данные? Ответ прост: извлекать все данные из всех таблиц сразу приходится крайне редко, поэтому лучше объединять в запросе только те несколько таблиц, которые оказываются нужны в каждом конкретном случае. Хотя при этом работа базы данных может несколько замедлиться, это очевидно компенсируется существенным упрощением работы с базой данных и управления ею.
Несмотря на то, что число предлагаемых различными реализациями SQL способов связывания таблиц достаточно велико, мы рассмотрим только самые общие типы связывания, к которым относятся
• связывание по равенству (EQU JOINS):
• естественное связывание (NATURAL JOINS);
• связывание по неравенству (NON-FQUUOINS);
• внешнее связывание (OUTEP JCINS);
• рекурсивное связывание (SELF JOINS).
Как вы уже знаете из предыдущих уроков, ключевые слова SELECT и FROM являются необходимыми элементами оператора
Связывание по равенству используется чаще всего и является, пожалуй, самым полезным типом связывания таблиц. Связывание по равенству называют также внутренним (INNER JOIN). При связывании по равенству таблицы связываются по общему столбцу, который в каждой из таблиц обычно является ключевым.
Синтаксис оператора, задающего связывание по равенству, должен быть следующим.
SELECT таблица1.столбец1, таблица2.столбец2...
FROM таблица1, таблица2 [, таблицаЗ ]
WHER3 таблица1.имя_столбца = таблица2.имя_столбца
[ AND таблица1.имя_столбца
Обратите внимание на отступы в приводимых ниже примерах операторов SQL. При правильном использовании отступов оператор понять легче. Использовать отступы не обязательно, но крайне желательно
Рассмотрим пример.
SELECT EMPLOYF,E_TBL.EMP_ID,
EMPLOYEE_PAY_TBL.DATE_HIRE FROM EMPLOYEEJTBL,
EMPLOYEE_PAY_TBL WHERE EKPLOYEE_TBL.EMP_ID = EMPLOYEE_PAY_TBL . EMP__ ID;
Этот оператор SQL возвращает табельный номер служащего и дату зачисления служащего в штат. Табельный номер извлекается из таблицы EMPLOYEE_TBL (хотя это поле имеется в обеих таблицах, все равно имя одной из таблиц необходимо указать), а дата зачисления в штат берется из таблицы EMPLOYEE__PAY_TBL. Ввиду того, что табельный номер служащего присутствует в обеих таблицах, имена соответствующих двух столбцов таблиц рассматриваются как эквивалентные (что задается используемым в операторе равенством). Тем самым вы говорите серверу базы данных, откуда следует извлекать данные.
В следующем примере данные извлекаются из таблиц EMPLOYEEJTBL и EMPLOYEE_PAY_TBL, поскольку требуемые данные размещаются частично в одной, а частично в другой таблице. Здесь используется связывание по равенству.
SELECT EMPLOYEE_TBL.EMP_ID, EMPLOYEE_TBL.LAST_NAME,
EMPLOYEE_PAY_TBL.POSITION
FROM EMPLOYEEJTBL, EMPLOYEE_PAY_TBL
WHEREEMPLOYEE_TBL.EMP_ID = EMPLOYEE_PAY_TBL.EMP_ID;
EMP_ID LAST_NAM POSITION
311549902 STEPHENS MARKETING
442346889 PLEW TEAM LEADER
213764555 GLASS SALES MANAGER
313782439 GLASS SALESMAN
220984332 WALLACE SHIPPER
443679012 SPURGEON SHIPPER
6 строк выбраны.