С.Д. Кузнецов - Основы баз данных (1121716), страница 75
Текст из файла (страница 75)
16.2. Результат запроса с разделом ОВООР Ву еоььОР к таблице с неопределенными значениями столбцов группировки 359 Очевидно, что, просматривая строки таблицы, показанной на рис. 16.2, невозможно установить, в какой из первых трех строк неопределенное значение столбцов Рерт мО и емр ВРАте означает то, что эта строка является сводной для всего предприятия, а не то, что она является сводной для всех служащих с неизвестными номером отдела и годом рождения или просто для всех служащих с неизвестным номером отдела.
Аналогичным образом невозможно понять, какая строка в следующей далее паре строк является сводной для всех служащих отдела номер 1, а не для всех служащих отдела номер 1 с неизвестным годом рождения. Для того чтобы всегда можно было разобраться в результатах запросов, включающих раздел ОВООР ВУ ВОььОР, в язык Я~Ь была введена специальная агрегатная функция СВООР1ИС. Эта функция применяется к столбцу, входящему в список столбцов раздела ОЕОРР ВУ ЕОЬЬОР, и принимает целое значение ! в тех строках результирующей таблицы„в которых соответствующий столбец имеет значение гд!ьь по той причине, что стро* Мы опять искусственным образом упорядочили результат запроса дяя удобства пояснений.
Основы баэ данных Курс ка является сводной для более обобщенной группы. В противном случае функция СВООР НС принимает значение О, Уточним формулировку запроса из примера 16.! (пример 16. 1а): БЕ1 ЕС. ЗЕРТ НО, ЕМР ВОАТЕ, МАХ ~ЕМР БАЬ) АБ МАХ БАЬ, СВОЛРТНС (БЕРТ МО~ йБ СОМ, СКОСРТНС (КМР ВЗА Е~ АБ СЕВ РКСМ ЕМР СВОЛР ВУ КОЬЬЛР ~ЗЕРТ НО, ЕМР ВЭАТЕ~~, Результируюпгая таблица для этого запроса будет иметь следукяций вид; МАХ БАЬ СЕВ ОКР МО ЕМР ВОАТЕ 22000.00 19000.00 14000.00 НОЬЬ 1'ЛЛ 1 19000.00 ЖЛ1 20000.00 МЛ Ь 22000.00 17000.00 16000.00 1950 19000.00 1960 17000.00 20000.00 1950 1960 18000.00 1950 22000.00 1960 1950 14000.00 Рис.
16.3. Результат запроса с разделом ОВСОВ Ву КОЬЬЛР и вызова- ми агрегатной функции ОВОЛР1МС к таблице с неопределенными значениями столбцов группировки 360 Анализируя значения столбцов СОМ и СЕВ в строках таблицы, показанной на рис. 16.4, можно убедиться, что значение столбца мйх Бйь в первой строке является максимальным значением зарплаты всех служащих предприятия, во второй строке — максимальным значением зарплаты служащих с неизвестными номером отдела и годом рождения, а в третьей строке — максимальным значением зарплаты всех служащих с неизвест- Лекция 16 Средства формулировки аналитических и рекурсивных запросов ным номером отдела.
В следующих трех строках значения столбца мАХ ЯАь являются максимальными значениями зарплаты служащих с неизвестным годом рождения из отделов с номерами 1, 2 и 3 соответственно. Как видно, значения столбцов спм и сеВ являются своего рода индикаторами, указывающими на природу основных значений строки. РаЗДЕЛ СДОПР ВУ СПВД Наконец, заметим, что, в отличие от запросов с традиционной группировкой, результат запроса, содержащего раздел СЛОВЕ Ву ВОЬЬОР, зависит от порядка столбцов в списке группировки. При выполнении запроса происходит движение по этому списку слева направо с повышением уровня детальности результирукнцих данных.
Существует еще одна разновидность запроса с группировкой, основанная на использовании раздела СЕОЦР ВУ СОВЕ. Пусть раздел группировки запроса имеет вид сВООР ВУ СОВЕ (опале„спаае„,.., сп.цле,), где славе, (1 = 1, 2,..., и) — имястолбца таблицы-результата раздела РВОМ запроса. Обозначим через Яек множество (слезе„спатле„..., слагае„). Пусть Я, является произвольным подмножеством Яз, т. е.
Я, представляет собой пустое множество или имеет вид (слете„, слете„,..., спетле„,), где лт~п, и каждое имя столбца спаве1, совпадает с одним и только одним именем столбца из списка столбцов раздела сВООР ву сцве. Очевидно, что у множества Я„е существует 2' подмножеств различных вида Я,. Тогда по определению результат этого запроса совпадает с объединением результатов 2" запросов с теми же разделами ЯЕЬЕСт, РЕОми(чнеВЕ,чтоиузапросасСВООР ВУ СОВЕ,исразделом группировки внда СВООР Ву Я„причем во всех строках результата частичного запроса значением любого столбца сказе; такого, что спало, 6 я, и спаае, ~ я„является мцьь. Запрос с разделом группировки вида СЕООР ВУ Я, ГДЕ Я вЂ” ПУСтое мНОжЕСтВО, траКтуЕтСя как запрос без раздела СЕООР ВУ.
Вот пример запроса, содержащего раздел сеООР ву ОВВЕ. Пример 16.2. Найти максимальный размер зарплаты во всем предприятии, максимальный размер зарплаты в каждом отделе, максимальный размер зарплаты служащих в каждой возрастной категории и максимальный размер зарплаты служащих каждой возрастной категории каждого отдела. ЯЕЬЕСТ РЕРТ НО, ЕМР ВРАТЕ, МАХ (ЕМР ЯАЬ)АЯ МАХ ЯАЬ, СВООР?ИС (ОЕРТ ИО) АЯ СОИ, СВООРТМС (ЕМР ВОАТЕ) АЯ СЕВ РВОМ ЕМР СЛОЙЕР ВУ О()ВЕ (РЕРТ ИО, ЕМР ВОАТЕ); Результирующая таблица для этого запроса будет иметь следующий вид: 361 Основы баз данных Курс СЕВ ЕМР ВВАТЕ ВЕРТ НО 22000.00 нпьь 19000.00 14000.00 $$$ ! $ 20000.00 ИПЕЮ 22000.00 17000.00 16000.00 1950 19000.00 1960 $ $$ $! $ 20000.00 1960 ° !!! $$ $ $ $$ $$ $ 1950 18000.00 22000.00 1960 Рис.
16.4. Результат запроса с разделом ОЕО1Р Ву СОВЕ и вызовами агрегатной функции ОЕОВР1ИО к таблице с неопределенными значениями столбцов группировки Как видно, результат запроса из примера 16.2 совсем немного отличается от результата запроса из примера 16.!а. Добавились две последние строки, показывающие максимальные значения зарплаты всех служащих предприятия, родившихся в 1950-м и 1960-м гг. соответственно.
Наш пример может навести на мысль, что и в обшем случае запросы, содержащие раздел СВОВР ву СВВЕ, не слишком отличаются от запросов с аеопР ву еоеепР, и выполнение этих запросов тоже не слишком различается. Однако это совсем не так. Запрос, содержаший раздел ОЕОВР ВУ Савве, действительно вырождается в объединение результатов 2" запросов с обычным разделом Оеопр ву.
Соответственно, сложность выполнения такого запроса несравненно выше сложности выполнения похожегозапросас ОЕОиР Ву ЕОЕЕВР. В нашем примере все получилось так просто только по той причине, что в запросе имеются всего два столбца группировки. 362 Лекция 1Б Средства формулировки аналитических и рекурсивных запросов Рекурсивные запросы Начнем этот раздел с нескольких определений, касаюшихся понятий, которые связаны с рекурсией.
Эти понятия имеют обший характер, но в приведенных ниже определениях и комментариях к ним (там, где это уместно) подчеркивается контекст ЯЯ1.. Определения, относящиеся к рекурсии Обход дерева в ширину. При этом способе обхода непосредственные потомки обходятся слева направо, до того как производится переход к потомкам следующего уровня родства. Рис. 16.5. Пример дерева При обходе в ширину дерева, показанного на рис. 16.5, узлы будут обходиться в следующем порядке: корень-Потомок1-Потомок2- ПотомокЗ-Г1.1-Г1.2-П1.3-22.1-Г2,З-ГЗ.1-ГЗ.2-ПЗ.З. Обход дерева в глубину.
При этом способе обхода на каждом шаге производится переход к самому левому текущему потомку. При обходе в глубину дерева с рис. 16.5 порядок обхода узлов будет следующим: Корень-По=омок1-П1.1-Г1.2-21.3-Готомок2-П2.1-Г2.2-Г2.3-ПотомокЗ-ПЗ.1-23.2-ПЗ.З. Цикл в ориентированном графе. В теории графов ориентированный граф называется циклическим в том и только в том случае, когда хотя бы один узел графа одновременно является и предком, и потомком (т. е.
для этого узла имеется и выходящая, и входяшая дуги). В Я21:1999 узлами графа рекурсии являются строки, входящие в результат рекурсивного запроса, а дуги соответствуют способам обработки текуших строк, которые ведут к добавлению к результату новых строк.
На рис. 16.6 показан простейший пример ориентированного графа с циклом. ЗБЗ Основы баз данных Курс Рис. 16.6. Пример графа с циклом Прямая рекурсия. По определению, некоторый элемент использует прямую рекурсию в том и только в том случае, когда он обращается сам к себе без посредников. Пример, приведенный на рис.
16.6, демонстрирует (в трафовой форме) прямую рекурсию. На рис. 16.7 показан графовый пример непрямой рекурсии. Рис, 16.7. Графовый пример непрямой рекурсии Линейная рекурсия. При линейно рекурсивном вызове элемент прямо рекурсивно обращается сам к себе не более одного раза. В 8( )(с1999 в определении любой виртуальной таблицы с рекурсией допускается не более одной ссылки на саму себя (в разделе твом и/или в подзапросах). На рис. 16.8 показан графовый пример рекурсии, не являющейся линейной. Монотонность.