
- •Введение
- •Общая схема банка данных в системе
- •Основные понятия
- •Базы данных
- •Банк данных как система управления основные понятия
- •Банк данных как автоматизированная система
- •Субд с включающим языком
- •Информационные системы
- •Документальные аис основные понятия дескриптор
- •Фактографические аис
- •Основные понятия
- •Основные данные
- •Уровни моделей
- •Классификация моделей
- •Роль подсхемы
- •Этапы проектирования базы данных
- •Архитектура банка данных
- •Последовательность действий при чтении записи
- •Инфологическое проектирование базы данных
- •Модели данных и подъязыки данных
- •Иерархическая модель данных
- •Сетевая модель данных
- •Реляционная модель данных
- •Реляционные базы данных
- •Алгебра отношений
- •Преимущества реляционных бд
- •Отношения
- •Нормализация отношений
- •Функциональная зависимость
- •Полная функциональная зависимость.
- •Проектирование баз данных.
- •Специальные операции над отношениями
- •Операции над отношениями.
- •Централизация и децентрализация процессов обработки данных.
- •Традиционный набор операций
- •Нормализация отношений
- •Исчисление отношений
- •Вторая и третья нормальные формы.
- •26. Язык запросов sql
- •1 Основы sql
- •Многотабличные запросы на чтение (объединения)
- •Сортировка результатов запроса (предложение order by)
- •Объединение результатов нескольких запросов (union)*
- •Запрос на объединение и сортировка *
- •Многотабличные запросы на чтение (объединения)
- •Простое объединение таблиц (объединение по равенству)
- •Запросы с использованием отношения предок/потомок
- •Объединения с условием для отбора строк
- •Несколько связанных столбцов
- •Запросы на чтение к трем и более таблицам
- •Чтение всех столбцов
- •Самообъединения
- •Псевдонимы таблиц
- •Правила выполнения многотабличных запросов
- •Внешнее объединение таблиц *
- •Итоговые запросы на чтение
- •Агрегатные функции
- •Агрегатные функции в списке возвращаемых столбцов
- •Запросы с группировкой (предложение group by)
- •Несколько столбцов группировки
- •Ограничения на запросы с группировкой
- •Вложенные запросы на чтение
- •Внешние ссылки
- •Вложенные запросы и объединения
- •Связанные вложенные запросы
- •Однострочный оператор insert
- •В интерактивном режиме удобно не включать в оператор insert список столбцов, так как это уменьшает длину оператора. В случае программного
- •Многострочный оператор insert
- •Удаление существующих данных
- •Удаление всех строк
- •Оператор delete с вложенным запросом *
- •Обновление существующих данных
Агрегатные функции в списке возвращаемых столбцов
Назначение простого запроса с использованием агрегатной функции можно понять достаточно легко. Однако если в список возвращаемых столбцов входит несколько агрегатных функций или если аргументом агрегатной функции является сложное выражение, понять запрос становится значительно сложнее.
Агрегатные функции и значения NULL
Агрегатные функции sum (), avg (), min (), мах () и count () в качестве аргумента принимают столбец значений и возвращают в качестве результата одно значение. А что происходит, когда в столбце содержится одно или несколько значений null? В стандарте ANSI/ISO сказано, что значения null агрегатными функциями игнорируются.
Следующий запрос показывает, как агрегатная функция count () игнорирует все значения null, содержащиеся в столбце:
В таблице salesreps содержится десять строк, поэтому функция count (*) возвращает число 10. В столбце sales содержится десять значений, причем ни одно из них не равно null, поэтому функция count ( sale s) также возвращает число 10. А вот в столбце quota содержится одно значение null —- для служащего, принятого совсем недавно. Функция count (quota) игнорирует это значение и возвращает число 9. Именно из-за таких расхождений вместо функции count () для подсчета строк почти всегда используется функция count (*). Исключение составляют случаи, когда необходимо не учитывать строки, содержащие значения null в определенном столбце.
Игнорирование значений null не оказывает влияния на результаты, возвращаемые агрегатными функциями min () и мах (). Однако оно может привести к проблемам при использовании функций sum () и avg (), что иллюстрирует следующий запрос:
Можно ожидать, что выражения
SUM(SALES) - SUM (QUOTA) SUM (SALES-QUOTA)
вернут одинаковые результаты, однако пример показывает, что так не происходит. И снова причиной является строка со значением null в столбце quota. Выражение
SUM(SALES)
вычисляет сумму продаж для всех десяти служащих, а выражение
SUM (QUOTA)
вычисляет сумму только девяти значений и не учитывает значение null Следующее выражение вычисляет разницу между ними:
SUM(SALES) – SUM(QUOTA)
В то же время выражение
SUM(SALES-QUOTA)
принимает в качестве аргументов только девять значений, которые не равны null. В строке, где значение планового объема продаж равно null, оператор вычитания возвращает значение null, которое функция sum () игнорирует. Таким образом, из результатов этого выражения исключаются фактические продажи служащего, для которого еще не установлен план, вошедшие в результаты предыдущего выражения.
Какой же ответ является "правильным"? Оба! Первое выражение вычисляет именно то, что и означает, т.е. "сумма по sales минус сумма по QUOTA. И второе выражение также вычисляет именно то, что оно означает, "сумма (sales — quota)". Однако при наличии значений null результаты выражений отличаются.
В стандарте ANSI/ISO определены следующие точные правила обработки значений null в агрегатных функциях:
• если какие-либо из значений, содержащихся в столбце, равны null, то при вычислении результата функций они исключаются;
• если все значения в столбце равны null, то функции sum(), avg min() и мах () возвращают значение null; функция count () возврат ноль;
• если в столбце нет значений (т.е. столбец пустой), то функции sum(), avg (), min () и мах () возвращают значение null; функция count возвращает ноль;
• функция count(*) подсчитывает количество строк и не зависит наличия или отсутствия в столбце значений null; если строк в таблице нет, эта функция возвращает ноль.
УДАЛЕНИЕ ПОВТОРЯЮЩИХСЯ СТРОК (DISTINCT)
Ключевое слово distinct указывается в начале списка возвращаемых столбцов и служит для удаления повторяющихся строк из таблицы результатов запроса. С помощью этого ключевого слова можно также указать, что перед применением агрегатной функции к столбцу из него следует удалить все повторяющиеся значения. Для этого необходимо включить ключевое слово distinct перед аргументом агрегатной функции сразу же после открывающей круглой скобки.
В стандарте SQL1 говорится, что при использовании ключевого слова distinct в агрегатной функции, ее аргументом должно быть простое имя столбца; аргумент не может быть выражением. Стандарт позволяет использовать ключевое слово distinct в агрегатных функциях sum()и avg () и не разрешает использовать его в агрегатных функциях min () и мах (), поскольку в этом нет смысла; тем не менее в ряде реализации SQL подобное все-таки допустимо. Кроме того, стандарт требует применения ключевого слова distinct в функции count (), но в ряде реализации SQL можно использовать функцию count () и без него. В функции count (*) данное ключевое слово применять нельзя, поскольку она вообще не имеет отношения к столбцам, а просто подсчитывает число строк. В стандарте SQL2 упомянутые ограничения сняты и разрешается использовать ключевое слово distinct во всех агрегатных функциях, а также применять выражения в качестве аргументов для всех функций.
Кроме того, ключевое слово distinct в одном запросе можно употреблять только один раз. Если оно применяется вместе с аргументом одной из агрегатных функций, его нельзя использовать ни с одним другим аргументом, Если оно указано перед списком возвращаемых столбцов, его нельзя употреблять ни в одной агрегатной функции. Единственным исключением из этого правила является случай, когда ключевое слово distinct используется внутри вложенного запроса, входящего в запрос, в котором оно уже применяется.