Вызов групповых функций для SQL-команд, не содержащих GROUP BY
,
эквивалентен выполнению этих функций над всем набором возвращаемых данных.
-
COUNT(expr)
Возвращает количество величин со значением, не равным
NULL
, в строках, полученных при помощи командыSELECT
:mysql> SELECT student.student_name,COUNT(*) FROM student,course WHERE student.student_id=course.student_id GROUP BY student_name;
Функция
COUNT(*)
несколько отличается от описанной выше: она возвращает количество извлеченных строк, содержащих величины со значениемNULL
.COUNT(*)
оптимизирована для очень быстрого возврата результата при условии, что командаSELECT
извлекает данные из одной таблицы, никакие другие столбцы не обрабатываются и функция не содержит выраженияWHERE
. Например:mysql> SELECT COUNT(*) FROM student;
-
COUNT(DISTINCT expr,[expr...])
Возвращает количество различающихся величин со значением, не равным
NULL
:mysql> SELECT COUNT(DISTINCT results) FROM student;
В MySQL для того, чтобы получить количество различающихся комбинаций выражений, не содержащих
NULL
, нужно просто задать список этих выражений. В ANSI SQL необходимо провести конкатенацию всех выражений внутриCOUNT(DISTINCT ...)
. -
AVG(expr)
Возвращает среднее значение аргумента expr:
mysql> SELECT student_name, AVG(test_score) FROM student GROUP BY student_name;
-
MIN(expr)
,MAX(expr)
Возвращает минимальную или максимальную величину аргумента
expr
. ФункцииMIN()
иMAX()
могут принимать строковый аргумент; в таких случаях они возвращают минимальную или максимальную строковую величину. See Раздел 5.4.3, «Использование индексов в MySQL».mysql> SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;
В
MIN()
,MAX()
и других групповых фунциях MySQL сейчас сравниваетENUM
иSET
-столбцы по ихнему строковому представлению а не по относительной позиции строки в множестве. Это будет исправлено. -
SUM(expr)
Возвращает сумму величин в аргументе
expr
. Обратите внимание: если возвращаемый набор данных не содержит ни одной строки, то функция возвращаетNULL
! -
VARIANCE(expr)
Возвращает вариант стандарта, которому соответствует
expr
. Это - расширение по сравнению с ANSI SQL, доступное только в 4.1 или более поздних версиях. -
STD(expr)
,STDDEV(expr)
Возвращает среднеквадратичное отклонение значения в аргументе
expr
. Эта функция является расширением ANSI SQL. ФормаSTDDEV()
обеспечивает совместимость с Oracle. -
BIT_OR(expr)
Возвращает побитовое ИЛИ для всех битов в
expr
. Вычисление производится с 64-битовой (BIGINT
) точностью. -
BIT_AND(expr)
Возвращает побитовое И для всех битов в
expr
. Вычисление производится с 64-битовой (BIGINT
) точностью.
В MySQL расширены возможности использования оператора GROUP BY
. Теперь в
выражениях SELECT
можно использовать столбцы или вычисления, которые не
присутствуют в части GROUP BY
. Это справедливо для любой возможной
величины для этой группы. Данная возможность позволяет повысить
производительность за счет исключения сортировки и группирования ненужных
величин. Например, в следующем запросе нет необходимости в группировке
customer.name
:
mysql> SELECT order.custid,customer.name,MAX(payments) FROM order,customer WHERE order.custid = customer.custid GROUP BY order.custid;
В ANSI SQL к предложению GROUP BY
необходимо добавлять customer.name
. В
MySQL, если работа происходит не в режиме ANSI, это имя избыточно.
Не используйте данное свойство, если столбцы, пропущенные в части GROUP BY
, не являются уникальными в данной группе! Возможны непредсказуемые
результаты.
В некоторых случаях можно применять функции MIN()
и MAX()
для получения
указанной величины столбца, даже если он не является уникальным. В
следующем примере выдается значение столбца column
из строки, содержащей
наименьшую величину в столбце sort
:
SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)
See Раздел 3.5.4, «Строка, содержащая максимальное значение некоторого столбца».
Следует отметить, что в версии MySQL 3.22 (или более ранней) либо при
попытке работы в рамках ANSI SQL применение выражений в предложениях
GROUP BY
или ORDER BY
невозможно. Это ограничение можно обойти,
используя для выражения псевдоним:
mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name GROUP BY id,val ORDER BY val;
В версии MySQL 3.23 можно также выполнить следующее:
mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();