Выбрать главу

Шаблон представления дат___Описание___________________

MONTH название месяца

DAY название дня недели

DD номер дня месяца

мм номер месяца года

YY последние две цифры года

YYYY ГОД

MI минута часа ss секунда минуты

1. Предположив, что сегодняшней датой является 1999-12-31, преобразуйте текущую дату в формат December 31 1999.

2. Преобразуйте строку 'DECEMBER 31 1999' в формат DATE.

3. Запишите оператор, возвращающий день недели, на который выпадает новогодний вечер конца 1999 года. Предположите, что дата хранится в виде 31-DEC-99, являясь значением типа DATETIME.

13-й час Объединение таблиц в запросах

До сих пор создаваемые вами запросы извлекали данные из одной таблицы. Из этого урока вы узнаете, как связать таблицы в запросе так, чтобы можно было извлечь данные из нескольких таблиц.

Основными на этом уроке будут следующие темы.

• Основные подходы к связыванию таблиц

• Различные типы связей

• Как и когда следует использовать связывание таблиц

• Ряд практических примеров связывания таблиц

• Последствия неправильного связывания таблиц

• Использование псевдонимов таблиц в запросах

Отбор данных из нескольких таблиц

Возможность отбора данных из нескольких таблиц является одной из самых полезных возможностей SQL Без такой возможности теряет смысл сама идея реляционной базы данных. Запросы к одной таблице могут быть весьма информативными, но в реальных базах данных чаще всего бывают нужны данные сразу из нескольких таблиц.

В ходе урока по нормализации вас пытались убедить в том, что база данных должна быть разделена на более мелкие и лучше поддающиеся управлению таблицы. После разделения таблиц на более мелкие у родственных таблиц оказываются общие столбцы - ключевые поля или просто ключи Такие ключи и используются для связывания родственных таблиц.

Связь объединяет две или несколько таблиц для того, чтобы обеспечить возможность извлечь данные сразу из нескольких таблиц.

Вы можете удивиться - зачем нормализовать таблицы, если в конце концов снова приходится объединять их, чтобы извлечь необходимые данные? Ответ прост: извлекать все данные из всех таблиц сразу приходится крайне редко, поэтому лучше объединять в запросе только те несколько таблиц, которые оказываются нужны в каждом конкретном случае. Хотя при этом работа базы данных может несколько замедлиться, это очевидно компенсируется существенным упрощением работы с базой данных и управления ею.

Типы связывания

Несмотря на то, что число предлагаемых различными реализациями SQL способов связывания таблиц достаточно велико, мы рассмотрим только самые общие типы связывания, к которым относятся

• связывание по равенству (EQU JOINS):

• естественное связывание (NATURAL JOINS);

• связывание по неравенству (NON-FQUUOINS);

• внешнее связывание (OUTEP JCINS);

• рекурсивное связывание (SELF JOINS).

Компоненты условия связывания

Как вы уже знаете из предыдущих уроков, ключевые слова SELECT и FROM являются необходимыми элементами оператора SQL, определяющего запрос. При связывании таблиц необходимым элементом оператора SQL является ключевое слово WHERE. Имена таблиц для связывания указываются в списке ключевого слова FROM. Связь определяется в выражении ключевого слова WHERE В выражении для связывания таблиц можно использовать операции =, <, >, <>, -.-, >-, '=, BETWEEN, LIKE и NOT. Но наиболее часто для связывания используется знак равенства

Связывание по равенству

Связывание по равенству используется чаще всего и является, пожалуй, самым полезным типом связывания таблиц. Связывание по равенству называют также внутренним (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 строк выбраны.

Обратите внимание на то, что в списке оператора SELECT вместе с именами каждого из столбцов указаны имена соответствующих таблиц. Это называется подробным определением столбцов в запросе. Подробные определения требуются только для тех столбцов, которые присутствуют в нескольких из указанных в запросе таблиц. Но в операторе обычно указываются подробные определения для всех столбцов, чтобы не возникало лишних вопросов при отладке или модификации программного кода SQL.

Естественное связывание

Естественное связывание почти эквивалентно связыванию по равенству, но при естественном связывании таблиц повторения эквивалентных столбцов исключаются. Условие связывания оказывается таким же, но столбцы выбираются иначе.

Синтаксис соответствующего оператора следующий.

SELECT таблица1.*, таблица2.имя_столбца

[, таблицаЗ.имя_столбца ]

FROM таблица1, таблица2 [,таблицаЗ ]

WHERE таблица1.имя_столбца = таблица2.имя_столбца

[ AND таблица1.имя_столбца = таблицаЗ.имя~столбца ]

Например,

SELECT EMPLOYEEJTBL.*, EMPLOYEE_PAY_TBL.SALARY FROM EMPLOYEEJTBL,

EMPLOYEE_PAY_TBL WHERE EMPLOYEE_TBL.EMP_ID = EMPLOYEE_PAY_TBL.EMP_ID;

Этот оператор SQL возвращает данные всех столбцов из таблицы EMPLOYEE_TBL и значения SALARY из таблицы EMPLOYEE_PAY_TBL. Столбец EMP_ID имеется в обеих таблицах, но извлекается только из таблицы EMPLOYEE_TBL, поскольку во второй таблице соответствующий столбец содержит точно такую же информацию и поэтому извлекать ее нет смысла.

В следующем примере выбираются все столбцы из таблицы EMPLOYEE_TBL и один столбец из таблицы EMPLOYEE_PAY_TBL. He забывайте о том, что звездочка (*) представляет все столбцы таблицы

SELECT EMPLOYEE_TBL.*, EMPLOYEE_PAY_TBL.POSITION

FROM EMPLOYEEJTBL, EMPLOYEE_PAY_TBL

WHERE EMPLOYEE_TBL.EMP_ID = EMPLOYEE_PAY_TBL.EMP_ID;

EMP_ID LAST_NAM FIRST_NAM ADDRESS CITY ST ZIP PHONE PAGER POSITION