□ 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