понедельник, 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       - сортируем в алфавитном порядке или наоборот

8 комментариев:

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

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

    ОтветитьУдалить
  3. Создание новой таблицы начинаем с диаграммы и связываем ее с таблицей книг? Или просто создаем новую таблицу

    ОтветитьУдалить
    Ответы
    1. Создаем одну таблицу, другую, связываем их)

      Удалить
    2. То есть в диаграмме я создаю таблицу и с помощью отношений связываю ее с таблицей книг? Как мы изначально делали с жанрами.

      Удалить
    3. Таблицы связываются через ключи, об этом было в статье http://okiseleva.blogspot.com/2012/01/blog-post_13.html

      Удалить
  4. Как правильно написать запросы для таких операций с базой данных?
    1) Найдите тарифный план, скорость передачи данных и размер ежемесячного лимита из всех тарифов Vodafone стоимостью более 100 грн;
    2) Найдите модели «model», экран «display» и размер памяти «RAM» из таблицы “Phones”, имеющих 865 или 888 процессоры и цену более 20 тыс. грн;

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