поиск:
Полезные ссылки

  • Форум по MySQL

  • Статьи по MySQL

  • Вопросы по MySQL

  • MySQL.com


  • Базы данных

  • MySQL

  • PostgreSQL


  • PHP конференция 2005
    Подробности!

    6.3.7. Функции, используемые в операторах 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 необходимо провести конкатенацию всех выражений внутри 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();
    
     
    © 1997-2005 PHP Club Team
    Rambler's Top100