
- •7.7.6. Определить общее количество поставщиков
- •7.7.7. Определить в поставках максимальное
- •7.7.8. Для каждой поставляемой детали указать номер и общий объем поставки в штуках
- •7.7.9. Указать номера всех типов деталей, поставляемых более чем одним поставщиком
- •7.7.10. Определить имена поставщиков детали с номером т2'
- •7.7.11. Определить имена поставщиков по крайней мере одной красной детали
- •7.7.12. Указать номера поставщиков, статус которых меньше текущего максимального статуса
- •7.7.13. Указать имена поставщиков детали с номером 'р2'
- •7.7.14. Выбрать имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.7.15. Определить имена поставщиков всех типов деталей
- •7.7.16. Определить номера деталей, которые либо весят более 16 фунтов, либо поставляются поставщиком с номером 's2', либо и то, и другое
- •7.8. Резюме
- •8.2. Ограничения типа
- •8.3. Ограничения атрибута
- •8.4. Ограничения переменной-отношения
- •8.5. Ограничения баз данных
- •8.6. "Золотое правило"
- •8.7. Ограничения состояния и ограничения перехода
- •8.8. Ключи
- •3. Пусть r1 и r2 — ссылающаяся и ссылочная переменные-отношения соответственно.
- •8.9. Средства языка sql
- •8.10. Резюме
- •9.1. Введение
- •9.2. Для чего нужны представления
- •9.3. Выборка данных из представлений
- •9.4. Обновление данных в представлениях
- •9.5. Моментальные снимки
- •9.6. Поддержка представлений в языке sql
- •9.7. Резюме
- •Часть III
- •10.1. Введение
- •10.2. Основные определения
- •10.3. Тривиальные и нетривиальные зависимости
- •10.4. Замыкание множества зависимостей
- •10.5. Замыкание множества атрибутов
- •10.6. Неприводимые множества зависимостей
- •10.7. Резюме
- •Глава 1 1
- •I Переменные-отношения в знф I
- •11.2. Декомпозиция без потерь
- •11.3. Первая, вторая и третья нормальные формы
- •11.4. Сохранение зависимостей
- •11.5. Нормальная форма Бойса-Кодда
- •11.6. Замечание по поводу атрибутов, содержащих в качестве значений отношения
- •11.7. Резюме
- •12.1. Введение
- •12.2. Многозначные зависимости и четвертая нормальная форма
- •12.3. Зависимости соединения и пятая нормальная форма
- •Соединение по комбинации атрибутов j#,s#
- •Исходное состояние spj
- •12.4. Общая схема процедуры нормализации
- •12.5. Денормализация
- •12.6. Ортогональное проектирование (небольшое отступление от темы)
- •12.7. Другие нормальные формы
- •12.8. Резюме
- •12.3. Brosda V., Vossen g. Update and Retrieval Through a Universal Schema Interface // acm tods. — December, 1988. — 13, № 4.
- •12.5. Date c.J. Will the Real Fourth Normal Form Please Stand Up? // c. J. Date and Hugh Darwen. Relational Database Writings 1989-1991.— Reading, Mass.: Addison-Wesley, 1992.
- •12.20.Kent w. The Universal Relation Revisited // acm tods. — December, 1983. — 8, № 4.
- •12.22.Maier d., Ullman j.D. Fragments of Relations // Proc. 1983 sigmod Intern. Conf. On Management of Data. — San Jose, Calif. — May, 1983.
- •12.24.Maier d., Ullman j.D. Maximal Objects and the Semantics of Universal Relation Databases // acm tods. — March, 1983. — 8, № 1.
- •Глава 13
- •13.1. Введение
- •13.2. Общий подход
- •Каждыи экземпляр сущности ности «Произведение"
- •13.3. Модель "сущность/связь"
- •13.5. Проектирование базы данных с помощью метода er-моделирования
- •13.6. Краткий анализ er-модели
- •13.7. Резюме
7.7.11. Определить имена поставщиков по крайней мере одной красной детали
SELECT DISTINCT S.SNAME FROM S WHERE S.St IN
( SELECT SP.Si FROM SP WHERE SP.PI = IN ( SELECT P.PI FROM P
WHERE P.COLOR = 'Red' ) ) ; Подзапросы могут иметь произвольную глубину вложения.
Упражнение. Приведите эквивалентную формулировку этого запроса с использованием операции соединения.
7.7.12. Указать номера поставщиков, статус которых меньше текущего максимального статуса
в таблице S
SELECT S.S# FROM S
WHERE S.STATUS <
( SELECT MAX ( S.STATUS ) FROM S ) ;
В этом примере используются две отдельные неявные переменные кортежей, обозначенные одним и тем же именем S и изменяющиеся на таблице S.
7.7.13. Указать имена поставщиков детали с номером 'р2'
Замечание. Этот пример повторяет пример 7.7.10. Ниже приводится другое решение для того, чтобы представить еще одно средство языка SQL.
SELECT DISTINCT S.SNAME FROM S WHERE EXISTS ( SELECT * FROM SP
WHERE SP.S# = S.S# AND SP.P# = 'P2' ) ;
Пояснение. SQL-выражение EXISTS (SELECT ... FROM ...) будет иметь значение истина тогда и только тогда, когда результат вычисления выражения SELECT ... FROM ... будет непустым. Другими словами, в языке SQL функция EXISTS соответствует квантору существования реляционного исчисления [18.6].
Замечание. В этом SQL-примере ссылка на подзапрос представлена как ссылка на относительный подзапрос, поскольку в данном подзапросе содержится ссылка на переменную кортежа, а именно — на неявную переменную кортежа S, которая определена во внешнем запросе. Другим примером относительного подзапроса служит пример 7.7.8.
7.7.14. Выбрать имена поставщиков, которые не поставляют деталь с номером 'р2'
SELECT DISTINCT S.SNAME FROM S
WHERE NOT EXISTS ( SELECT * FROM SP
WHERE SP.SI = S.St AND SP.PI = 'P2' ) j
Этот же запрос можно представить в альтернативной формулировке.
SELECT DISTINCT S.SNAME FROM S
WHERE S.SI NOT IN ( SELECT SP.SI FROM SP
WHERE SP.Pf = 'P2' ) ;
7.7.15. Определить имена поставщиков всех типов деталей
SELECT DISTINCT S.SNAME FROM S
WHERE NOT EXISTS { SELECT * FROM P
WHERE NOT EXISTS
( SELECT *
FROM SP
WHERE SP.SI
AND SP.PI
S.SI
p.Pi ) ) ;
Язык SQL не включает какой-либо непосредственной поддержки универсального квантора FORALL; следовательно, запросы типа "ДЛЯ ВСЕХ" обычно выражаются через отрицание кванторов существования, как в этом примере.
Стоит отметить, что выражения, подобные показанному выше, хотя, на первый взгляд, и выглядят несколько устрашающе, легко составляются пользователями, знакомыми с реляционным исчислением, как отмечается в [7.4]. В альтернативном случае, если подобные примеры все еще кажутся вам слишком сложными, существует несколько "обходных" путей, позволяющих избежать использования негативных кванторов. В нашем случае, например, можно записать запрос следующим образом.
SELECT DISTINCT S.SNAME FROM S
WHERE ( SELECT COUNT ( SP.Pt ) FROM SP
WHERE SP.Si = S.St ) = ( SELECT COUNT ( P.Pt ) FROM P ) ;
(Расшифровка: "Получить имена поставщиков, для которых количество поставляемых деталей равно количеству всех деталей",) Однако обратите внимание на следующие обстоятельства.
Во-первых, в отличие от формулировки с выражением NOT EXISTS, в последней формулировке предполагается, что в отношении SP нет номеров деталей, которые не содержатся в отношении Р. Другими словами, эти две формулировки эквивалентны (а вторая будет верной) только в случае соблюдения определенного ограничения целостности (подробности приводятся в следующей главе).
Во-вторых, метод, примененный во второй формулировке для сравнения двух количеств (подзапросы, расположенные по обе стороны знака равенства), изначально не поддерживался в языке SQL и был добавлен только в стандарте SQL/92. Он все еще не поддерживается во многих продуктах.
В-третьих, на самом деле предпочтительнее было бы сравнивать две таблицы (см. обсуждение реляционных сравнений в главе 6), и тогда запрос записывался бы так.
SELECT DISTINCT S.SNAME FROM S
WHERE ( SELECT SP.Pt ) FROM SP
WHERE SP.St = S.St ) = ( SELECT P.Pt FROM P ) ;
Поскольку язык SQL непосредственно не поддерживает операции сравнения таблиц, необходимо прибегнуть к приему, использующему сравнение кардинальности таблиц (опираясь на практический опыт, мы можем гарантировать, что если кардинальности таблиц равны, то и таблицы одинаковы, по крайней мере в обсуждаемом случае). Дополнительный материал по данной теме приведен в упр. 7.11.