Search the MySQL manual:
MySQL Manual

Buy this Reference Manual in softcover from Barnes & Noble!

/ / Up / Table of Contents

6.3.3.2 Математические функции

Все математические функции в случае ошибки возвращают NULL.

-
Унарный минус. Изменяет знак аргумента:
mysql> SELECT - 2;
        -> -2
Необходимо учитывать, что если этот оператор используется с данными типа BIGINT, возвращаемое значение также будет иметь тип BIGINT! Это означает, что следует избегать использования оператора для целых чисел, которые могут иметь величину -2^63!
ABS(X)
Возвращает абсолютное значение величины X:
mysql> SELECT ABS(2);
        -> 2
mysql> SELECT ABS(-32);
        -> 32
Эту функцию можно уверенно применять для величин типа BIGINT.
SIGN(X)
Возвращает знак аргумента в виде -1, 0 или 1, в зависимости от того, является ли X отрицательным, нулем или положительным:
mysql> SELECT SIGN(-32);
        -> -1

mysql> SELECT SIGN(0);
        -> 0

mysql> SELECT SIGN(234);
        -> 1
MOD(N,M)
%
Значение по модулю (подобно оператору % в C). Возвращает остаток от деления N на M:
mysql> SELECT MOD(234, 10);
        -> 4

mysql> SELECT 253 % 7;
        -> 1

mysql> SELECT MOD(29,9);
        -> 2
Эту функцию можно уверенно применять для величин типа BIGINT.
FLOOR(X)
Возвращает наибольшее целое число, не превышающее X:
mysql> SELECT FLOOR(1.23);
        -> 1

mysql> SELECT FLOOR(-1.23);
        -> -2
Следует учитывать, что возвращаемая величина преобразуется в BIGINT!
CEILING(X)
Возвращает наименьшее целое число, не меньшее, чем X:
mysql> SELECT CEILING(1.23);
        -> 2

mysql> SELECT CEILING(-1.23);
        -> -1
Следует учитывать, что возвращаемая величина преобразуется в BIGINT!
ROUND(X)
Возвращает аргумент X, округленный до ближайшего целого числа:
mysql> SELECT ROUND(-1.23);
        -> -1

mysql> SELECT ROUND(-1.58);
        -> -2

mysql> SELECT ROUND(1.58);
        -> 2
Следует учитывать, что поведение функции ROUND() при значении аргумента, равном середине между двумя целыми числами, зависит от конкретной реализации библиотеки C. Округление может выполняться: к ближайшему четному числу, всегда к ближайшему большему, всегда к ближайшему меньшему, всегда быть направленным к нулю. Чтобы округление всегда происходило только в одном направлении, необходимо использовать вместо данной хорошо определенные функции, такие как TRUNCATE() или FLOOR().
ROUND(X,D)
Возвращает аргумент X, округленный до числа с D десятичными знаками. Если D равно 0, результат будет представлен без десятичного знака или дробной части:
mysql> SELECT ROUND(1.298, 1);
        -> 1.3

mysql> SELECT ROUND(1.298, 0);
        -> 1
EXP(X)
Возвращает значение e (основа натуральных логарифмов), возведенное в степень X:
mysql> SELECT EXP(2);
        -> 7.389056

mysql> SELECT EXP(-2);
        -> 0.135335
LOG(X)
Возвращает натуральный логарифм числа X:
mysql> SELECT LOG(2);
        -> 0.693147

mysql> SELECT LOG(-2);
        -> NULL
Чтобы получить логарифм числа X для произвольной основы логарифмов B, следует использовать формулу LOG(X)/LOG(B).
LOG10(X)
Возвращает десятичный логарифм числа X:
mysql> SELECT LOG10(2);
        -> 0.301030

mysql> SELECT LOG10(100);
        -> 2.000000

mysql> SELECT LOG10(-100);
        -> NULL
POW(X,Y)
POWER(X,Y)
Возвращает значение аргумента X, возведенное в степень Y:
mysql> SELECT POW(2,2);
        -> 4.000000

mysql> SELECT POW(2,-2);
        -> 0.250000
SQRT(X)
Возвращает неотрицательный квадратный корень числа X:
mysql> SELECT SQRT(4);
        -> 2.000000

mysql> SELECT SQRT(20);
        -> 4.472136
PI()
Возвращает значение числа "пи". По умолчанию представлено 5 десятичных знаков, но в MySQL для представления числа "пи" при внутренних вычислениях используется полная двойная точность.
mysql> SELECT PI();
        -> 3.141593

mysql> SELECT PI()+0.000000000000000000;
        -> 3.141592653589793116
COS(X)
Возвращает косинус числа X, где X задается в радианах:
mysql> SELECT COS(PI());
        -> -1.000000
SIN(X)
Возвращает синус числа X, где X задается в радианах:
mysql> SELECT SIN(PI());
        -> 0.000000
TAN(X)
Возвращает тангенс числа X, где X задается в радианах:
mysql> SELECT TAN(PI()+1);
        -> 1.557408
ACOS(X)
Возвращает арккосинус числа X, т.е. величину, косинус которой равен X. Если X не находится в диапазоне от -1 до 1, возвращает NULL:
mysql> SELECT ACOS(1);
        -> 0.000000

mysql> SELECT ACOS(1.0001);
        -> NULL

mysql> SELECT ACOS(0);
        -> 1.570796
ASIN(X)
Возвращает арксинус числа X, т.е. величину, синус которой равен X. Если X не находится в диапазоне от -1 до 1, возвращает NULL:
mysql> SELECT ASIN(0.2);
        -> 0.201358

mysql> SELECT ASIN('foo');
        -> 0.000000
ATAN(X)
Возвращает арктангенс числа X, т.е. величину, тангенс которой равен X:
mysql> SELECT ATAN(2);
        -> 1.107149

mysql> SELECT ATAN(-2);
        -> -1.107149
ATAN(Y,X)
ATAN2(Y,X)
Возвращает арктангенс двух переменных X и Y. Вычисление производится так же, как и вычисление арктангенса Y / X, за исключением того, что знаки обоих аргументов используются для определения квадранта результата:
mysql> SELECT ATAN(-2,2);
        -> -0.785398

mysql> SELECT ATAN2(PI(),0);
        -> 1.570796
COT(X)
Возвращает котангенс числа X:
mysql> SELECT COT(12);
        -> -1.57267341

mysql> SELECT COT(0);
        -> NULL
RAND()
RAND(N)
Возвращает случайную величину с плавающей точкой в диапазоне от 0 до 1,0. Если целочисленный аргумент N указан, то он используется как начальное значение этой величины:
mysql> SELECT RAND();
        -> 0.9233482386203

mysql> SELECT RAND(20);
        -> 0.15888261251047

mysql> SELECT RAND(20);
        -> 0.15888261251047

mysql> SELECT RAND();
        -> 0.63553050033332

mysql> SELECT RAND();
        -> 0.70100469486881
В выражениях вида ORDER BY не следует использовать столбец с величинами RAND(), поскольку применение оператора ORDER BY приведет к многократным вычислениям в этом столбце. В версии MySQL 3.23 можно, однако, выполнить следующий оператор: SELECT * FROM table_name ORDER BY RAND(): он полезен для получения случайного экземпляра из множества SELECT * FROM table1,table2 WHERE a=b AND c. Следует учитывать, что оператор RAND() в выражении WHERE при выполнении выражения WHERE будет вычисляться каждый раз заново. Оператор RAND() не следует воспринимать как полноценный генератор случайных чисел: это просто быстрый способ динамической генерации случайных чисел, переносимых между платформами для одной и той же версии MySQL.
LEAST(X,Y,...)
Если задано два или более аргументов, возвращает наименьший (с минимальным значением) аргумент. Сравнение аргументов происходит по следующим правилам:
  • Если возвращаемая величина используется в целочисленном контексте (INTEGER), или все аргументы являются целочисленными, то они сравниваются как целые числа.
  • Если возвращаемая величина используется в контексте действительных чисел (REAL) или все аргументы являются действительными числами, то они сравниваются как числа типа REAL.
  • Если один из аргументов является зависимой от регистра строкой, то данные аргументы сравниваются с учетом регистра.
  • В остальных случаях аргументы сравниваются как строки, независимые от регистра.
mysql> SELECT LEAST(2,0);
        -> 0

mysql> SELECT LEAST(34.0,3.0,5.0,767.0);
        -> 3.0

mysql> SELECT LEAST("B","A","C");
        -> "A"
В версиях MySQL до 3.22.5 можно использовать MIN() вместо LEAST.
GREATEST(X,Y,...)
Возвращает наибольший (с максимальным значением) аргумент. Сравнение аргументов происходит по тем же правилам, что и для LEAST:
mysql> SELECT GREATEST(2,0);
        -> 2

mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
        -> 767.0

mysql> SELECT GREATEST("B","A","C");
        -> "C"
В версиях MySQL до 3.22.5 можно использовать MAX() вместо GREATEST.
DEGREES(X)
Возвращает аргумент X, преобразованный из радианов в градусы:
mysql> SELECT DEGREES(PI());
        -> 180.000000
RADIANS(X)
Возвращает аргумент X, преобразованный из градусов в радианы:
mysql> SELECT RADIANS(90);
        -> 1.570796
TRUNCATE(X,D)
Возвращает число X, усеченное до D десятичных знаков. Если D равно 0, результат будет представлен без десятичного знака или дробной части:
mysql> SELECT TRUNCATE(1.223,1);
        -> 1.2

mysql> SELECT TRUNCATE(1.999,1);
        -> 1.9

mysql> SELECT TRUNCATE(1.999,0);
        -> 1
Следует учитывать, что обычно в компьютерах десятичные числа хранятся не так, как целые, а как числа двойной точности с плавающим десятичным знаком (DOUBLE). Поэтому иногда результат может вводить в заблуждение, как в следующем примере:
mysql> SELECT TRUNCATE(10.28*100,0);
        -> 1027
Это происходит потому, что в действительности 10,28 хранится как нечто вроде 10,2799999999999999.

User Comments

Posted by on Wednesday December 18 2002, @5:27pm [Delete] [Edit]

You bring up some important issues, but
dealing with ages really isn't that
hard. For
example you could do something like this:

mysql> SELECT DATE_FORMAT(
FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(dob)), '%Y')+0
AS age FROM people;

Where 'dob' is obviously their date of birth.
It'll also work with pre and post-epoch dates.
Please excuse the funky formatting as the
comment system seems to insist on inserting line
breaks into the code block. I
ran into this problem while working on some
genealogical things over at href='http://www.mullenweg.com'>Mullenweg.com
, a family site. I hope this helps!

Posted by Dan Allen on Wednesday December 18 2002, @5:31pm [Delete] [Edit]



Seems to be a real pain to get the days in the
month, but here is one way

select
DATE_FORMAT(CONCAT(YEAR('2002-05-05'), '-',
MONTH('2002-05-05' + INTERVAL 1 MONTH), '-01') -
INTERVAL 1 DAY, '%e') as numDays


I guess it would be nice if we could just have a
DATE_FORMAT entity for this
Posted by on Friday August 30 2002, @4:00am [Delete] [Edit]

SELECT RAND() AS n
works fine. It returns everytime a different result.

SELECT RAND(RAND()) AS n
always returns the same result.

SELECT RAND() AS n, RAND(n) AS caso
returns an error: MySQL doesnt recognize n. (maybe this is right... honestly, I dont know...)

It is not important but I think it's strange...

Posted by Carl Troein on Tuesday September 10 2002, @2:37am [Delete] [Edit]

That these functions return NULL in case of errors
is a great feature. I'm trying to port an
application to PostgreSQL, and it throws a fit
every time I try to take the logarithm of a
nonpositive number, and it doesn't know how to log
floats but only doubles, so I've had to replace
LOG(x) with CASE ... LOG(CAST(...)) ELSE NULL...
and it's a major pain.
This is not the place to whine about one RDBMS or
the other, but I just thought I should point out
how useful it is that these functions always
return _something_.

Posted by Nick Gaugler on Tuesday November 19 2002, @10:21am [Delete] [Edit]

As of MySQL 3.23.52, MySQL changed the way
RAND() functions, such that you MUST supply a
SEED to get an actual random number. If you do
not, each new connection will return close to the
same number as the previous new connection. An
example to test this would be to run the follow
command multiple times in a row. mysql -u
username -p -e'select rand()' A basic way to seed
this would be to run RAND(NOW()).

Posted by [name withheld] on Thursday November 28 2002, @2:27am [Delete] [Edit]

My brother had a case where he wanted to sort
randomly but ALSO use LIMIT so he could page
results - of course random will be different each time.

He wanted a random order that was not random for
the same session; so here is the idea:

In the web-side code calculate a numeric value which
is likely to stay the same for a session, perhaps
based on some session id, or timed-expiring cookie
value, etc, or from short-term stable HTTP headers.

Also require a numeric and well distributed value for
each record (doesn't have to be unique but works
well if it is).

Then:

... order by rand(numeric_field + session_value)
LIMIT blah;

So we see the ordering is preserved as
numeric_field+session_value will be the same for a
session, and numeric_field + session value are NOT
the same from row to row so we still get random
ordering.

Sam Liddicott

Posted by on Sunday December 1 2002, @11:05pm [Delete] [Edit]

Windows2000(mysql 3.23.27-beta):
select pi()
+0.000000000000000000000000000000;
-> result :
3.141592653589793100000000000000

Linux ( mysql 3.23.27-beta):
select pi()
+0.000000000000000000000000000000;
-> result :
3.141592653589793115997963468544

WHY? PLEASE EMAIL TO ME( [email protected])

Posted by on Thursday January 9 2003, @7:17pm [Delete] [Edit]

I might be caused by compiler ability to count to upto 30 places under zero. Win32 mysql probably mighe be compiled with 32bit compiler rather than 64bit. -- Hyungjin Ahn([email protected])

Posted by on Tuesday February 11 2003, @1:28pm [Delete] [Edit]

I had this problem with RAND() in 3.23.54 . I wanted to select a random row (for a banner script), but mySQL kept on giving me the lovest ID even that I used RAND().

Original query:
SELECT id, image, RAND() AS myRandom
FROM banner ORDER BY myRandom LIMIT 0, 1

The problem was, that the random string was lower for lover IDs. By MD5-ing it I got better randon strings. It's not the perfect solution, but it helped me. You could probably do hashes from the id or other content and get the same effect.

Soultion:
SELECT id, image, MD5( RAND( ) ) AS myRandom
FROM banner ORDER BY myRandom LIMIT 0, 1

Posted by robin lee on Saturday February 15 2003, @10:26am [Delete] [Edit]

I am trying to use the order by rand() function in a where statement :

select * from table_name where a=a and b=b order by rand()limit 3

the 1st result is always the 1st record in my mysql db, it only performs the random function on the 2nd and 3rd record. any idea why it is happening?

Posted by on Monday February 17 2003, @6:03am [Delete] [Edit]

Jonny Fribergs idea with the MD5 works great! Thanks!

Add your own comment.

Top / / / Up / Table of Contents