Программирование >>  Реляционные базы данных 

1 ... 113 114 115 [ 116 ] 117 118 119 ... 125


8.3 Дополнительные формы выражений OQL

8 этом разделе рассматриваются другие операторы, применяемые лля построения выраженшЧ OQL: логические кванторы ( для всех и сушествует ), операторы агрегации, оператор группирования по... и теоретико-множественные операторы (объединение, пересечение и разность),

83.1 Выражения с кванторами

Можно проверить, удовлетворяют ли заданному условию все члены множества млн по крайней мере один его член. Для проверки, удовлетворяют ли все члены множества ,S условию С(л). где х-переменная, используем выражение OQL

FOR ALL А- IN S : С(х)

Результат выражеиш! имеет значение TRUE, если каждый х удовлетворяет (Дл), и значение FALSE - в противном случае. Выражение

EXISTS .v IN : Д-х )

имеет значение TRUE, если существует по крайней мере один х, удоапетворяющий условию C(.v). и значение FALSE - в противном случае.

Пример ВЛО. Один из способов выражения запроса Найтн кинозвезд, играющих в фильмах киностудии Disney показан на рис. 8.5. Требуется выяснить: снималась ли кинозвезда s в фильмах киностудии Disney. Условие в строке (3) выбирает все кинофильмы т, из набора s.starredln, в которых играла кинозвезда s. Условие в строке (4) выбирает кинофильмы т, созданные на киностудии Disney. При обнаружении хотя бы одного такого фильма выражение EXISTS в строках (3) и (4) примет значение TRUE, в противном случае - FALSE. □

1) SELECT s

2) FROIVI Stars s

3) WHERE EXISTS m IN s.starredln :

4) m.DwnedBy.narne = Disney

Рис. 8.5. Применение подзопросо с квонтором существовоння

Пример 8.11. При.мепнм оператор FOR ALL лля записи запроса о кинозвездах, играющих в фильмах студгт Disney. Такой запрос показан на рис. 8.6. Технически в это множество входят кмитвезды, которые вообще не появляются ни в одном фильме (в соответствии с paccмaтpивaeюi БД). К запросу можно добавить условие, согласно которо.му кинозвезда появляется по крайней мере в одном фильме, но .мы оставляем это из.меиснис п качестве упражнения. □

1) SELECT s

2) FROM Stars s

3) WHERE FOR ALL m IN s.starredln :

4) m.ownedBy.name = Disney

Рис. 8.6. Применениа подзопросо с нвонтором всеобщности

!е) Найаите названии сражений, в которых были потоплены корабли по меньшей мере двух стран.

!! О НаГгаите названия сражений, в которых ни один корабль не был поврежден.



8.3-2 Выражения агрегации

в OQL применяются те же пять операторов агрегаиии. что и в SQL: AVG. COUNT, SUM, MIN и MAX. Ilo в SQL они применяются к выделенному столбцу отношения, а в OQL - к множеству с шенами подходящего типа. COUNT применяется к любому множеству; SUM и AVG - к множеству арифметических типов, а MIN и МАХ -к множествам любого типа, которые можно сравнивать, например К арифметическим значениям строк.

Пример 8.12. Для вычисления средней продолжительности всех фильмов создадим мультимножество длительности всех фильмов. Нам не нужно множество длительности фильмов, так как в нем два фильма одинаковой продолжительности считались бы одним.

AVG(SELECT m.length FROM Movies m)

Здесь используется подзапрос, извлекающий компоненты продолжительности фильмов. Он порождает мультимножество продолжительности фильмов, и применение AVG к этому мультимножеству дает желаемый результат. D

8.3.3 Выражения GROUP BY

В выражение GROUP BY языка OQL входят следующие элементы:

1. Ключевые слова GROUP BY.

2. Список разделенных запятыми атрибутов разбиения, кажаый из которых включает в себя;

(a) имя поля

(b) столбец

(c) выражение Форма оператора GROUP BY:

GROUP BY /,:е /,:е,.....f :e

Оператор GROUP BY следует за запросом типа select-from-where. В выражениях

1. 2.....е

могут использоваться переменные пункта FROM. Чтобы упростить объяснение действия оператора GROUP BY, ограничимся обычным случаем, когда пункт FROM содержит единственную переменную х. Значение х пробегает некоторое множество С. Для каждого члена / множества С, удовлетворяющего условию пункта WHERE, мы оцениваем все выражения, следующие за GROUP BY, приписывая им значения e (#). e%(i), .... e {i). Сей список есть группа, к которой принадлежит значение /.

Реальное значение возвращаемое оператором GROUP BY,-это множество структур. Члены этого множества имеют форму

Struct(/i: v /j : ...../ : v , parfilion : P)

Первые n поле?! обозначают группу, т.е. v v, v - это список значений, полученных прн оценке е, (/), (/), .... е (/) по крайней мере для одного значения i II множестве С. удовлетворяюшего условию пункта WHERE.

Последнее поле имеет специальное имя partition. Его значение /-это значения /. принадлежащие к данной группе. Точнее говоря. Р-это мультимножество, состояшсе из структур вида Struct(x: I). где х - переменная пункта FROM.

Пункт SELECT выражения типа select-rrom-wliere, содержащего оператор GROUP BY, может относиться к полям результата GROUP BY, а именно к/ / ...,/ и partition. С помощью partition можно ссылаться иа поле х, вхопящее в структуры, являющиеся членами мультимножества Р, формирующего значение partition. Значит, ссылаться иа переменную .v. входящую в пункт FROM, можно только внутри оператора агрегаиии, воздействующего на все члены мультимножества Р.



SUM(SELECT p.m-length FROM partition p)

Здесь переменная p пробегает по членам поля partition из структуры, входящей в результат оператора GROUP BY. Каждое значение р - это структура вида Struct(m : о). где о - объект фильма. Следовательно, выражение р.т обозначает объект о, а p.m.length - компонв41т олительности этого объекта класса Movie.

В результате запрос типа select-from порождает мультимножество длительности фильмов в отдельной фупне. Например, если std имеет значение Disney, а уг -значение 1990 , результатом запроса является мультимножество длительности фильмо11, выпушенных студней Disney в 1990 г. Применив к этому мультимножеству оператор SUM. мы получим сумму продолжительности фильмов в данной группе. Значит, одной нз структур результирующего мультимножества может быть

Strucl(sld: Disney . уг :1990. sumLengtti :1234)

eciiii 1234 - правильная общая продолжительность всех фильмов, выпушенных студией Disney в 1990 г. □

Пример 8.13. Построим таблицу обшей продолжительности фильмов для каждой СТ5ДНИ и каждого го*а- При этом в OQL на самом деле строится мульти-кц-юмчестпо структур, каадая из которых состоит из трех компонентов: стуяин, гола и обшей продолжительности фильмов, выпушенных этой студией в данном году. Запрос показан на рнс. S.7.

SELECT std. yr. sumLengtti: SUM(SELECT p.m.lenglir

FROM partition p)

FROM Movies m

GROUP BY std: m.studto. yr: m.year Рис. 8.7. Группироеонив фильмов по аудии и году Bbinywo

Начнем анализ запроса с пункта FROM. Переменная т пробегает по всем объектам класса Movie. Поэтому т здесь играет роль переменной л-, которая применялась ранее при рассмотрении общего случая. В операторе GROUP BY есть два поля - std и уг, соответствующих выражениям m.studio и m.year.

Например, Pretty Woman -это фильм, выпущенный студией Disney в 1990г. Когда т является объектом для этого фильма, значением m.studio яааяется Disney, а значентаем m.year - 1990. В результате множество, созданное оператором GROUP BY, содержит в качестве своего члена структуру

Struct(std: Disney . уг: 1990, partition :

Здесь Р- множество структур, содержащее структуру Struct(m: m), где - объект класса Movie для фильма Pretty Woman . В Р в-ходят также однокомпонентныс спруктуры с и.ченем поля m для каждого другого фильма, выпущенного студией Disney в 1990 г.

Теперь рассмотрим пункт SELECT. Для каждой структуры из множества, являющегося результатом оператора GROUP BY, строится одна структура, входящая в результирующее мультимножество подзапроса. Первым компонентом является std, т.е. имя поля std, а его значение - это значение поля std из структуры, полученной в результате действия оператора GROUP BY. Второй компонент результата имеет имя поля ут и значение, равное компоненту уг из результата действия оператора GROUP BY.

Третьим компонентом каждой структуры вывода является



1 ... 113 114 115 [ 116 ] 117 118 119 ... 125

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика