|
Программирование >> Реляционные базы данных
Он относится к именам кинозвезд из фильма Casablanca . Обратите внимание на порядок термов в пункте FROM. Сначала m определяется как произвольный объект класса Movie у<азанием на то, что m входит н степень класса Movies. Затем утверждается, что для каждого значения т. s есть объект класса Star из множества m.stars кинозвезд данного фильма т, т.е в двух вложенных циклах рассматриваются все такие пары (гп, s), в которых m - фтшьм, as - кинозвезда, Ифяюшая в данном фильме. Вычисление этого запроса может быть представлено следующим образом: FOR each m in Movies DO FOR each s in m.stars DO if m.title = Casablanca THEN add s.name to the output bag Пункт WHERE ограничивает сферу поиска теми парами, в которых m совпадает с объектом Movie, имеющим название Casablanca. Пункт SELECT порождает мультимножество (в данном случае оно будет множеством) 1кех атрибутов имен объектов кинозвезд S н парах (т. s), удовлетворяющих пункту WHERE. Эти имена являются именами кинозвезд из множества stars, где обозначает объект Casablanca. О 8.2.5 Устранение дубликатов Технически запрос, аналогичный запросу из примера 8.5, порождает в качестве ответа мультимножество, а не множество, т.е., в OQL, как и в SQL, дубликаты по умолчанию не устраняются из ответа на запрос, если это не оговорено специально. Как и в SQL, их можно устраншъ с помощью ключевых слов DISTINCT и SELECT. Пример 8.6. Допустим, нужно 8ы>1снить имена кинозвезд, нфающих в филь-.мах стул1и< Disney, о .чюжно сделать с помошью следующего запроса, устраняя дубликаты имен тогда, когда одна кинозвезда появляется во многих фильмах. SELECT DISTINCT s.name FROM Movies m. m.stars s WHERE m ownedBy .name = Disney Стратегия этого запроса аналогична стратегии запроса из примера 8.5. Здесь тоже рассматриваются пары кинозвезда - фильм в двух вложенных циклах. Но теперь условие для пары (т, s) заключается в том, что Disney -это имя студии, объектом которой в классе Studio является m.ownedBy. □ 8.2.6 Сложные входные выражения Выражения в пункте SELECT необязательно простые переменные. В них могут входить другие выражения, построенные конструкторами типов. Например, можно применить конструктор Struct к нескольким выражениям и получить запрос типа select-from-where, порождающий множество или мультимножество структур. Пример 8.7. Предположим, нужно найти .множество пар кинозвезд, проживающих по олнсму адресу. Это .можно сделать с помощью следующего запроса: SELECT DISTINCT Slruct(star1: si. star2: s2) FROM Stars si. Stars s2 WHERE s1.addr=s2.addr AND sLname < s2.name Р.1сс.матрив:1ются пары кинозвезд si и s2. Пункт WHERE проверяет, имеют ли они ОД1И1 iiapec. предшествует ли имя первой кииозвсзды имени второй в алфавитном порядке, поэтому непоз.\гожно получить пару, куда одно имя в.ходит дважды, иди две пары, в которые одни и те же кинозвезды входят в разном порядке. Для каждой пары, прошедшей проверку, порождается структьра записи. Тип этой структуры - запись с полями star1 и star2. Ттюм каячдого поля является Star, ток как jro тип переме1П1ых e1 и s2, обеспечивающих значения Д15ух полей. Формально типом этой структуры является Struct N {starl; Slar, star2. Star) для некоторого икгенп А. Тип результата запроса - множество таки\ струетлр типа А, т.е. Set<Struct N {starl: Star. star2: Star}> Тип результата данного запроса - пример типа, которьн1 может появиться в программах OQL. ью он не будет типом атрибута или связи в описании ODL. О Оказывается, результат примера 8.7 можно получить, не определяя явно тип структуры, а перечислив компоненты и имена полей после клю iccoro СиЮва SELECT. Тогда первая строка запроса из примера 8.7 будет выглядеть следующим образом: SELECT starl: si, star2: s2 8.2-7 Подзапросы Выражения типа select-from-where можно использовать везде, где прчменяются множества. В частности, подзапросы допускается размещать в пункте FROM, где множество, являющееся областью переменной, можно построить с помощью выражения типа select-from-where. Аналогичное средство - применение выражения, определяющего таблицу вместо имени таблицы,- входит в предполагаемый стандарт .SQL3 и доступно в некоторых ком.мерческих системах. Пример 8.8. Сформулируем заново запрос из примера 8.6 о кинозвездах фильмов студии Disney. Множесгво фильмов этой стуяин можно по.пучить по запросу: SELECT m FROM Movies m WHERE m.ownedBy.name = Disney Далее этот запрос используется в качестве подзапроса для определения множества, по которому может пробегать переменная d, обозначающая фильмы студии Disney: SELECT DISTINCT s name FROM (SELECT m FROM Movies m WHERE m ownedBy.name = Disney ) d. d.stars s Это выражение запроса HaiiTH кинозвезд, снявши.\ся в фильмах стдии Dsney не короче запроса из примера 8.6, но оно иллюсгрирует новую форму построений запросов в OQL. В этом запросе пункт FROM содержит два вложенных цикла. В первом из них пepeeннaя d пробегает гтожсство фильмов студш! Disney, являющееся результатом подзапроса из пункта FROM. Во втором цикле, пложенном е первый, переменная s пробегает мно)кество кинозвезд, играющих в фильме d. Заметим, что npii этом пункт WHERE не нужен. О 8.2.8 Упорядочение результата в oql результатом выражения гипа select-from-where является мультимножество или множество (если применяется DISTINCT). Вывод можно сделать стеком и при этом задать определенный порядок его элементов, применяя пункт ORDER BY в конце выражения select-front-wliere. ORDER BY в OQL анало ичен такому же пункту в SQl. За ключевыми словами ORDER BY следует список выражений. Первое из них оценивается для каждого объекта из результата запроса, и объекты упорядочиваются по этому значению. Соединения, если они существуют, прерываются значением второго выражения, затем третьего и т.д. Пример. 8.9. Найдем множество фильмов студии Disney и представим результат в виде списка фильмов, упорядоченных по их продолжительности. Фильмы одинаковой про.толжитедьности будем упорядочивать по алфавиту. SELECT m FROM Movies m WHERE m.ownedBy.name = Disne/ ORDER BY m.lerigtti, m.title Периые три строки этого запроса идентичны подзапросу из примера 8.8. Четвертая строка означает, что объекты т, порождаемые запросом seleci-from-where, должны быть упорядочены по значению m.lengm (т.е. по продолжительности фильма), а при одинаковой продолжительности по значению m.title (т.е. по названию фильма). Та-кш образом, значением, порождаемым этим запросом, является список объектов класса Movie. По умолчанию этот порядок восходящий, ио восходящий или нисходящий порядок можно задать явно, указав ключевое слово ASC или DESC соответственно в коиие пункта ORDER BY. как и в SQL. □ 8.2.9 Упражнения к разделу 8.2 Упрожнение 8.2.1. Используя схему ODL упражнения 8.1.1 и рис. 8.2, запишите следующие запросы OQL. *а) Найдите номера моделей всех продуктов, являющихся ПК с ценой менее 2000 дол. Ь) Найдите номера моделей всех ПК с объемом RAM ие менее 32 Мбайт. *! с) Найдите производителей, выпускающих по крайней мере две моаели лазерных принтеров. d) Найдите множество таких пар (г, Л), чтобы ПК или ПК-блокнот имели г Мбайт RAM и h Гбайт на жестком диске. e) Создайте список номеров моделей ПК (объектов, а не номеров моделей), упорядоченных по возрастанию скорости процессора. !0 Создайте список номеров моделей ПК-блокнотов, имеющих не менее 16 Мбайт RA.M. упорядоченных по убыванию размера экрана. ! Упрожнение 8.2.2. Повторите каждую часть упражнения 8.2.1, применяя в каждом запросе по крайней мере один подзапрос. Упражнение 8.2.3. Используя схему ODL упражнения 8.1.2 и рис. 8.3. запишите следующие запросы OQL: a) Найдите имена классов кораблей, имеющих не менее девяти орудий. b) Найдите корабли (объекты, а не имена кораблей), имеюшие не менее девяти орудий. c) Найдите имена кораблей водоизмещением менее 30 тыс. тонн. Результат представьте в виде списка, упорядоченного по самому раннему году спуска на воду, а при совпадении годов - по названиям в соответствии с алфавитом. d) Найдите пары объектов, являющихся кораблями- близнецами (т.е. кораблями одного класса). Прн этом нужны сами объекты, а не имена кораблей.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |