Программирование баз данных MS SQL Server (1084479), страница 23
Текст из файла (страница 23)
Авто)ту довелось Работать с СУБД 5~1. Зетогт муе задолго до того, как появигась возможность испояыовать ключевое слово АЯ, поэтому, к сожалению, он привык обходиться без этого ключевого слова (а кмперь просто иногда не удается вспомнить о там, что нужно обязательно его ввести). Тем не менее читателю наппоятельно рекомендуется учесть пшкую необходимость и исаозьзовтпь зто с виду "лишнее" слово. Дело в том, что, вонефвых, текст запРоса будет вь аакдеть немного шмее понятным Ш во.вню)чых, пРимгнение кгючевого слова АЯ п)тедусмотпфено в стандаРте А)1(51 Автор время от времени будет давать подобные рекомендауии, прежде всего дгя того, чтобы читатель мог сразу освоить правильный способ дм)ствий (как в случае с ключевым словам АЯ).
Но авто также хопггя бы ознакомить читателя с друмсми ваРиантами пРизинения прог)заммных констфукунй, чтобы у него не возникала растфянность п)тм всвг)мче с такими ва(таантами записи опе)гата)гов, котофые выглядят немного иначе. ЗЕЬЕСТ СОНЕТ(*) РВОМ Еар1оуеез ПНЕВЕ Еир1оуее10 = 5 Функция СО()эуг. (Еиркеввз.оп ) *) Функция ССОРИТ (*) предназначена для вычисления количества строк в результатах запроса. Для начала рассмотрим одну из наиболее широко применяемых разновидностей запроса: Основные операторы языка Т-ВЯЕ.
99 Как показано ниже, полученный при этом набор записей немного отличается от того, который был получен при использовании предыдущих запросов. (1 гоч(э) аггессег)) Рассмотрим, в чем состоят эти различия. Прежде всего, как и в случае с использованием всех столбцов, возвращаемых в результате вызова функции, заданное по умолчанию имя столбца не предусмотрено, поэтому если требуется задать имя для столбца, то необходимо ввести псевдоним. Кроме того, следует отметить, что в действительности не получена достаточно значимая информация.
Поэтому вначале выясним, что представляет собой этот набор записей. Он содержит количество строк, соответствующих условию ННЕЕЕ запроса, относящемуся к таблице (таблицам) в конструкции ЕЕОРЕ Запомните формат этого запроса. Он представляет собой основной запрос, который может служить для проверки того, что количество строк, предполагаемых для получения при выборке из таблицы и соответствующих заданным условиям янеке, действительно является таковым.
Ради интереса попытаемся выполнить тот же запрос без конструкции ь)неее: яеьест Сопит(*) ГЕОН Евр1оуеез Если применительно к таблице Ел(р1оуеез читатель не выполнял какие-либо операции удаления или вставки, то должен быть получен набор записей, который выглядит примерно таким образом: (1 гон(з) аггескес)) Что означает это число? Оно представляет собой общее количество строк в таблице Етр1оуеез. Данный запрос также относится к запросам такого типа, которые следует запомнить, поскольку они потребуются в дальнейшем.
Итак, тема настоящего раздела оказалась довольно обширной! В данном разделе, посвященном описанию функции СОО)ЧТ, уже были показаны два способа использования СОСЕТ. Что касается вызова функции СОСЕТ с параметром *, то эта тема уже описана. Теперь рассмотрим, как эта функция применяется с выражением (обычно с именем столбца). Вначале попытаемся применить уже известный нам способ вызова на выполнение функции СООМТ, но по отношению к другой таблице: БЕЬЕСТ СОСЕТ(*) геом сизсотегз Эта таблица немного больше, поэтому данные о количестве строк в ней изменяются в большую сторону: 91 (1 гоч(з) аггессег() 100 Глава 3 А теперь модифицируем этот запрос, чтобы в нем для выборки и подсчета количества строк применялся конкретный столбец; ЗЕЬЕСт СОПНт(рах) гнои с с * Полученные результаты будут немного отличаться от предыдущих: 69 (1 гон(а) абзесгеб) Предостережение.
При выполнении операций агрегирования ипи других операций о множествами НПЬЬ-значения не учитываются. При анализе этих новых результатов непонятно следующее: столбец рах охватывает все строки таблицы, но данные о количестве строк в столбце рах отличаются от количества строк в целом.
Причина этого становится вполне ясной, стоит только изменить свой взгляд на вещи. Дело в том, что не в каждой строке столбца рах значение присутствует как таковое. Иными словами, функция СОПНТ при ее использовании в любой форме, отличной от СОПНт (*), игнорирует )х)1)) 1:значения. Попытаемся проверить, действительно ли причиной расхождения являются )х)1)(.(:значения: зеьест сопят(*) ГНОМ Сцвпоюегв ННЕРЕ Рах 16 НПЫ. Выполнение этого запроса приводит к получению следующего набора записей: 22 (1 гон(в) агбесгес)) Теперь рассчитаем сумму полученных значений: 69 + 22 = 91 В столбце Еах имеются 69 строк, в которых значение поля определено, н 22 строки, в которых значение в поле Еах равно НПЕЕ, что в сумме составляет 91 строку.
В.двйотентМЬНОСГИ".В(()о.':-З)НаЧЕНЬНця ИПГНОрмрбуК(тая:ВО,ВСЕКат)рй'Иру)йщИК ФуНКцкяа;:;КрвхМЕх ",Р(пуго(я);:;;;В 'Зтоцвопрбсовояедует,вниматЕдхб(НО равбсобр(етЬСя'„--поскольку.уязззнный яаайс: можЕУокамть"веа))м® 'ПУщесгееййое'едйяйие'на"пояученнгйерезудьтеты.-В частнбстн;- Мно«НЕ ГЗ)ЛЬЗ()затвяИ йЕЛаГаетснге(йрИЕЬ(ЧХИедЕНИИ СрЕВНИХ ВЕПНЧИН В "СтОЛ6)(ЗК,'СЧИСяОВЫМИ' МайихЫМИ: Г)00;-ЗНаЧЕННя раЕСМатрИВаКГГСя: Ках':раВНЫЕ йухяа;:НОИО((.'сеиаЧЕННя йараВ)(Ь) йупюби(нв:должны: испояльзовзтьс)г(как:тазовысе, ~слесфункция дуд:ип((: другая,: згрегйруб й)щая Функция' применяетов к:стозбцу:р(г:М(9Ц:.=значениям(и;: уй:зтн; зхначенхня=не-,.войдут':в РОСтаВ'ОПЕРХЕЦНОИ"ЕГРЕГИРпОЗа(НИЯ,'-':Еяоюди,;С:ПпОМОЗ(еа',Казрх-;Либэ."МаНИПУПЯДйй::бНН,:йаябУДУ( й()ВОбраэщ(аНЫ2 ВЗйазЕНйй;-'ОтяяИЧПНМЕОт,йаа!:,: В.'Прз(даПЕВВЫЗОЗа)оаюайфуНКпцнн(1йаПрИ.= МЕР; С;НСПОЛ~ЗОтааНИЕМ' фУНКг)ИИ,СОЛЬЕЗСЕ:() ИЯН,''1ЗИШЛ,"'() );;:;Зта',тв(аа,бУДЕт„РаССМатРН1 Еатввя,бсяхзубцсдрО6НО':а Гаева,'Х;";НО О,,НК)йясах РвбстЫ,'аа З)ВЦ;-:ЗиаяхзиняМИ 'ЗСЕГда'-:Сввдуат -помниуь;;разрабатывая' кепд:т-'80(;-ги,просексгируя 6езу-'данны)(.
Основные операторы языка Т-ЗЯ1. 101 Прежде чем закончить описание конструкций функции СООМТ, рассмотрим, как зта функция применяется с конструкцией ОКООР ВУ. Предположим, что программист получил задание определить количество служащих, которые подчинены каждому руководителю. В тех операторах, которые применялись перед этим, подсчитывалось либо общее количество строк в таблице (СООМТ (*) ), либо количество всех строк в таблице, не имеющих Х()) )=значений (СООМТ (Со1омппаме) ). А после введения конструкции ВКООР ВУ те же варианты агрегирования продолжают действовать, как и до сих пор, за исключением того, что происходит возврат данных о количестве, относящихся к каждой группировке, а не ко всей таблице. Именно этот подход можно применить для получения данных о количестве служащих, которые подчинены каждому руководителю: ЯЕЬЕСТ Кероггзто, СОПМТ(*) ГРОМ Евр1оуеез ОКОПР ВХ Кероггзто Обратите внимание на то,что группирование осуществляется только по столбцу керогсзто, а функция сООмт () выполняет роль агрегирующей функции, поэтому включать используемый в ней столбец в конструкцию ОКООР ВУ не требуется.
Керогсзто мзьь 2 5 (3 гоч(з) аггесгео) На основании полученных результатов можно судить о том, что руководитель с идентификатором Мападег1Р, равным 2, имеет в подчинении пять служащих, а руководителю с идентификатором Мападег10, равным 5, подчиняются трое служащих. Кроме гого, можно сделать вывод, что в одной записи Емр1оуеез в поле КероггзТо содержится Х1)) );значение; на этом основании можно сделать вывод, что данный служащий никому не подчиняется (по-видимому, зто — президент компании). Очевидно, следует отметить, что с формальной точки зрения конструкция ОКООР ВУ может использоваться без каких-либо агрегирующих функций, но такой способ ее применения не имеет смысла. Дело в том, что в этом случае СУБД ЯЯ) Яегуег обрабатывает последовательно все строки в целях их группирования, но с точки зрения осуществляемых при этом действий тот же результат может быть получен с применением опции В1ЯТ1МСТ (которая вскоре будет описана), а быстродействие при этом становится намного выше.
Теперь, после описания работы с группами, перейдем к рассмотрению одного из понятий, при освоении которых у большинства программистов возникают сложности. Надеемся, что после чтения следующего раздела у читателя такое впечатление полностью рассеется. 102 Глава 3 Распространение условий на группы с помощью конструкции нйчхно До сих пор все рассматриваемые условия распространялись на конкретные строки. Таким образом, если в каком-то поле строки не содержалось определенное значение или если это значение не находилось в указанных пределах, то вся строка рассматривалась как не соответствующая заданным условиям. Проверка условий такого рода происходит без учета какого-либо группирования строк. Тем не менее иногда возникает необходимость сгруппировать с учетом определенных условий целый ряд строк. Иными словами, требуется ввести в состав определенной группы все относящиеся к ней строки, но применить заданное условие только после полного накопления всех групп.