Скачиваний:
60
Добавлен:
01.04.2014
Размер:
627.71 Кб
Скачать

8.3.10. Получить номера для всех деталей, поставляемых более чем одним поставщиком

SELECT SP.P#

FROM SP

GROUP BY SP.P#

HAVING COUNT ( SP.S# ) > 1 ;

Инструкция having для групп — это то же самое, что и инструкция where для строк; другими словами, инструкция having используется для исключения групп точно так же, как инструкция where используется для исключения строк. Выражение в инструк­ции having должно быть однозначным для группы.

8.3.11. Получить имена поставщиков, поставляющих деталь р2

См. аналогичные примеры в главах 6 и 7.

SELECT DISTINCT S.SNAME

FROM S

WHERE S.S# IN

( SELECT SP.S#

FROM SP

WHERE SP.P# = 'Р2' ) ;

Пояснения. В этом примере используется так называемый подзапрос. Проще го­воря, подзапрос — это выражение select-from-where-group by-having, которое вложено в другое такое же выражение. Подзапрос обычно используется для представления множества значений, поиск которых осуществляется с помощью инструкции IN condition (где condition это условие), как проиллюстрировано в примере. Сис­тема вычисляет полностью запрос, вычислив сначала подзапрос (по крайней мере, концептуально). Этот подзапрос возвращает множество номеров поставщиков, по­ставляющих деталь Р2: {Sl, S2, S3, S4}. Таким образом, первоначальное выражение эквивалентно следующему более простому:

SELECT DISTINCT S.SNAME

FROM S

WHERE S.S# IN ( 'S1 'S2', 'S3', 'S4' ) ;

Стоит отметить, что первоначальную задачу— "Получить имена поставщиков, поставляющих деталь Р2" — можно равносильно выразить с помощью операции со­единения, например, так:

SELECT DISTINCT S.SNAME

FROM S, SP

WHERE S.S# = SP.S#

AND SP.P# = 'Р2' ;

8.3.12. Получить имена поставщиков, поставляющих по крайней мере одну красную деталь

См. аналогичные примеры в главах 6 и 7.

SELECT DISTINCT S.SNAME FROM S

WHERE S.S# IN

( SELECT SP.S#

FROM SP

WHERE SP.P# = IN

( SELECT P.P#

FROM P

WHERE P.COLOR=’RED’;

Подзапросы могут иметь произвольную глубину вложения.

Упражнение. Приведите эквивалентную формулировку этого запроса с использова­нием операции соединения.

8.3.13. Получить номера поставщиков, статус которых меньше текущего максимального статуса в таблице s

SELECT S.S#

FROM S

WHERE S.STATUS <

( SELECT MAX ( S.STATUS )

FROM S ) ;

В этом примере используются две отдельные явные переменные области значений, обозначенные одним и тем же символом "S" и изменяющиеся на таблице S.

8.3.14. Получить имена поставщиков, поставляющих деталь р2

Такой же пример, как 8.3.11.

SELECT DISTINCT S.SNAME

FROM S

WHERE EXISTS

( SELECT *

FROM SP

WHERE SP.S# = S.S#

AND SP.P# = 'Р2' ) ;

Пояснения. Выражение SQL "exists (select. . .from. ..)" будет истинным тогда и только тогда, когда результат вычисления выражения "select. . .from. .." будет непустым. Другими словами, в SQL функция EXISTS соответствует квантору су­ществования реляционного исчисления (более подробно это обсуждается в после­дующих главах книги).

Соседние файлы в папке Дейтл Введ в БД