Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
conspect.pdf
Скачиваний:
374
Добавлен:
17.03.2016
Размер:
27.86 Mб
Скачать

Базы данных

БГУИР, ПОИТ

 

 

6.1.12.SELECT: [GROUP BY …]

Указание имени (или номера) поля или выражения, по которым следует сгруппировать результаты выборки.

В руководстве сказано…

При использовании GROUP BY результат сортируется по тем же полям, по которым производилась группировка. Чтобы избежать этого, используйте GROUP BY `field` ORDER BY NULL;

Для более глубокого понимания того, почему вы получаете те или иные результаты с GROUP BY, см.:

http://dev.mysql.com/doc/refman/5.5/en/group-by-functions-and-modifiers.html

1) Группировка по имени поля Показать сумму платежей по каждому плательщику:

Исходная таблица

Запрос

Результат

SELECT `name`, SUM(`money`) AS `s`

FROM `payment_archive`

GROUP BY `name`

 

 

 

Несмотря на то, что это работает – НЕ ДЕ-

2) Группировка по номеру поля

ЛАЙТЕ ТАК! Группировка по номерам полей

 

 

 

«слетит», как только изменится порядок и/или

Исходная таблица

 

 

Запрос

Результат

 

 

 

количество полей в основной части запроса.

 

 

 

 

 

 

SELECT `name`, SUM(`money`) AS `s`

 

 

 

 

FROM `payment_archive`

 

 

 

 

GROUP BY 1

 

 

 

 

 

 

 

 

 

Стр: 157/248

Базы данных

БГУИР, ПОИТ

 

 

3) Группировка по выражению

Для рассмотрения серии примеров использования выражений немного доработаем нашу таблицу.

3а) Показать суммы платежей по каждому месяцу:

Исходная таблица

Запрос

Результат

SELECT EXTRACT(YEAR_MONTH FROM `date`) AS `d`, SUM(`money`) AS `s` from `payment_archive` GROUP BY `d`

3б) Показать суммы платежей, выполненных каждым плательщиком в каждый месяц (группировка по выражению и полю):

Исходная таблица

Запрос

Результат

SELECT `name`, EXTRACT(YEAR_MONTH

FROM `date`) AS `d`, SUM(`money`)

AS `s` from `payment_archive`

GROUP BY `d`, `name`

Немного переделав предыдущий пример, можно показать что выражение в секции GROUP BY можно прописывать явно:

Исходная таблица

Запрос

Результат

SELECT `name`, SUM(`money`) AS `s` FROM `payment_archive` GROUP BY EXTRACT(YEAR_MONTH FROM `date`), `name`

Стр: 158/248

Базы данных

БГУИР, ПОИТ

 

 

4) Группировка данных из разных строк

Допустим, мы хотим увидеть суммы платежей по месяцам и список плательщиков в виде строки:

Исходная таблица

Запрос

Результат

SELECT EXTRACT(YEAR_MONTH FROM `date`) AS `d`, SUM(`money`) AS `s`, GROUP_CONCAT(`name`)

AS `names` FROM `payment_archive` GROUP BY `d`

Чтобы избежать дублирования имён, вывести их по алфавиту и разделить нужными сепараторами, используем такой запрос (добавим в таблицу ещё один ряд для наглядности):

Исходная таблица

Запрос

Результат

SELECT EXTRACT(YEAR_MONTH FROM `date`) AS `d`, SUM(`money`) AS `s`, GROUP_CONCAT(DISTINCT `name` ORDER BY `name` ASC SEPARATOR ';') AS `names` FROM `payment_archive`

GROUP BY `d`

Стр: 159/248

Базы данных

БГУИР, ПОИТ

 

 

Группировка по нескольким полям одной таблицы допустима и не будет нарушением нормализации, например, в таком случае: показать сумму платежей по каждому дню по каждому плательщику.

Исходная таблица

Запрос

Результат

SELECT `date`, `name`, SUM(`money`)

AS `sum` FROM `payment_with_date`

GROUP BY `date`, `name`

Q: Что будет, если в группировке поменять местами поля `date` и `name`? A: Фактически, изменится только последовательность записей. Но ею все-

гда можно управлять с помощью ORDER BY.

Исходная таблица

Запрос

Результат

SELECT `date`, `name`, SUM(`money`)

AS `sum` FROM `payment_with_date`

GROUP BY `date`, `name`

SELECT `date`, `name`, SUM(`money`)

AS `sum` FROM `payment_with_date`

GROUP BY `name`, `date`

Q: Что будет, если группировать по полю, в котором есть NULL? A: «Все NULL’ы» будут засчитаны как одинаковые значения.

Исходная таблица

Запрос

Результат

SELECT `name`, SUM(`money`) AS `sum`

FROM `payment_with_date`

GROUP BY `name`

Стр: 160/248

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]