С.Д. Кузнецов - Основы баз данных (1121716), страница 73
Текст из файла (страница 73)
3 с 333е2.с2 3ЛЗЬЬ 3ЛЗЬЬ 3БЬЬ ГБЬЬ 330ЬЬ ГБЬЬ 330ЬЬ 330ЬЬ 3БЬЬ 3БЬЬ 3БЬЬ ИБЬЬ 3БЬЬ 3БЬЬ 3Л3 Ь 330ЬЬ ИЬЬЬ 3БЬЬ 3ЛЗЬЬ 3ЛЗЬЬ 3БЬЬ 3БЬЬ ЬБЬЬ 347 330ЬЬ 5 3БЬЬ ГБЬЬ 3ЛЗЬЬ 3БЬ %3ЬЬ 3ПЬЬ 3ЛЗЬЬ 3ЛЛ Ь Основы баа данных Курс Примеры запросов с использованием соединенных таблиц Мы приведем всего пару примеров, чтобы проиллюстрировать формулировки запросов, в разделе РВОМ которых используются ссылки на соединенные таблицы, т. е. выражения соединений. Пример 15.17. Для каждого отдела найти его номер, имя руководителя, число служащих, минимальный, максимальный и средний размеры зарплаты служащих (еще одна формулировка запроса из примера 15.4). ЯЕЬЕСТ РЕРТ.РЕРТ МО, ЕМР1.ЕМР МАМЕ, СОРИТ("), М1М(ЕМР2.ЕМР ЯА) ), МАХ(ЕМР2.ЕМР ЯАЬ), АЧС(ЕМР2.ЕМР ЯА() РВОМ (РЕРТ МАТРВАЬ 1ИМЕВ 001М ЕМР АЯ ЕМР2) 1ИМЕВ .101И ЕМР АЯ ЕМР1 ОИ РЕРТ.РЕРТ МИС = ЕМР).ЕМР МО БВОРР ВУ РЕРТ.РЕРТ ИО, ЕМР1.ЕМР МАМЕ; Пример 15.18.
Найти номера служащих и имена их начальников от- делов для служащих, размер зарплаты которых больше 30000 руб. ЯЕЬЕСТ ЕМР1.ЕМР МО, ЕМР2.ЕМР МАМЕ РВОМ (ЕМР АЯ ЕМР1 МАТОВАЬ 1ИМЕВ 001М РЕРТ) 1МИЕВ 001М ЕМР АЯ ЕМР2 ОМ РЕРТ.РЕРТ ММС = ЕМР2.ЕМР ИО ХНЕВЕ ЕМР1.ЕМР ЯАЬ > 30000.00; Можно обойтись вообще без раздела хнЕВЕ, если пожертвовать «естественностью» первого соединения (пример 15 17а): ЯЕЬЕСТ ЕМР1.ЕМР МО, ЕМР2.ЕМР ИАМЕ РВОМ (ЕМР АЯ ЕМР1 1ММЕВ 001М РЕРТ ОМ ЕМР1.0ЕРТ МО = РЕРТ.РЕРТ ИО АМР ЕМР1.ЕМР ЯАЬ > 30000.00) 1ММЕВ 001М ЕМР АЯ ЕМР2 ОМ РЕРТ.ММО = ЕМР2.ЕМР МОу Возможности соединенных таблиц открывают широкий простор для воображения, но не будем увлекаться и ограничимся приведенными простыми примерами. Лекция ) 5 Группировка н словил разделе НАЧ(НП, порождаемые и соединенные таблицы Порождаемые таблицы с горизонтальной связью (1аееха1 бек1та6 са)э1а) Во всех вариантах построения запросов, обсуждавшихся ранее в этой и предыдущей лекциях, оставалась действующей общая семантика выполнения запроса: на первом шаге вычисляется расширенное декартово произведение таблиц, специфицированных в списке раздела ееом.
Это остается верным и для случаев порождаемых и соединенных таблиц — вычисление выражения запросов или выражения соединений соответственно производится как подшаг вычисления раздела рюм. Однако в Я~( имеется один специальный случай спецификации ссылки на таблицу (хаЫе хе(ехепое), который, вообще говоря, изменяет семантику раздела рвом.
В этом подразделе мы кратко рассмотрим этот специальный случай. Как показывают синтаксические правила, приведенные в лекции 13, один из возможных способов спецификации ссылки на таблицу состоит в следующем: Ха)э1е хе1ехепсе ::= ЬАТЕЕ!гБ (сргеху ехрхеяя(оп) [ [ АБ ] соххе1ас(оп пап1е [ ( с1ех(згес1 оо1пдет 11я ) ] Таблица, ссылка на которую специфицируется таким образом, называется порождаемой таблицей с горизонтальной связью' (1ахеха1 с]ех1чес] ха)з1е; для краткости будем называть такие таблицы (зз-таблицами). Отличие (.()-таблицы от обычной порождаемой таблицы состоит в том, что в выражении запросов [.()-таблицы разрешается использовать ссылки на столбцы таблиц, специфицированных ранее в разделе реом (т. е. таких таблиц„ссылки на которые содержатся в списке раздела реом слева от ссылки на данную [.()-таблицу)."* Покажем на примере, каким образом наличие в списке раздела реон ссылки на (.0-таблицу меняет семантику этого раздела.
' Конечно, предхвгеемый русский ьвриент термина !агата! слишком громоздок. По всей видимости, если этот механизм войдет в практику пользователей 5О), нужно будет использовать качестве термине что-то вроде ламеральаай иараэсдаенай мабаацы. Не здесь для нас главным является не предложение хорошей новой терминологии, е обеспечение понимания материала. " тем самым, ссылка нв ЕР-табдицу не может быть первой в списке раздела ЕКОМ. Кстати, мо1кет возникнуть естественный вопрос: почему резрешекпся ссылки только нв таблицы, находящиеся в списке раздела гкон только слева 1.Р-таблицы? Стандарт отвечает не этот вопрос весьма просто и бесхитростно. Если разрешить использоветь ссылки, находящиеся и слева, и справа от спецификации ссылки не ЕР-твблицу, то это может привести к зацикливанию при выполнении раздела гиен. Поэтому нужно было выбирать одно из нвправлений, и было выбрано непрявленне слева направо.
349 Основы баз данных Курс Предположим, что раздел РВОМ имеет вНД РВОМ т1, ТЯ, причем таблица т2 является ) О-таблицей. Обозначим соответствуюгцее выражение запросов через О2. Тогда таблица т, являющаяся результатом раздела РВОМ, будет вычисляться следующим образом, Последовательно, строка за строкой просматривается таблица т1. Пусть в1 является очередной строкой т1. Тогда в О2 все ссылки на столбцы вида т1. с3с, где сй — имя некоторого столбца т1, заменяются значением в1. сА, и вычисляется полученное таким образом выражение запросов.
Обозначим результирующую таблицу этого выражения через ТЯ,н Обозначим через Т1 хи таблицу, являющуюся результатом расширенного декартова произвеления в1 СВОЯЯ айти т2,н Таблица Т получается путем объединения с сохранением лубликатов таблиц т12хн полученных для всех строк в1 таблицы т1.
Видимо, наиболее важным (хотя и не елинственным) частным случаем применения ПЭ-таблицы является тот случай, когда в результате выполнения разлела РВОМ формируется соединение таблиц. многие из формулировок запросов, приволившихся в этой лекции в качестве примеров, можно переформулировать с использованием данного механизма. Привелем лишь олин простой пример. Пример 15.19. Найти номера служащих, не являющихся руководителями отделов и получающих заплату, размер которой равен размеру зарплаты какого-либо руководителя отдела (еще олна формулировка запроса из примера 14.10 из лекции ) 4).
ЯЕЬЕСТ ЕМР.ЕМР ИО РВОМ РЕРТ, ЬАТЕРАЬ (ЯЕЬЕСТ ЕМР1 ЯАЬ РВОМ ЕМР ЕМР1 ГНЕВЕ ЕМР1.ЕМР НО = ОЕРТ.ОЕРТ МИО), ЬАТЕВА1 ~ЯЕЬЕСТ ЕМР ИО РВОМ ЕМР ХНЕВЕ ЕМР ЯАЬ = ЕМР1 ЯАЬ АБО ЕМР.ЕМР ИО <> РЕРТ.БЕРТ МИО); Я не могу привести ни одного примера запроса, который было бы невозможно сформулировать без использования порождаемых таблиц с горизонтальной связью.
Возникает впечатление (возможно, ошибочное), что эта конструкция была введена в язык по двум причинам — (а) из соображений общности и (Ь) по причине простоты реализации (в том смысле, что для реализации (.О-таблиц не требуется изобретать какие-то новые технические приемы). ЗЯО Лекция 15 Группировка и условия раздела НАЧ1йп, порождаемые и соединенные таблицы Заключение Думаю, что теперь читатели в состоянии в полной мере оценить мощность, разнообразие и избыточность средств языка З0Е, предназначенных для формулировки запросов на выборку данных.
Конечно, язык БЯ) (по крайней мере, ту часть ЯЯЕ, которая обсуждается в этом курсе) нельзя считать языком программирования, но написание сложных запросов сродни программированию. И нельзя сказать, что Я)1 каким-либо образом дисциплинирует это «программирование». По всей видимости, в общем случае никто не может сказать, какая из формулировок одного и того же запроса является более правильной, это дело вкуса. Зачастую десять студентов, одновременно формулирующих на Я;Н. один и тот же запрос к одной и той же базе данных, выдают десять разных правильных решений. Один человек предпочитает формулировки запросов в классическом стиле, другой использует выражения запросов в разделе гвом, третий пытается сосредоточить все условия выборки в разделе НАЧтнй. Люди с алгебраическими наклонностями предпочитают использовать выражения соединений.
Приходилось встречать и формулировки со сложными вложенными подзапросами в списке выборки раздела 55цдет. Конечно, теоретически компилятор ВЯЕ должен быть в состоянии распознать все эквивалентные формулировки одного и того же запроса и выработать для всех них один и тот же наиболее эффективный план выполнения. Но чем больше разнообразие возможных формулировок, тем сложнее эта задача.
Отсюда практический совет: не злоупотребляйте сложностью формулировки запроса. Полагайтесь на интуицию (и имеющиеся представления об особенностях используемой системы) и формулируйте запрос как можно проще. И еше один практический совет. При формулировке запроса никогда не пользуйтесь имеющимися у вас данными о текущем состоянии базы данных, полагайтесь только на метаданные схемы базы данных. В противном случае вы сможете сформулировать запрос, выдающий в данный момент правильный результат, но этот запрос не будет эквивалентен никакому запросу выдающему правильный ответ при любом состоянии базы данных. 351 Основы баз данных Лекция 16. Язык баз данных 80ь: средства формулировки аналитических и рекурсивных запросов В этой лекции мы завершаем обсуждение средств выборки данных языка 8«2Ь коротким описанием сравнительно недавяо появившихся в языке Я~Ь средств формулировки аналитических п рекурсивных запросов.
Ключевыеслова:аналитические запросы к базе данных, оперативная аналитическая обработка баз данных, оьлг, раздел сесне ву еоьеп, агрегатная функция ОЕОцЕГНО, раздел ОЕОиГ Ву СцВЕ, рекурсивные запросы, обход дерева в ширину, обход дерева в глубину, цикл в ориентированном графе, прямая рекурсия, линейная рекурсия, монотонная прогрессия, взаимная рекурсия, отрицание, начальный источник рекурсии, стратификация, семантика фиксированной точки, рекурсивные запросы с разделом игтн, конструкция еедесн, раздел СХЕСЕЕ, рекурсивное представление.
Введение Две темы, которым посвящается эта лекция, касаются сравнительно новых возможностей оператора Яеьест языка К0Ь, впервые появившихся в стандарте Я2Ь:1999 и открываюших возможность использования языка в приложениях, для которых ранее он не был приспособлен. Речь идет о возможностях аналитических и рекурсивных запросов. Эти темы логически не связаны, их объединяет лишь то, что соответствующие средства очень громоздки и не всегда легко понимаются. В данной краткой лекции мы не стремимся привести полное описание возможностей, специфицированных в стандарте Я.1Ь.
Наша цель состоит лишь в том, чтобы в общих чертах описать подход Я;1Ь в указанных направлениях. В аналитических приложениях обычно требуются не детальные данные, непосредственно хранящиеся в базе данных, а некоторые их обобщения, агрегаты. Например, аналитика интересует не заработная плата конкретного человека в конкретное время, а изменение заработной платы некоторой категории людей в течение определенного промежутка времени. Если пользоваться терминологией Я.1Ь, то типичный запрос к базе данных со стороны аналитического приложения содержит раздел ОЕОПР ву и вызовы агрегатных функций. Хотя в этом курсе мы почти не касаемся вопросов реализации Я.Н -ориентированных СУБД, из общих соображений должно быть понятно, что запросы с разделом опоив вх в общем случае являются «трудными» для СУБД, поскольку для группирования таблицы, вообше говоря, требуется внешняя сортировка.