
- •Введение
- •Прочие команды
- •Структура базы данных
- •Ключи, ограничения
- •Индексы
- •Представления
- •Процедуры и функции
- •Триггеры
- •Пользователи и сессии
- •Инструментарий скачать субд
- •Инсталляция
- •Выполнение запросов
- •Использование примеров
- •Комментарий
- •Идентификаторы
- •Обзор типов данных
- •Интервал времени
- •Литералы
- •Выражения и операции
- •Cтроковые операции
- •Алгебраические операции
- •Операции отношения
- •Логические операции и предикаты
- •Условные выражения
- •Прочие операции
- •Обзор функций
- •Математические функции
- •Строковые функции
- •Работа с датами
- •Преобразование типов
- •Функции Oracle
- •Функции PostgreSql
- •Функции MySql
- •Создание таблицы
- •Значения полей по умолчанию
- •Ключи и ограничения
- •Настройка внешнего ключа
- •Создание по выборке
- •Дополнительные параметры таблицы
- •Изменение, удаление таблицы
- •Переименование таблицы или ее столбца
- •Добавление/удаление столбца
- •Первичный ключ
- •Уникальный ключ
- •Внешний ключ
- •Безошибочное удаление таблиц
- •Добавление записей
- •Значения по умолчанию
- •Подзапросы
- •Вставка по условию
- •Обновление записей
- •Обновление подзапросом
- •Обновление по данным другой таблицы
- •Удаление записей
- •Выборка записей
- •Выборка констант
- •Выборка по столбцам таблиц
- •Синонимы (алиасы)
- •Уникальные записи
- •Выборка по условию
- •Выборка по группам
- •Соединения
- •Агрегатные функции, группировка данных
- •Операции над выборками
- •Добавление итогов
- •Нумерация записей
- •Обеспечение уникальности первичного ключа
- •Столбцы с автоинкрементом
- •Индексы
- •Представления
- •Динамический sql (dsql)
- •Процедурные операторы блоковая структура кода
- •Присвоение
- •Условный оператор
- •Оператор выбора
- •Безусловный цикл
- •Цикл с предусловием
- •Цикл по счетчику
- •Цикл по элементам
- •Операторы выхода/продолжения итерации
- •Выборка в переменные
- •Хранимые процедуры
- •Вызов процедур
- •Исключения
- •Курсоры
- •Триггеры
- •Числа прописью
- •Транзакции, конкурирующие запросы
- •Управление аккаунтами пользователи
- •Права доступа
- •Права доступа MySql
- •Права доступа PostgreSql
- •Права доступа Oracle
- •Удаление прав доступа
- •Роли PostgreSql
- •Роли Oracle
- •Роли MySql
- •Файловый вывод/ввод
- •Информация о базе данных
Агрегатные функции, группировка данных
Для группировки данных в запросе select используется конструкция group by, в которой должны быть перечислены те же столбцы, что и после select. Ниже приведен пример вывода данных по группам для таблицы bills.
-- таблица счетов
create table bills(
id integer,
d date, -- дата счета
summ double precision ,-- сумма счета
constraint pk_bills primary key (id)
);
-- вставка данных
insert into bills
values(1, date '2008-01-01', 5.5);
insert into bills
values(2, date '2008-02-01', 3.14);
insert into bills
values(3, date '2008-03-01', 10.14);
insert into bills
values(4, date '2008-01-01', 7.2);
insert into bills
values(5, date '2008-02-01', 6.4);
insert into bills
values(6, date '2008-03-01', 2.5);
commit;
-- вывод данных по группам
select t.d, t.summ from bills t
group by t.d, t.summ
Сами по себе группы редко используются, и предыдущий пример выборки можно заменить сортировкой. Другое дело, если необходимо воспользоваться одной из групповых функций, называемых агрегатными:
avg([DISTINCT|ALL] column) - среднее значение по указанному столбцу;
count(*|[DISTINCT|ALL] соlumn) - количество элементов в выборке или в группе определяемой указанным столбцом;
sum([DISTINCT | ALL] соlumn) - сумма значений указанного столбца;
max(соlumn) - максимальное значение в столбце;
min(соlumn) - минимальное значение в столбце.
Ключевое слово DISTINCT позволяет игнорировать повторные значения в столбце, ALL обрабатывает все значения в столбце (по умолчанию), * позволяет включить в обработку поля с null значением. В MySQL между именем функции и скобкой не должно быть пробелов. Ниже приведен пример использования агрегатных функций в качестве выбираемых данных. Если агрегатная функция используется в выборке без group by, то она применяется ко всем записям выборки, иначе для каждой группы в отдельности. И в любом случае в перечислении select нельзя смешивать групповые столбцы с не групповыми.
-- статистические данные по всем месяцам
select count(*) as "число записей",
max(t.summ) as "макс. сумма",
min(t.summ) as "мин. сумма",
avg(t.summ) as "средняя сумма",
sum(t.summ) as "общая сумма"
from bills t;
-- статистические данные по каждому месяцу
select t.d as "месяц", count(1) as "число записей",
max(t.summ) as "макс. сумма",
min(t.summ) as "мин. сумма",
avg(t.summ) as "средняя сумма",
sum(t.summ) as "общая сумма"
from bills t
group by t.d
Агрегатные функции можно использовать в выражениях условия в конструкции having для отбора группы.
-- отбираем группы у которых общая сумма больше 12
select t.d as "месяц", count(*) as "число записей",
max(t.summ) as "макс. сумма",
min(t.summ) as "мин. сумма",
avg(t.summ) as "средняя сумма",
sum(t.summ) as "общая сумма"
from bills t
group by t.d
having sum(t.summ)>12
Операции над выборками
Так как выборка по сути является множеством, то и доступные операции над ними соответствующие:
UNION - объединение, в конечной выборке записи из обоих запросов;
INTERSECT - пересечение, в конечной выборке записи входящие в оба запроса;
EXCEPT - исключение, в конечной выборке записи входящие только в первый запрос.
Запросы участвующие в таких операциях должны следовать нескольким условиям. Иметь одинаковое число столбцов, соответствующие столбцы должны быть одного типа. Тип данных столбца должен быть простым, т.е. не разрешаются типы подобные blob. MySQL 5 поддерживает только UNION, в Oracle EXCEPT для других целей, а для исключения используется MINUS.
-- from dual только для Oracle
-- в MySQL нельзя заключить
-- запросы в круглые скобки
select 1 as i from dual
UNION
select 2 as i from dual
UNION -- попробуйте также INTERSECT и EXCEPT
select 2 as i from dual
UNION
select 3 as i from dual;
По умолчанию в результирующую выборку попадают только уникальные записи. Для включения всех записей используется ключевое слово ALL после имени операции. Например, в следующем примере будет две записи со значением 2.
select 1 as i from dual
UNION
select 2 as i from dual
UNION ALL
select 2 as i from dual
UNION
select 3 as i from dual;