Выбрать главу

□ SELECT product_type_id

FROM products

GROUP BY product_type_id;

PRODUCT_TYPE_ID

1

2

3

4

Обратите внимание, что для каждого блока строк с одинаковыми значениями

столбца product_type_id возвращается всего по одной строке

и есть пустая строка между 1 и 2 (вы вскоре увидите, почему так происходит).

В выходных данных есть всего одна строка для produ ct_type_id, равного

1, еще одна строка - для produ ct_type_id, равного 2, и т. д. На самом

деле, в таблице products есть две строки с produ ct_type_ id , равным 1, и четыре

строки с produ ct_type_id, равным 2, и так далее. Эти строки группируются

вместе в отдельные блоки, по одному блоку для каждого значения

product_type_id. В первом блоке будет содержаться две строки, во втором -

четыре строки и т. д.

Пустая строка между 1 и 2 вызвана строкой, где produ ct_type_id равен

n u ll. Эта строка показана в следующем примере:

128 Глава 4

□ SELECT product_id, name, price

FROM products

WHERE product_type_id IS NULL;

PRODUCT_ID NAME PRICE

12 My Front Line 13.49

Поскольку для этой строки prod u ct_ typ e _ id равен n u ll, выражение GROUP

BY в предыдущем запросе группирует эту строку в единичный блок. Строка

в выходных данных пустая, потому что produ ct_type_ id для этого блока равен

n u ll, вот откуда появляется пустая строка между 1 и 2.

Использование в группе нескольких столбцов

Во фразе GROUP BY можно указать несколько столбцов. В следующем запросе

во фразу GROUP BY включены столбцы product_id и customer_id из таблицы

purchases:

□ SELECT product_id, customer_id

FROM purchases

GROUP BY product_id, customer_id;

PRODUCT_ID CUSTOMER_ID

1 1

1 2

1 3

1 4

2 1

2 2

2 3

2 4

3 3

Использование групп строк в агрегатных ф ункциях

В агрегатных функциях можно использовать блоки строк. Агрегатные функции

выполняют свои вычисления над группой строк, образующих блок, и

возвращают для каждого блока одно значение. Чтобы получить количество

строк с одинаковым product_type_id из таблицы products, можно:

■ использовать фразу GROUP BY для группировки строк в блоки с одним

и тем же значением product_type_id;

■ использовать функцию COUNT(ROWID) для получения количества

строк в каждом блоке.

В следующем запросе показано использование фразы GROUP BY и функции

C0UNT():

□ SELECT product_type_id, COUNT(ROWID)

FROM products

GROUP BY product_type_id

ORDER BY product_type_id;

Использование простых функций 129

PRODUCT_TYPE_ID COUNT(ROWID)

1 2

2 4

3 2

4 3

1

Обратите внимание, что в результирующем множестве содержится

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

products, сгруппированных вместе по одинаковому product_type_id.

Из результирующего множества видно, что существуют две строки с

p rodu ct_type_id равным 1, четыре строки с p rodu ct_type_id равным 2, и т.д.

Последняя строка показывает, что есть только одна строка с пустым

product_type_id (это вызвано упомянутым ранее товаром ”Му Front Line” ).

Давате посмотрим на другой пример. Чтобы получить среднюю цену

для различных типов товаров в таблице products, необходимо сделать следующее:

■ использовать оператор GROUP BY для группировки строк в блоки с

одинаковым p ro d a c tlty p e _ id ;

■ использовать AVG(price), чтобы получить среднюю цену для каждого

блока строк.

Это показано на следующем примере:

□ SELECT product_type_id, AVG(price)

FROM products

GROUP BY product_type_id

ORDER BY product_type_id;

PRODUCT_TYPE_ID AVG(PRICE)

1 24.975

2 26.22

3 13.24

4 13.99

13.49

Каждая группа строк с одинаковым p rodu ct_type_id передаётся функции

AVG(). Затем AVG() вычисляет среднюю цену для каждой группы. Как

видно из результирующего множества, средняя цена для группы товаров с

product_type_id, равным 1, составляет 24.975. Аналогично, средняя цена

для группы товаров с produ ct_type_id, равным 2, составляет 26.22. Обратите

внимание, что последняя строка в множестве показывает среднюю цену

13.49; это просто цена товара ”Му Front Line” , единственной строки с пустым

product_type_id.

Вы можете использовать любые агрегатные функции совместно с GROUP

BY. Например, следующий запрос вычисляет дисперсию цен на товары для

каждого product_type_id:

□ SELECT product_type_id, VARIANCE(price)

FROM products

130 Гпава 4

GROUP BY product_type_id

ORDER BY product_type_id;

PRODUCT_TYPE_ID VARIANCE(PRICE)

1 50.50125

2 280.8772

3 .125

4 7

0

Нужно помнить, что вам не требуется включать столбцы, используемые

в GROUP BY, в список столбцов, следующий сразу за SELECT. Например, следующий

запрос аналогичен предыдущему за тем исключением, что product_

tgype_id опущен в операторе SELECT;

□ SELECT VARIANCE(price)

FROM products

GROUP BY product_type_id