|
Программирование >> Руководство по sql
Совместное использование этих функций может быть полезно при подсчете нулевых значений в заданных столбцах. Агрегирующие функции и типы данных. Функции SUM и AVG можно применять только к числовым столбцам. Функции MIN, МАХ, COUNT и COUNT(*) работают со всеми типами данных. Например, функцию MIN можно использовать для поиска наименьшего значения (в символьном столбце - самого первого значения в алфавитном порядке): SQL: select min(au lname) from authors Результат: Bennet Конечно, суммировать или находить среднее значение по столбцу с фамилиями авторов абсолютно бессмысленно. DISTINCT и агрегирующие функции. С функциями SUM, AVG, COUNT, MIN и MAX можно использовать ключевое слово DISTINCT (оно помешается перед аргументом). Как уже отмечалось раньше, DISTINCT не влияет на результаты выполнения функций МАХ и MIN. При использовании ключевого слова DISTINCT при вычислении суммы, среднего значения или общего количества значений не учитываются повторяющиеся строки. Ниже приведен соответствующий пример: SQL: select count(price) from titles Результат: SQL: select count(distinct price) from titles Результат: Tl В первом запросе находится количество ненулевых значений цены в таблице titles. Во втором подсчитывается количество различных ненулевых значений цены. При сравнении полученных результатов видно, что пять книг имеют одинаковую стоимость. В некоторых системах при использовании ключевого слова DISTINCT аргумент не может быть арифметическим выражением, а должен являться исключительно именем столбца. Другие системы более демократичны. Соответствующую информацию всегда можно найти в руководстве по конкретной системе. Также вы можете просто проверить, работают ли в вашей системе следующие запросы: SQL: select count(price * 2) from titles Результат: SQL (вариант): select count (distinct price * 2) from titles Результат: 11 В первом запросе удваиваются все цены и подсчитывается их общая сумма. Во втором выполняется та же операция, но учитываются только неповторяющиеся значения. Если ваща система не позволяет использовать выражение вместе с ключевым словом DISTINCT, то при выполнении второго запроса вы получите сообщение об ощибке. DISTINCT также не применяется вместе с функцией COUNT(*), потому что она всегда возвращает единственную строку. В этом случае использование DISTINCT абсолютно бессмысленно. Как правило, ключевое слово DISTINCT в списке выбора можно использовать только один раз. При отсутствии афегирующих функций DISTINCT применяется ко всему списку выбора, а не к отдельным столбцам. Однако это офаничение может привести к возникновению некоторых проблем при использовании афегирующих функций. Для примера рассмофим результат выполнения двух операций. При подсчете суммы и количества значений в столбце price получаются следующие результаты: SQL: select count(price), sum(price) from titles Результат: 16 236.26 Таким образом, средняя цена одной книги составляет $236.26 делить на 16. При использовании ключевого слова DISTINCT с одним из столбцов результат, скорее всего, будет менее полезен: SQL: select count(price), sum(distinct price) from titles Результат: 16 161.35 Различие результатов связано с существованием в столбце одинаковых значений цены, которые не учитываются при подсчете суммы. Тем не менее общее количество значений осталось неизменным. Поэтому на основе этих данных уже нельзя правильно вычислить среднюю стоимость книги. Точно так же неправильная средняя стоимость будет получена и при использовании ключевого слова DISTINCT в функции COUNT. SQL: select count(distinct price), sum(price) from titles Результат: ~~Tl mTil Очевидно, что в этом случае нужно либо вообще не использовать ключевое слово DISTINCT, либо использовать его в обеих функциях. Поэтому стандарт SQL-92 поддерживает многократное использование ключевого слова DISTINCT в агрегирующих функциях. Ниже приведен соответствующий пример: SQL: select count(distinct price), sum(distinct price) from titles Результат: 11 161.35 Обратите внимание на то, что использование ключевого слова DISTINCT в списке выбора и в агрегирующей функции приводит к разным результатам: SQL: select count(au id) from titleauthors Результат: SQL: select count(distinct au id) from titleauthors Результат: SQL: select distinct count(au id) from titleauthors Результат: С помощью первого запроса находится общее количество идентификационных номеров авторов. С помощью второго подсчитываются только различные номера. Применение ключевого слова DISTINCT ко всему списку выбора дает тот же результат, что и в первом запросе. Это связано с тем, что сначала выполняется функция, которая возвращает в результате одну строку, а затем к этой строке применяется ключевое слово DISTINCT. А так как эта строка единственная, по определению не может существовать никаких повторяющихся значений. Агрегирующие функции и предложение WHERE. Агрегирующие функции можно использовать в списке выбора, как в предыдущих примерах, либо в предложении HAVING оператора SELECT (подробности смотрите в главе 6). Агрегирующие функции нельзя использовать в предложении WHERE. В противном случае вы получите сообщение об ощибке. Однако предложение WHERE
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |