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

Запросы на основе составных ключей

Таблицы ZAKAZY и TOVARY в учебной базе данных связаны с помощью составных ключей ID_MFR и ID_PRD. Поля ID_MFR и ID_PRD в таблице ZAKAZY составляют вторичный ключ для таблицы TOVARY и связаны с ее полями ID_MFR и ID_PRD соответственно. Чтобы объединить таблицы на основе составных ключей, в условии отбора необходимо задать все пары связанных полей, как показано в нижеприведенном примере.

Создадим запрос, который выводит список всех заказов с указанием их стоимости и наименования товаров.

SELECT ID_ORDER, DESCRIPTION, PRICE

FROM ZAKAZY, TOVARY

WHERE ZAKAZY.ID_MFR = TOVARY.ID_MFR AND

ZAKAZY.ID_PRD = TOVARY.ID_PRD

ID_ORDER

DESCRIPTION

PRICE

112961

Деталь кузова

31 500

112987

Деталь двигателя

3 675

112989

Сопло

4 567

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

Правила выполнения многотабличных запросов на выборку

Написать правильную инструкцию SELECT для простых многотабличных запросов не сложно. Но если многотабличный запрос составлен из многих таблиц с использованием сложных условий отбора, то инструкция многотабличного запроса становится трудной для понимания. Поэтому сначала приведем более точное определение понятия «объединения».

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

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

  1. Сформировать произведение таблиц, перечисленных в предложении FROM.

  2. Если имеется предложение WHERE, применить заданное в нем условие отбора к каждой строке таблицы произведения и оставить в ней те строки, для которых это условие выполняется.

  3. Для каждой из оставшихся строк сформировать строку результирующей таблицы, включающей столбцы, указанные в предложении SELECT.

  4. Если в предложении SELECT указано ключевое слово DISTINCT, то повторяющиеся строки из результирующей таблицы удаляются.

  5. Если в запросе имеется предложение ORDER BY, результирующая таблица сортируется.

4.5.3.Внешнее объединение таблиц

Как уже было описано выше, операция объединения соединяет данные из двух таблиц, формируя пары связанных строк из этих таблиц. При внутреннем объединении все записи, для которых не находится пары в другой таблице, просто игнорируются. Поэтому если строка одной из таблиц не имеет пары, то такое объединение (внутреннее) может привести к неожиданным результатам.

Рассмотрим следующий пример. Вывести список служащих и городов, где они работают:

SELECT FAMILY, NAME, CITY

FROM zakazy.sluzhaschie s, zakazy.offisy o

WHERE o.id_ofc = s.id_ofc

Результат выполнения этого запроса приведен на Рис. 1.1. .

Рис. 1.1. Результат выполнения запроса внутреннего объединения

Из приведенного результата видно, что в результирующую таблицу не вошли записи из таблицы offisy об офисе, расположенном в г. Омск, для которого еще не набраны служащие, и таблицы sluzhaschie об Уткине Денисе, который еще не получил назначение ни в один офис. Таким образом, если в таблицах объединения содержатся несвязанные (непарные) строки, то стандартный SQL приведет к потере информации.

Если мы хотим вывести сведения обо всех офисах, независимо от того, набраны в него служащие или еще нет, то правильный результат можно получить, выполнив запрос, приведенный ниже:

SELECT *

FROM zakazy.offisy o

LEFT JOIN zakazy.sluzhaschie s on o.id_ofc = s.id_ofc

Запрос, приведенный в этом примере, называется внешним (в данном случае левым) объединением таблиц. Результат выполнения запроса показан на Рис. 1.2. .

Как видно из приведенного примера, внешнее объединение может сохранить записи, для которых не находится соответствия в других наборах. При этом недостающие поля запол­няются значениями NULL.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]