Скачиваний:
102
Добавлен:
02.05.2014
Размер:
2.3 Mб
Скачать

7.7.8. Для каждой поставляемой детали указать номер и общий объем поставки в штуках

SELECT SP.Pt, SUM ( SP.QTY ) AS TOTQTY

FROM SP

GROUP BY SP.P# ;

В языке SQL это выражение является аналогом такого выражения реляционной алгебры. SUMMARIZE SP PER SP { Pf } ADD SUM ( QTY ) AS TOTQTY

Оно также является аналогом следующего выражения реляционного исчисления кортежей.

( SPX.Pl, SUM ( SPY WHERE SPY.Pt = SPX.Pi, QTY ) AS TOTQTY )

В частности, стоит отметить, что если в запросе указано предложение GROUP BY, то выражения в предложении SELECT должны быть однозначными для заданной группы. Вот альтернативная, а также более предпочтительная формулировка того же запроса.

SELECT Р.Р#, ( SELECT SUM ( SP.QTY ) FROM SP

WHERE SP.P# = P.Pt ) AS TOTQTY

FROM P ;

Возможность использования вложенных подзапросов для представления скалярных элементов (например, в предложении SELECT, как здесь) была добавлена в стандарт SQL/92 и является важнейшим усовершенствованием по сравнению с первоначальным вариантом языка SQL. В рассматриваемом примере это предоставляет возможность генерировать результат, который включает строки для деталей, не поставляемых со­

всем, а предыдущая формулировка (использующая предложение GROUP BY) этого не позволяла. (Однако значение T0TQTY для таких деталей будет, к сожалению, представ­лено как NULL-значение, а не нуль.)

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

SELECT SP.Pl

FROM SP

GROUP BY SP.Pi

HAVING COUNT ( SP.St ) > 1 ;

Предложение HAVING в отношении групп является тем же, что и предложение WHERE для обычных строк. Другими словами, предложение HAVING используется для исключения групп аналогично тому, как предложение WHERE используется для исключения отдельных строк. Выражение в предложении HAVING должно быть однозначным для заданной группы.

7.7.10. Определить имена поставщиков детали с номером т2'

SELECT DISTINCT S.SNAME FROM S WHERE S.SI IN

( SELECT SP.Si FROM SP

WHERE SP.Pi = 'P2' ) ;

Пояснения. В этом примере в предложении WHERE используется так называемый под­запрос. Проще говоря, подзапрос— это выражение из предложений SELECT-FR0M-WHERE-GROUP BY-HAVING, которое вложено в другое такое же выражение. Подзапрос чаще всего используется для представления множества значений, поиск которых осуществля­ется с помощью предложения IN условие, что и представлено в данном в примере. Сис­тема вычисляет запрос в целом, предварительно вычислив указанный подзапрос (по крайней мере, концептуально). Подзапрос в данном примере возвращает множество но­меров поставщиков детали с номером 'Р2': {SI, S2, S3, S4}. Таким образом, первона­чальное выражение эквивалентно следующему, более простому.

SELECT DISTINCT S.SNAME FROM S

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

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

SELECT DISTINCT S.SNAME FROM S, SP WHERE S.SI = SP.SI AND SP.PI = 'P2' ?

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]