![]() |
|
Программирование >> Реляционные базы данных
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. Третьим компонентом каждой структуры вывода является
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |