|
Программирование >> Реляционные базы данных
6 В Э1Х)М примере мы впервьге столкнулись с существенно разницей между отношениями в реляционной алгебре и о SQL. Все отношении SQL могут иметь дубликаты кортежей, т.е. они являются .мультимножсстпами. а не множествами. Дубликаты могут возникат!, в отношениях SQL разными п>тими. Этот вопрос подробно обсуждается в разделе 5.4. Как и в случая.к с другими вложенными запросами, мы начинаем с обработки внугреннего подзапроса, т.е. со строк (4) - (6). Если Old.title на строке (6) заменен постоянной строкой типа King Kong, легко понять, что запрос касается года или голов, когда был снят фильм с названием King Kong . Данный подзапрос определяет название. Единственная проблема состоит в том, что значение Old.tiae неизвестно. Однако внешний запрос, находящийся на строках (I) -(3), обеспечивает такое значение, что позволяет выполнить внутренний подзапрос на строках (4) - (6) и определить истинность пункта WHERE, распапожеиного иа строках (3) - (6) Условие в строке (3) выполняется, если любой фильм с тем же названием, что и Old.title, снят позже, чем фильм кортежа, являющегося значением переменной кортежа Old. Условие истинно, если год в кортеже Old не является последним годом, когда был снят фильм с тем же названием. Значит, запрос на строках (I) - (3) порождает на один фильм меньше, чем все множество фильмов с одинаковым названием: фильм, снятый дважды, указывается один раз, фильм, снятый трижды, указывается дваады и т.д.* □ При записи коррелирующего запроса важно знать правила определения области действия имен. В o6uieM случае атрибут подзапроса принадлежит одной из переменных кортежа в пункте FROM, если этот атрибут входит в схему отношения для данной переменной. В противном случае рассматривается запрос, в который непосредственно входит данный подзапрос, затем след>юший, окружающий, запрос и т.д. Например, year на строке (4) и title на строке (6) рис. 3.8 указывают на атрибуты переменной кортежа, пробегающей по всем атрибутам экземпляра отношения Movie, введенного иа строке (5), к которому адресован подзапрос, расположенный иа строках (4) - (6). Однако, ставя перед атрибутом переменную кортежа и точку, можно указать, что атрибут принадлежит именно этой переменной. Именно гюэтому вводится псевдоним Old дня отношения Movie внешнего запроса и в строке (б) делается ссылка на Old.title. Если бы два отношения из пунктов FROM в строках (2) и (5) различались, псевдоним не был бы нужен и запрос относился бы непосредственно к атрибутам отношения, указанного в строке (2). 5.3-5 Упражнения к разделу 5.3 Упрожнение 5.3.1. Запишите перечисленные ниже запросы, основанные на схеме БД упражнения 4.1.1: Product(maker, model, type) PC(model speed, ram, lid, cd, price) Laptop(mo<Jel, spaed, ram, hd, screen, price) Printer(model, color, type, price) В каждом ответе нужно использовать по крайней мере один подзапрос и записать каждый запрос в различных формах (т.е. с помощью различных множеств операторов EXISTS, IN, ALL и ANY). *а) Найдите производителей ПК со скоростью не менее 160. Ь) Найдите принтеры, имеющие самую высокую цену. !с) Найдите ПК-блокногы, скорость которых меньше скорости любого ПК. 5.4 Дубликаты Рассматриваемые до сих пор операции объединения. псресече1тя и разности на отноп1ен11ях применялись к кортежам. В этом и в следующем разле.пах рассматриваются onepauiHi, действующие на отношениях в целом. При этом отношения !d) Найдите номер модели продукта (ПК. ПК-блокнота или нринтера) имеющего самую высокую иену. ! е) Найдите производителей самых деимвых цветнььх принтеров. !! П Найдите производителей принтеров с самым быстрым процессором среди всех ПК, имеющих наименыиий объем RAM. Упражнение 5.3.2. Запиищте перечисленные ниже запросы, основанные на схеме БД упражнения 4.1,3: Classes(class, type, country, numGuns, bore, displacement) Ships(name, class, launched) Battles(name, date) Outcomes(ship. battle, result) В каждом ответе нужно использовать по крайней мере один подзапрос и записать каждый запрос в различных формах (т.е. с помощью различных множеств операторов EXISTS, IN. ALL и ANY). a) Найдите страны, корабли которых имеют наибольшее число орудий. *! Ь) Найдите классы кораблей, в которых хотя бы один корабль бьш потоплен в сражении. c) Найдите названия кораблей с орудиями калибра 16 дюйнюв. d) Найдите сражения, в которых участвовали корабли класса Kongo. !! е) Найдите названия кораблей, н.меюших наибольшее число орудий среди всех кораблей такого же водоизмещения. I Упрожнение 5.3.3. Запиште без подзапросов запрос на рис. 5.8. 1 Упрожнение 5.3.4. Рассмотрим выражение реляционной а-нгебры и, (Л, ixa RjX ...м R ), в которо.м /. - список атрибутов, принадлежащих отношению Л. Покажите, что его можно записать в SQL, используя одни подзапросы. Точнее говоря, запишите эквивалентное выражение SQL, в котором пункт FROM содержэт более одной неременной кортежей. I Упражнение 5.3.5. Запишете следующие подзапросы, не применяя операторы пересечения или разности: *а) запрос с пересечением из рис. 5.3; b) запрос с разностью из примера 5.15. И Упражнение 5.3.6. Некоторые операторы SQL ироизводны в том смысле, что нх всегда можно заменить другими операторами. Например, s IN Л можно заменить на i = ANY R. Покажите, что EXISTS и NOT EXISTS произвоаны. объяснив, как :запнсать выражения вида EXISTS R Ш1и NOT EXISTS R, не применяя EXISTS (нигде, кроме выражения, обозначенного R). Подсказка: п пункте SELECT можно использовать константу, хотя это .челается редко. s.4 Дубликаты 221 являются мультимножествами, а не .множествами и один кортеж может входить в отношение многократно. В разделе 5.4.1 показано, как получить результат в виде множества, а в разаеле 5.4.2 рассказывается, как предотвратить удаление дубликатов, 5.4.1 Удаление дубликатов Понятие отношения в SQL отличается от абстрактного понятия отношения, введенного в главе 3. Отношение в форме множества не может содержать более одной копии одного и того же кортежа. При создании нового отношения с помощью запроса SQL система SQL обычно не удаляет дубликаты кортежей и в ответе на запрос один и тот же кортеж может встречаться несколько раз. В разделе 5.2.4 было показано, что одно из многих эквивалентных определений смысла запроса SQL типа select-from-where начинается с декартова произведения отношений, указанных в пункте запроса FROM. Каждый кортеж проверяется на соответствие условию из пункта WHERE, все кортежи, удовлетворяющие данному условию, используются для проекции согласно пункту SELECT. Эта проекция из различных кортежей произведения может порождать один и тот же кортеж, и асе его экземпляры входят в результат. Поскольку в отношениях SQL дубликаты кортежей допустимы, отношения, из которых строится декартово произведение, тоже могут иметь дубликаты и каждая из идентичных копий кортежа спаривается с кортежами из других отношений, что приводит к резкому увеличению числа дубликатов в произведении. Чтобы исключить порождение дубликатов, за ключевым словом SELECT ставится ключевое слово DISTINCT, которое заставляет строить только одну копию любого кортежа. В результате получается свободный от дубликатов ответ на запрос. Пример 5.20. Рассмотрим не содержащий подзапросов запрос на рис. 5.7, В ответе на такой запрос будет несколько вхождений имени продюсера George Lucas. Во избежание таких повторов заменим строку (1) запроса на 1) SELECT DISTINCT name Тогда перед печатанием ответа все дубликаты из него будут устранены. Оказывается, для запроса из рис. 5.5, в котором применяются подзапросы, проблема дубликатов в ответе не возникает. Действительно, подзапрос строки (4) порождает номер сертификата продюсера George Lucas несколько раз. Однако в главном запросе строки (1) каждый кортеж отношения MovieExec рассматривается только один раз. Предполагается, что в этом отношении есть только один кортеж для George Lucas, поэтому только он и удовлетворяет условию пункта WHERE на строке (3). Следовательно, George Lucas войдет в ответ только один раз. □ Последствия устранения дубликатов Теоретически DISTINCT можно ставиТь после каждого слова SELECT. Фактически удаление дубликатов из отношения может дорого обойтись. 8 общем случае отношение должно быть упорядочено так, чтобы идентичные кортежи следовали один за другим. Только при такой группировке кортежей можно определить, следует ли удалять данный кортеж. Время, необходимое для упорядочения отношения и удаления дубликатов, зачастую превышает время выполнения самого запроса. Поэтому, если мы хотим, чтобы запросы выполнялись быстро, к устранению дубликатов следует прибегать выборочно.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |