Реализация языка SQL в MySQL - Групповые функции в операторе select

ОГЛАВЛЕНИЕ

Групповые функции в операторе select

Следующие функции могут быть использованы в предложении GROUP:

AVG() Среднее для группы GROUP.
SUM() Сумма элементов GROUP.
COUNT() Число элементов в GROUP.
MIN() Минимальный элемент в GROUP.
MAX() Максимальный элемент в GROUP.

Здесь MIN() и MAX() могут принимать строку или число в качестве аргумента. Эти функции не могут использоваться в выражении, хотя их параметр может быть выражением:

ПРИМЕР: "SUM(value/10)" нормально, но вот "SUM(value)/10" уже нет!

  • Строки автоматически конвертируются в числа и наоборот по мере необходимости (прямо как в perl). При использовании операторов = <= >= < > как в инструкции WHERE, левая сторона определяет, выполняется ли тест с числами или со строками. Все сравнения строк независимы от регистра (ISO8859-1).

    ПРИМЕР:

     "a" < "b"   ; Сравнение строк   "a" < 0     ; Сравнение строк   0  < "a"    ; Сравнение чисел   a < 5       ; Если поле имеет тип CHAR, то сравниваются строки,                  ; иначе сравниваются числа. 
    Если надо учитывать регистр, используйте REGEXP в HAVING.
  • Имя столбца не должно иметь префикса таблицы, если данное имя столбца уникально.
  • В LIKE выражения % и _ могут предваряться символом \ для получения символьного выражения.
  • DATE является строкой с одним из синтаксисов:
    • YYMMDD (Год считается 2000, если YY < 70)
    • YYYYMMDD
    • YY.MM.DD Здесь '.' может быть любым нецифровым разделителем
    • YYYY.MM.DD Здесь '.' может быть любым нецифровым разделителем
  • IFNULL() и IF() возвращает число или строку в зависимости от ситуации, в которой использованы.
  • Order и group столбец может быть именем столбца, его псевдонимом или номером в операторе SELECT.
  • HAVING может принимать в качестве аргумента любые поля или псевдонимы в select_expression. Он применяется последним перед передачей данных клиенту без какой-либо оптимизации. Не используйте его для элементов из предложения WHERE.

    Замечание: Вы не можете написать:
    SELECT user,MAX(salary) FROM users GROUP BY users HAVING max(salary)>10
    Вместо этого, используйте нечто вроде следующего (это хороший пример использования псевдонимов столбцов):
    SELECT user,MAX(salary) AS sum FROM users GROUP BY users HAVING sum > 10

  • LIMIT принимает один или два аргумента. Один аргумент задает максимальное число строк в результате. В случае двух аргументов этот максимум задает второй аргумент, а первый указывает смещение первой строки.
  • INTO OUTFILE 'filename' пишет результаты в файл. Файл не должен существовать на момент выполнения этой команды. См. раздел LOAD DATA INFILE для более подробной информации. Это может быть весьма опасной командой, если daemon запущен от имени root. Самое лучшее предоставить право доступа file только когда это абсолютно необходимо.
  • Вы можете использовать числовое значение в предложении ORDER BY для определения столбца, который Вас интересует. ТО ЕСТЬ, если Вы желаете провести сортировку второго столбца, определенного в вашем запросе SELECT, следует написать "ORDER BY 2;". Это также полезно, когда Вы использовали функцию в вашем SELECT.

    ПРИМЕР:

      SELECT Widget_Table.widget_id, Widget_Table.widget_name,          Purchase_Order_Item.widget_id, sum(Purchase_Order_Item.quantity)          
    FROM Widget_Table, Purchase_Order_Item
    WHERE Widget_Table.widget_id = Purchase_Order_Item.widget_id
    GROUP BY Widget_Table.widge t_name ORDER BY 4;