понедельник, 23 января 2012 г.

SQL. Группировка результатов

Что такое join-ы, мы уже знаем. Но просто соединить два множества бывает мало. И нам хочется их сгруппировать, например, для отчета.

Как выполняется группировка? С помощью следующих команд:

group by (измерение 1, измерение 2) - по перечисленным измерениям
group by rollup (измерение 1, измерение 2) - по перечисленным измерениям с итоговыми строками
group by cube (измерение 1, измерение 2) - по всем комбинациям перечисленных измерений с итогами

Непонятно? Давайте на примере.

Связываем наши книги с еще одной таблицей - Publisher, издательство


Делаем запрос по всем комбинациям жанров, связанных с каждым издательством.


Получили выборку значений. Группировка идет по указанным измерениям, справа налево.
То есть вначале для одного издательства (p.name) мы получили список всех жанров (g.name), потом для второго и тд.

NULL - это строка "Всего". Соответственно, по издательству "Wrox" у нас есть книги с жанром "Стихи" и "Фантастика", и строка - "Всего".

Теперь сравним с выборкой вида cube



Теперь мы получили комбинации со строками "Всего" не только по сворачиваемому измерению, а вообще по всем - по каждому жанру и по каждому издательству, а также "Всего - Всего"

Все равно непонятно, зачем нам эти строки - NULL. Чтобы это понять, рассмотрим группировочные функции:

MIN
MAX
AVG (среднее)
COUNT
SUM
и тд

Выведем сумму по всем жанрам всех издательств


Предварительно, конечно, заполнив цену для каждой книги. Аналогично с остальными функциями.

Если же мы хотим наложить ограничение на уже сгруппированные данные, то пишем функции не после оператора select, а после group by с помощью оператора having


Еще особенность записи операторов:
  • COUNT (ba.bookId) – ненулевые записи
  • COUNT (*) – все записи
Итого:

Последовательность операторов для запросов к БД (используются по мере необходимости):


select            - что выбираем
from              - откуда
where           - условие выборки
group by       - группируем результат
having          - сортируем сгруппированный результат
order by       - сортируем в алфавитном порядке или наоборот

2 комментария:

  1. Отличная статья. Побольше бы таких :)

    ОтветитьУдалить
  2. Спасибо :)
    Надеюсь, поможет осознать новичкам, что База Данных - это не так уж и страшно :)

    ОтветитьУдалить