Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции2011.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.86 Mб
Скачать

4. Объединение таблиц

Одна из наиболее важных особенностей запросов SQL — это их способность определять связи между различными таблицами и выводить информацию из них в терминах этих связей, всю внутри одной команды.

Этот вид операции называется — объединением, которое является одним из видов реляционных операций в реляционных базах данных. Главное в реляционном подходе это связи, которые можно создавать между позициями данных в таблицах. Используя объединения, мы непосредственно связываем информацию с любым номером таблицы, и таким образом способны создавать связи между сравнимыми фрагментами данных.

Объединение (JOIN) является одной с сильнейших операций реляционной алгебры, которая используется наиболее часто и является противоположностью другой операции – проецирования (PROJECT). При помощи операции JOIN устанавливаются связи между отношениями.

В разделе FROM оператора SELECT можно использовать соединенные таблицы. Пусть в результате некоторых операций мы получаем таблицы A и B. Такими операциями могут быть, например, оператор SELECT или другая соединенная таблица. Тогда синтаксис соединенной таблицы имеет следующий вид:

Перекрестное соединение ::= Таблица А CROSS JOIN Таблица В

Естественное соединение ::= Таблица А [NATURAL] [Тип соединения] JOIN Таблица В

Соединение посредством предиката ::= Таблица А [Тип соединения] JOIN Таблица В ON Предикат

Соединение посредством имен столбцов ::= Таблица А [Тип соединения] JOIN Таблица В USING (Имя столбца.,..)

Соединение объединения ::= Таблица А UNION JOIN Таблица В

Опишем используемые термины.

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

NATURAL JOIN - Естественное соединение производится по всем столбцам таблиц А и В, имеющим одинаковые имена. В результирующую таблицу одинаковые столбцы вставляются только один раз.

JOIN … ON - Соединение посредством предиката соединяет строки таблиц А и В посредством указанного предиката.

JOIN … USING - Соединение посредством имен столбцов соединяет отношения подобно естественному соединению по тем общим столбцам таблиц А и Б, которые указаны в списке USING.

OUTER - Ключевое слово OUTER (внешний) не является обязательными, оно не используется ни в каких операциях с данными.

INNER - Тип соединения "внутреннее". Внутренний тип соединения используется по умолчанию, когда тип явно не задан. В таблицах А и В соединяются только те строки, для которых найдено совпадение.

LEFT (OUTER) - Тип соединения "левое (внешнее)". Левое соединение таблиц А и В включает в себя все строки из левой таблицы А и те строки из правой таблицы В, для которых обнаружено совпадение. Для строк из таблицы А, для которых не найдено соответствия в таблице В, в столбцы, извлекаемые из таблицы В, заносятся значения NULL.

RIGHT (OUTER) - Тип соединения "правое (внешнее)". Правое соединение таблиц А и В включает в себя все строки из правой таблицы В и те строки из левой таблицы А, для которых обнаружено совпадение. Для строк из таблицы В, для которых не найдено соответствия в таблице А, в столбцы, извлекаемые из таблицы А заносятся значения NULL.

FULL (OUTER) - Тип соединения "полное (внешнее)". Это комбинация левого и правого соединений. В полное соединение включаются все строки из обеих таблиц. Для совпадающих строк поля заполняются реальными значениями, для несовпадающих строк поля заполняются в соответствии с правилами левого и правого соединений.

UNION JOIN - Соединение объединения является обратным по отношению к внутреннему соединению. Оно включает только те строки из таблиц А и В, для которых не найдено совпадений. В них используются значения NULL для столбцов, полученных из другой таблицы. Если взять полное внешнее соединение и удалить из него строки, полученные в результате внутреннего соединения, то получится соединение объединения.

Использование соединенных таблиц часто облегчает восприятие оператора SELECT, особенно, когда используется естественное соединение. Если не использовать соединенные таблицы, то при выборе данных из нескольких таблиц необходимо явно указывать условия соединения в разделе WHERE. Если при этом пользователь указывает сложные критерии отбора строк, то в разделе WHERE смешиваются семантически различные понятия - как условия связи таблиц, так и условия отбора строк.

Формат команды выборки данных с нескольких таблиц имеет вид:

SELECT <имя таблицы.имя столбца>,…,<имя таблицы.имя столбца> FROM <перечень имен таблиц> [WHERE <предикат>].

После слова SELECT через запятую указывают список имен столбцов с указанием префиксов – имен таблиц. Имена самих таблиц перечисляются через запятую после слова FROM. Если таблицы, которые принимают участие в запросе, имеют разные имена столбцов, то префикс – имя таблицы – перед именем столбца можно не указывать. Префикс обычно указывают для удобства чтения команды.

Команда выполняется в следующей последовательности: сначала обрабатывается фраза FROM, при этом выполняется декартовое произведение таблиц, что принимают участие в запросе. В результате образовывается таблица больших размеров с количеством столбцов равных сумме столбцов начальных таблиц, за исключением общих для них столбцов; количество строк равняется произведению количества строк таблиц, которые соединяются. Потом выполняется условие отбора, оглашенное после слова WHERE. Строки, что не отвечают условию отбора, исключаются из рассмотрения – выполняется операция реляционной алгебры – селекция. К строкам, что остались, применяется операция реляционной алгебры – проецирование.

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

Например, для получения декартового произведения таблиц SUPPL и GOOD необходимо выполнить следующую команду: SELECT * FROM SUPPL, GOOD

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

Объединения, которые используют предикаты, основанные на равенстве, называют эквиобъединениями, а точнее – натуральными объединениями (Natural Join).

Следующий пример иллюстрирует выполнение команды натурального объединения.

Выбор данных о фирме-поставщике и наименование товаров, совпадающих с наименованием фирм-поставщиков, выполнится командой:

SELECT SUPPL.S_ID, SUPPL.S_NAME, SUPPL.S_CITY,

SUPPL.S_RATING, SUPPL.S_TEL, GOOD.G_NAME FROM SUPPL, GOOD

WHERE SUPPL.S_NAME=GOOD.G_NAME.

С целью обеспечения целостности ссылок БД при выполнении запроса операция натурального соединения выполняется с указанием равности ключей: первичного для таблицы, которая порождает, и внешнего – для порожденной таблицы.

Следующий пример иллюстрирует результат натурального соединения двух таблиц SUPPL и ORDERS. Необходимо выбрать всех поставщиков и заказы, где они фигурируют:

SELECT * FROM SUPPL, ORDERS WHERE SUPPL.S_ID=ORDERS.S_ID.

Следующий пример показывает объединение более чем две таблицы для вывода данных о всех поставщиках, которым заказан товар «апельсин»:

SELECT SUPPL.S_ID, SUPPL.S_NAME, ORDERS.S_ID, GOOD.G_ID, GOOD.G_NAME

FROM SUPPL, ORDERS, GOOD WHERE SUPPL.S_ID=ORDERS.S_ID AND

ORDERS.G_ID=GOOD.G_ID AND G_NAME=`апельсин`.