
- •3. Создание индексов и ограничений для базы данных
- •3.1. Индексы в базах данных
- •3.2. Создание и удаление индекса
- •3.3. Типы индексов
- •Индексы в*-дерева
- •Битовые индексы
- •3.4. Обеспечение целостности данных с помощью ограничений
- •Ограничение not null
- •Ограничение unique
- •Ограничение check
- •Разрешение и запрещение существующих ограничений
- •Изменение и удаление существующих ограничений
- •Место определения ограничений
- •3.5. Связи между таблицами
- •Использование ограничений для установления связей между таблицами
- •Многотабличные запросы
- •Внешние соединения
Многотабличные запросы
Используя созданные связи между таблицами, можно соединять содержащуюся в них информацию с помощью многотабличных запросов. Описывая в операторе SELECT связь "главный/подчиненный" с помощью сравнения значений первичного и внешнего ключей, разработчик сообщает СУБД Oracle, как нужно связывать информацию из главной таблицы с информацией из подчиненной таблицы.
Например, список покупок с полными именами продавцов можно получить, использовав следующую команду:
SELECT purchase.product_name,
person.last_name,
person.first_name,
purchase.quantity
FROM purchase, person
WHERE person.person_code = purchase.salesperson
Написание команды, которая комбинирует данные из более чем одной таблицы в единый список, называется созданием соединения (join). Самое важное, что нужно помнить о соединении, заключается в следующем: нужно включать в оператор SELECT предложение WHERE, описывающее, как связаны друг с другом первичный ключ главной таблицы и внешний ключ подчиненной таблицы. Если этого не сделать, Oracle соединит каждую запись главной таблицы с каждой записью подчиненной таблицы, результатом чего может стать очень и очень длинный список.
Чтобы увидеть, к чему приводит создание соединения без предложения WHERE, можно выполнить следующую команду:
SELECT purchase.product_name,
person.last_name,
person.first_name,
purchase.quantity
FROM purchase, person ;
Для пяти записей в таблице PERSON и семи записей в таблице PURCHASE соединение даст 35 строк совершенно бесполезных данных. Результат такого типа, созданный путем выдачи команды соединения без предложения WHERE, называется декартовым произведением.
В одном операторе SELECT можно соединять записи из многих разных таблиц. Для этого достаточно: (а) установить между таблицами логические связи первичного/внешнего ключа, и (б) определить каждую из этих связей в предложении WHERE оператора SELECT.
В качестве примера предположим, что нужно получить список всех покупок с ценами купленных товаров и фамилиями продавцов. Эта информация находится в трех разных таблицах. Код, выполняющий это соединение, выглядит следующим образом:
SELECT purchase.product_name,
product.product_price,
purchase.quantity,
person.last_name
FROM product,
person,
purchase
WHERE product.product_name = purchase.product_name
and
person.person_code = purchase.salesperson
Можно присвоить каждой таблице короткий псевдоним (alias) и использовать его для ссылок на таблицу в пределах команды. Псевдоним таблицы определяется сразу после ее имени в разделе FROM.
Чтобы нажимать еще меньше клавиш, можно опустить имена таблиц для тех столбцов, имена которых уникальны среди таблиц, используемых для выборки. Иными словами, если Oracle может посмотреть на имя столбца и определить, что оно существует только в одной из таблиц, то не нужно указывать, в какой таблице находится этот столбец. Однако не рекомендуется использовать такое упрощение в соединениях по двум причинам: во-первых, оно несколько замедляет обработку (поскольку Oracle должен заглянуть во все таблицы, прежде чем определить, что столбец находится только в одной из них), а во-вторых, затрудняет чтение команды.