Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по SQL http.doc
Скачиваний:
0
Добавлен:
04.12.2019
Размер:
671.74 Кб
Скачать

Агрегатные функции, группировка данных

Для группировки данных в запросе 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;