2.5.2. Функции без использования фразы GROUP BY

Если не используется фраза GROUP BY, то в перечень элементов_SELECT можно включать лишь SQL-функции или выражения, содержащие такие функции. Другими словами, нельзя иметь в списке столбцы, не являющихся аргументами SQL-функций.

Например, выдать данные о массе лука (ПР=10), проданного поставщиками, и указать количество этих поставщиков:

| Результат:
--- | ---
    SELECT	SUM(К_во),COUNT(К_во)
    FROM	Поставки
    WHERE	ПР = 10;
SUM(К_во) | COUNT(К_во)
220 | 2

Если бы для вывода в результат еще и номера продукта был сформирован запрос

    SELECT	ПР,SUM(К_во),COUNT(К_во)
    FROM	Поставки
    WHERE	ПР = 10;

то было бы получено сообщение об ошибке. Это связано с тем, что SQL-функция создает единственное значение из множества значений столбца-аргумента, а для "свободного" столбца должно быть выдано все множество его значений. Без специального указания (оно задается фразой GROUP BY) SQL не будет выяснять, одинаковы значения этого множества (как в данном примере, где ПР=10) или различны (как было бы при отсутствии WHERE фразы). Поэтому подобный запрос отвергается системой.

Правда, никто не запрещает дать запрос

    SELECT	'Кол-во лука =',SUM(К_во),COUNT(К_во)
    FROM	Поставки
    WHERE	ПР = 10;

Результат:
'Кол-во лука =' | SUM(К_во) | COUNT(К_во)
--- | --- | ---
Кол-во лука = | 220 | 2

Отметим также, что в столбце-аргументе перед применением любой функции, кроме COUNT(*), исключаются все неопределенные значения. Если оказывается, что аргумент - пустое множество, функция COUNT принимает значение 0, а остальные - NULL.

Например, для получения суммы цен, средней цены, количества поставляемых продуктов и количества разных цен продуктов, проданных коопторгом УРОЖАЙ (ПС=5), а также для получения количества продуктов, которые могут поставляться этим коопторгом, можно дать запрос

    SELECT	SUM(Цена),AVG(Цена),COUNT(Цена),
    	COUNT(DISTINCT  Цена),COUNT(*)
    FROM	Поставки
    WHERE	ПС = 5;

и получить

SUM(Цена) | AVG(Цена) | COUNT(Цена) | COUNT(DISTINCT Цена) | COUNT
--- | --- | --- | --- | ---
(*)
6.2 | 1.24 | 5 | 4 | 7

В другом примере, где надо узнать "Сколько поставлено моркови и сколько поставщиков ее поставляют?":

    SELECT SUM(К_во),COUNT(К_во)
    FROM	Поставки
    WHER	ПР = 2;

будет получен ответ:

SUM(К_во) | COUNT (К_во)
--- | ---
-0- | 0

Наконец, попробуем получить сумму массы поставленного лука с его средней ценой ("Сапоги с яичницей"):

| Результат:
--- | ---
    SELECT	(SUM(К_во)	+AVG(Цена))
    FROM	Поставки
    WHERE	ПР = 10;
SUM(К_во)+AVG(Цена)
220.6

2.5.1 | Содержание | 2.5.3