Функции, используемые в операторах GROUP BY
Вызов групповых функций для 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 необходимо провести конкатенацию всех выражений внутри CODE(DISTINCT ...) .
AVG(expr)
Возвращает среднее значение аргумента expr:
mysql> SELECT student_name, AVG(test_score) FROM student GROUP BY student_name;
MIN(expr)
MAX(expr)
Возвращает минимальную или максимальную величину аргумента expr . Функции MIN() и MAX() могут принимать строковый аргумент; в таких случаях они возвращают минимальную или максимальную строковую величину. См. раздел Использование индексов в MySQL.
mysql> SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;
SUM(expr)
Возвращает сумму величин в аргументе expr . Обратите внимание: если возвращаемый набор данных не содержит ни одной строки, то функция возвращает NULL !
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)
См. раздел Строка, содержащая максимальное значение некоторого столбца.
Следует отметить, что в версии 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();
1 2 3
8 8 8
| |