![]() |
Functions for use in SELECT and WHERE clausesmanuale in linea |
GROUP BY
clauses
A select_expression
or where_definition
in a SQL statement can consist of any expression using the functions described below.
An expression that contains NULL
always produces a NULL
value unless otherwise indicated in the documentation for the operators and functions involved in the expression.
Note: There must be no whitespace between a function name and the parenthesis following it. This helps the MySQL parser distinguish between function calls and references to tables or columns that happen to have the same name as a function. Spaces around arguments are permitted, though.
For the sake of brevity, examples display the output from the mysql
program in abbreviated form. So this:
mysql> select MOD(29,9); 1 rows in set (0.00 sec) +-----------+ | mod(29,9) | +-----------+ | 2 | +-----------+
Is displayed like this:
mysql> select MOD(29,9); -> 2
( ... )
mysql> select 1+2*3; -> 7 mysql> select (1+2)*3; -> 9
The usual arithmetic operators are available. Note that in the case of -
, +
and *
, the result is calculated with BIGINT
(64-bit) precision if both arguments are integers!
+
mysql> select 3+5; -> 8
-
mysql> select 3-5; -> -2
*
mysql> select 3*5; -> 15 mysql> select 18014398509481984*18014398509481984.0; -> 324518553658426726783156020576256.0 mysql> select 18014398509481984*18014398509481984; -> 0The result of the last expression is incorrect because the result of the integer multiplication exceeds the 64-bit range of
BIGINT
calculations. /
mysql> select 3/5; -> 0.60Division by zero produces a
NULL
result: mysql> select 102/(1-1); -> NULLA division will be calculated with
BIGINT
arithmetic only if performed in a context where its result is converted to an integer!
MySQL uses BIGINT
(64-bit) arithmetic for bit operations, so these operators have a maximum range of 64 bits.
|
mysql> select 29 | 15; -> 31
&
mysql> select 29 & 15; -> 13
<<
BIGINT
) number to the left. mysql> select 1 << 2 -> 4
>>
BIGINT
) number to the right. mysql> select 4 >> 2 -> 1
~
mysql> select 5 & ~1 -> 4
BIT_COUNT(N)
N
. mysql> select BIT_COUNT(29); -> 4
All logical functions return 1
(TRUE) or 0
(FALSE).
NOT
!
1
if the argument is 0
, otherwise returns 0
. Exception: NOT NULL
returns NULL
. mysql> select NOT 1; -> 0 mysql> select NOT NULL; -> NULL mysql> select ! (1+1); -> 0 mysql> select ! 1+1; -> 1The last example returns
1
because the expression evaluates the same way as (!1)+1
. OR
||
1
if either argument is not 0
and not NULL
. mysql> select 1 || 0; -> 1 mysql> select 0 || 0; -> 0 mysql> select 1 || NULL; -> 1
AND
&&
0
if either argument is 0
or NULL
, otherwise returns 1
. mysql> select 1 && NULL; -> 0 mysql> select 1 && 0; -> 0
Comparison operations result in a value of 1
(TRUE), 0
(FALSE) or NULL
. These functions work for both numbers and strings. Strings are automatically converted to numbers and numbers to strings as needed (as in Perl).
MySQL performs comparisons using the following rules:
NULL
, the result of the comparison is NULL
, except for the <=>
operator. TIMESTAMP
or DATETIME
column and the other argument is a constant, the constant is converted to a timestamp before the comparison is performed. This is done to be more ODBC-friendly. By default, string comparisons are done in case-independent fashion using the current character set (ISO-8859-1 Latin1 by default, which also works excellently for English).
The examples below illustrate conversion of strings to numbers for comparison operations:
mysql> SELECT 1 > '6x'; -> 0 mysql> SELECT 7 > '6x'; -> 1 mysql> SELECT 0 > 'x6'; -> 0 mysql> SELECT 0 = 'x6'; -> 1
=
mysql> select 1 = 0; -> 0 mysql> select '0' = 0; -> 1 mysql> select '0.0' = 0; -> 1 mysql> select '0.01' = 0; -> 0 mysql> select '.01' = 0.01; -> 1
<>
!=
mysql> select '.01' <> '0.01'; -> 1 mysql> select .01 <> '0.01'; -> 0 mysql> select 'zapp' <> 'zappp'; -> 1
<=
mysql> select 0.1 <= 2; -> 1
<
mysql> select 2 <= 2; -> 1
>=
mysql> select 2 >= 2; -> 1
>
mysql> select 2 > 2; -> 0
<=>
mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1 1 0
IS NULL
IS NOT NULL
NULL
mysql> select 1 IS NULL, 0 IS NULL, NULL IS NULL: -> 0 0 1 mysql> select 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1 1 0
expr BETWEEN min AND max
expr
is greater than or equal to min
and expr
is less than or equal to max
, BETWEEN
returns 1
, otherwise it returns 0
. This is equivalent to the expression (min <= expr AND expr <= max)
if all the arguments are of the same type. The first argument (expr
) determines how the comparison is performed as follows: expr
is a TIMESTAMP
, DATE
or DATETIME
column, min and max are formatted to the same format if they are constants. expr
is a case-insensitive string expression, a case-insensitive string comparison is done. expr
is a case-sensitive string expression, a case-sensitive string comparison is done. expr
is an integer expression, an integer comparison is done. mysql> select 1 BETWEEN 2 AND 3; -> 0 mysql> select 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> select 2 BETWEEN 2 AND '3'; -> 1 mysql> select 2 BETWEEN 2 AND 'x-3'; -> 0
expr IN (value,...)
1
if expr
is any of the values in the IN
list, else returns 0
. If all values are constants, then all values are evaluated according to the type of expr
and sorted. The search for the item is then done using a binary search. This means IN
is very quick if the IN
value list consists entirely of constants. If expr
is a case-sensitive string expression, the string comparison is performed in case-sensitive fashion. mysql> select 2 IN (0,3,5,'wefwf'); -> 0 mysql> select 'wefwf' IN (0,3,5,'wefwf'); -> 1
expr NOT IN (value,...)
NOT (expr IN (value,...))
. ISNULL(expr)
expr
is NULL
, ISNULL()
returns 1
, otherwise it returns 0
. mysql> select ISNULL(1+1); -> 0 mysql> select ISNULL(1/0); -> 1Note that a comparison of
NULL
values using =
will always be false! COALESCE(list)
NULL
element in list. mysql> select COALESCE(NULL,1); -> 1 mysql> select COALESCE(NULL,NULL,NULL); -> NULL
INTERVAL(N,N1,N2,N3,...)
0
if N
< N1
, 1
if N
< N2
and so on. All arguments are treated as integers. It is required that N1
< N2
< N3
< ...
< Nn
for this function to work correctly. This is because a binary search is used (very fast). mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> select INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> select INTERVAL(22, 23, 30, 44, 200); -> 0
Normally, if any expression in a string comparison is case sensitive, the comparison is performed in case-sensitive fashion.
expr LIKE pat [ESCAPE 'escape-char']
1
(TRUE) or 0
(FALSE). With LIKE
you can use the following two wildcard characters in the pattern: % | Matches any number of characters, even zero characters |
_ | Matches exactly one character |
mysql> select 'David!' LIKE 'David_'; -> 1 mysql> select 'David!' LIKE '%D%v%'; -> 1To test for literal instances of a wildcard character, precede the character with the escape character. If you don't specify the
ESCAPE
character, `\' is assumed: \% | Matches one % character |
\_ | Matches one _ character |
mysql> select 'David!' LIKE 'David\_'; -> 0 mysql> select 'David_' LIKE 'David\_'; -> 1To specify a different escape character, use the
ESCAPE
clause: mysql> select 'David_' LIKE 'David|_' ESCAPE '|'; -> 1
LIKE
is allowed on numeric expressions! (This is a MySQL extension to the ANSI SQL LIKE
.) mysql> select 10 LIKE '1%'; -> 1Note: Because MySQL uses the C escape syntax in strings (e.g., `\n'), you must double any `\' that you use in your
LIKE
strings. For example, to search for `\n', specify it as `\\n'. To search for `\', specify it as `\\\\' (the backslashes are stripped once by the parser, and another time when the pattern match is done, leaving a single backslash to be matched). expr NOT LIKE pat [ESCAPE 'escape-char']
NOT (expr LIKE pat [ESCAPE 'escape-char'])
. expr REGEXP pat
expr RLIKE pat
expr
against a pattern pat
. The pattern can be an extended regular expression. See section I Description of MySQL regular expression syntax. Returns 1
if expr
matches pat
, otherwise returns 0
. RLIKE
is a synonym for REGEXP
, provided for mSQL
compatibility. Note: Because MySQL uses the C escape syntax in strings (e.g., `\n'), you must double any `\' that you use in your REGEXP
strings. In MySQL
3.23.4 REGEXP
is case insensitive for normal (not binary) strings. mysql> select 'Monty!' REGEXP 'm%y%%'; -> 0 mysql> select 'Monty!' REGEXP '.*'; -> 1 mysql> select 'new*\n*line' REGEXP 'new\\*.\\*line'; -> 1 mysql> select "a" REGEXP "A", "a" REGEXP BINARY "A"; -> 1 0
REGEXP
and RLIKE
use the current character set (ISO-8859-1 Latin1 by default) when deciding the type of a character. expr NOT REGEXP pat
expr NOT RLIKE pat
NOT (expr REGEXP pat)
. STRCMP(expr1,expr2)
STRCMP()
returns 0
if the strings are the same, -1
if the first argument is smaller than the second according to the current sort order, and 1
otherwise. mysql> select STRCMP('text', 'text2'); -> -1 mysql> select STRCMP('text2', 'text'); -> 1 mysql> select STRCMP('text', 'text'); -> 0
BINARY
BINARY
operator casts the string following it to a binary string. This is an easy way to force a column comparison to be case sensitive even if the column isn't defined as BINARY
or BLOB
. mysql> select "a" = "A"; -> 1 mysql> select BINARY "a" = "A"; -> 0
BINARY
was introduced in MySQL 3.23.0
IFNULL(expr1,expr2)
expr1
is not NULL
, IFNULL()
returns expr1
, else it returns expr2
. IFNULL()
returns a numeric or string value, depending on the context in which it is used. mysql> select IFNULL(1,0); -> 1 mysql> select IFNULL(0,10); -> 0 mysql> select IFNULL(1/0,10); -> 10 mysql> select IFNULL(1/0,'yes'); -> 'yes'
NULLIF(expr1,expr2)
expr1 = expr2
is true, return expr1
else return NULL
. mysql> select NULLIF(1,1); -> 1 mysql> select NULLIF(1,2); -> NULLNote that
expr1
is evaluated twice in MySQL if the arguments are equal. IF(expr1,expr2,expr3)
expr1
is TRUE (expr1 <> 0
and expr1 <> NULL
) then IF()
returns expr2
, else it returns expr3
. IF()
returns a numeric or string value, depending on the context in which it is used. mysql> select IF(1>2,2,3); -> 3 mysql> select IF(1<2,'yes','no'); -> 'yes' mysql> select IF(strcmp('test','test1'),'no','yes'); -> 'no'
expr1
is evaluated as an integer value, which means that if you are testing floating-point or string values, you should do so using a comparison operation. mysql> select IF(0.1,1,0); -> 0 mysql> select IF(0.1<>0,1,0); -> 1In the first case above,
IF(0.1)
returns 0
because 0.1
is converted to an integer value, resulting in a test of IF(0)
. This may not be what you expect. In the second case, the comparison tests the original floating-point value to see whether it is non-zero. The result of the comparison is used as an integer. The default return type of IF()
(which may matter when it stored into a temporary table) is calculated in MySQL 3.23 as follows: expr2 or expr3 returns string | string |
expr2 or expr3 returns a floating point value | floating point |
expr2 or expr3 returns an integer | integer |
CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
result
where value=compare-value
. The second version returns the result for the first condition which is true. If there was no matching result value, then the result after ELSE
is returned. If there is no ELSE
part then NULL
is returned. mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END; -> "one" mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END; -> "true" mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END; -> NULL
All mathematical functions return NULL
in case of an error.
-
mysql> select - 2; -> -2Note that if this operator is used with a
BIGINT
, the return value is a BIGINT
! This means that you should avoid using -
on integers that may have the value of -2^63
! ABS(X)
X
. mysql> select ABS(2); -> 2 mysql> select ABS(-32); -> 32This function is safe to use with
BIGINT
values. SIGN(X)
-1
, 0
or 1
, depending on whether X
is negative, zero, or positive. mysql> select SIGN(-32); -> -1 mysql> select SIGN(0); -> 0 mysql> select SIGN(234); -> 1
MOD(N,M)
%
%
operator in C). Returns the remainder of N
divided by M
. mysql> select MOD(234, 10); -> 4 mysql> select 253 % 7; -> 1 mysql> select MOD(29,9); -> 2This function is safe to use with
BIGINT
values. FLOOR(X)
X
. mysql> select FLOOR(1.23); -> 1 mysql> select FLOOR(-1.23); -> -2Note that the return value is converted to a
BIGINT
! CEILING(X)
X
. mysql> select CEILING(1.23); -> 2 mysql> select CEILING(-1.23); -> -1Note that the return value is converted to a
BIGINT
! ROUND(X)
X
, rounded to the nearest integer. mysql> select ROUND(-1.23); -> -1 mysql> select ROUND(-1.58); -> -2 mysql> select ROUND(1.58); -> 2
ROUND(X,D)
X
, rounded to a number with D
decimals. If D
is 0
, the result will have no decimal point or fractional part. mysql> select ROUND(1.298, 1); -> 1.3 mysql> select ROUND(1.298, 0); -> 1
EXP(X)
e
(the base of natural logarithms) raised to the power of 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); -> NULLIf you want the log of a number
X
to some arbitary base B
, use the formula 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
raised to the power of 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()
mysql> select PI(); -> 3.141593
COS(X)
X
, where X
is given in radians. mysql> select COS(PI()); -> -1.000000
SIN(X)
X
, where X
is given in radians. mysql> select SIN(PI()); -> 0.000000
TAN(X)
X
, where X
is given in radians. mysql> select TAN(PI()+1); -> 1.557408
ACOS(X)
X
, that is, the value whose cosine is X
. Returns NULL
if X
is not in the range -1
to 1
. mysql> select ACOS(1); -> 0.000000 mysql> select ACOS(1.0001); -> NULL mysql> select ACOS(0); -> 1.570796
ASIN(X)
X
, that is, the value whose sine is X
. Returns NULL
if X
is not in the range -1
to 1
. mysql> select ASIN(0.2); -> 0.201358 mysql> select ASIN('foo'); -> 0.000000
ATAN(X)
X
, that is, the value whose tangent is X
. mysql> select ATAN(2); -> 1.107149 mysql> select ATAN(-2); -> -1.107149
ATAN2(X,Y)
X
and Y
. It is similar to calculating the arc tangent of Y / X
, except that the signs of both arguments are used to determine the quadrant of the result. mysql> select ATAN(-2,2); -> -0.785398 mysql> select ATAN(PI(),0); -> 1.570796
COT(X)
X
. mysql> select COT(12); -> -1.57267341 mysql> select COT(0); -> NULL
RAND()
RAND(N)
0
to 1.0
. If an integer argument N
is specified, it is used as the seed value. mysql> select RAND(); -> 0.5925 mysql> select RAND(20); -> 0.1811 mysql> select RAND(20); -> 0.1811 mysql> select RAND(); -> 0.2079 mysql> select RAND(); -> 0.7888You can't use a column with
RAND()
values in an ORDER BY
clause, because ORDER BY
would evaluate the column multiple times. In MySQL 3.23, you can however do: SELECT * FROM table_name ORDER BY RAND()
This is useful to get a random sample of a set SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000
. Note that a RAND()
in a WHERE
clause will be re-evaluated every time the WHERE
is executed. LEAST(X,Y,...)
INTEGER
context, or all arguments are integer-valued, they are compared as integers. REAL
context, or all arguments are real-valued, they are compared as reals. 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"In MySQL versions prior to 3.22.5, you can use
MIN()
instead of 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"In MySQL versions prior to 3.22.5, you can use
MAX()
instead of GREATEST
. DEGREES(X)
X
, converted from radians to degrees. mysql> select DEGREES(PI()); -> 180.000000
RADIANS(X)
X
, converted from degrees to radians. mysql> select RADIANS(90); -> 1.570796
TRUNCATE(X,D)
X
, truncated to D
decimals. If D
is 0
, the result will have no decimal point or fractional part. mysql> select TRUNCATE(1.223,1); -> 1.2 mysql> select TRUNCATE(1.999,1); -> 1.9 mysql> select TRUNCATE(1.999,0); -> 1
String-valued functions return NULL
if the length of the result would be greater than the max_allowed_packet
server parameter. See section 12.2.3 Tuning server parameters.
For functions that operate on string positions, the first position is numbered 1.
ASCII(str)
str
. Returns 0
if str
is the empty string. Returns NULL
if str
is NULL
. mysql> select ASCII('2'); -> 50 mysql> select ASCII(2); -> 50 mysql> select ASCII('dx'); -> 100See also the
ORD()
function. ORD(str)
((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]
. If the leftmost character is not a multi-byte character, returns the same value as the like ASCII()
function does. mysql> select ORD('2'); -> 50
CONV(N,from_base,to_base)
N
, converted from base from_base
to base to_base
. Returns NULL
if any argument is NULL
. The argument N
is interpreted as an integer, but may be specified as an integer or a string. The minimum base is 2
and the maximum base is 36
. If to_base
is a negative number, N
is regarded as a signed number. Otherwise, N
is treated as unsigned. CONV
works with 64-bit precision. mysql> select CONV("a",16,2); -> '1010' mysql> select CONV("6E",18,8); -> '172' mysql> select CONV(-17,10,-18); -> '-H' mysql> select CONV(10+"10"+'10'+0xa,10,10); -> '40'
BIN(N)
N
, where N
is a longlong (BIGINT
) number. This is equivalent to CONV(N,10,2)
. Returns NULL
if N
is NULL
. mysql> select BIN(12); -> '1100'
OCT(N)
N
, where N
is a longlong number. This is equivalent to CONV(N,10,8)
. Returns NULL
if N
is NULL
. mysql> select OCT(12); -> '14'
HEX(N)
N
, where N
is a longlong (BIGINT
) number. This is equivalent to CONV(N,10,16)
. Returns NULL
if N
is NULL
. mysql> select HEX(255); -> 'FF'
CHAR(N,...)
CHAR()
interprets the arguments as integers and returns a string consisting of the characters given by the ASCII code values of those integers. NULL
values are skipped. mysql> select CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> select CHAR(77,77.3,'77.3'); -> 'MMM'
CONCAT(str1,str2,...)
NULL
if any argument is NULL
. May have more than 2 arguments. A numeric argument is converted to the equivalent string form. mysql> select CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> select CONCAT('My', NULL, 'QL'); -> NULL mysql> select CONCAT(14.3); -> '14.3'
CONCAT_WS(separator, str1, str2,...)
CONCAT_WS()
stands for CONCAT With Separator and is a special form of CONCAT()
. The irst argument is the separator for the rest of the arguments. The separator can be a string as well as the rest of the arguments. If the separator is NULL
, the result will be NULL
. The function will skip any NULL
s and empty strings, after the separator argument. The separator will be added between the strings to be concatenated. mysql> select CONCAT_WS(",","First name","Second name","Last Name"); -> 'First name,Second name,Last Name' mysql> select CONCAT_WS(",","First name",NULL,"Last Name"); -> 'First name,Last Name'
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)
str
. mysql> select LENGTH('text'); -> 4 mysql> select OCTET_LENGTH('text'); -> 4Note that for
CHAR_LENGTH()
, multi-byte characters are only counted once. LOCATE(substr,str)
POSITION(substr IN str)
substr
in string str
. Returns 0
if substr
is not in str
. mysql> select LOCATE('bar', 'foobarbar'); -> 4 mysql> select LOCATE('xbar', 'foobar'); -> 0This function is multi-byte safe.
LOCATE(substr,str,pos)
substr
in string str
, starting at position pos
. Returns 0
if substr
is not in str
. mysql> select LOCATE('bar', 'foobarbar',5); -> 7This function is multi-byte safe.
INSTR(str,substr)
substr
in string str
. This is the same as the two-argument form of LOCATE()
, except that the arguments are swapped. mysql> select INSTR('foobarbar', 'bar'); -> 4 mysql> select INSTR('xbar', 'foobar'); -> 0This function is multi-byte safe.
LPAD(str,len,padstr)
str
, left-padded with the string padstr
until str
is len
characters long. mysql> select LPAD('hi',4,'??'); -> '??hi'
RPAD(str,len,padstr)
str
, right-padded with the string padstr
until str
is len
characters long. mysql> select RPAD('hi',5,'?'); -> 'hi???'
LEFT(str,len)
len
characters from the string str
. mysql> select LEFT('foobarbar', 5); -> 'fooba'This function is multi-byte safe.
RIGHT(str,len)
len
characters from the string str
. mysql> select RIGHT('foobarbar', 4); -> 'rbar'This function is multi-byte safe.
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
len
characters long from string str
, starting at position pos
. The variant form that uses FROM
is ANSI SQL92 syntax. mysql> select SUBSTRING('Quadratically',5,6); -> 'ratica'This function is multi-byte safe.
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
str
starting at position pos
. mysql> select SUBSTRING('Quadratically',5); -> 'ratically' mysql> select SUBSTRING('foobarbar' FROM 4); -> 'barbar'This function is multi-byte safe.
SUBSTRING_INDEX(str,delim,count)
str
before count
occurrences of the delimiter delim
. If count
is positive, everything to the left of the final delimiter (counting from the left) is returned. If count
is negative, everything to the right of the final delimiter (counting from the right) is returned. mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com'This function is multi-byte safe.
LTRIM(str)
str
with leading space characters removed. mysql> select LTRIM(' barbar'); -> 'barbar'
RTRIM(str)
str
with trailing space characters removed. mysql> select RTRIM('barbar '); -> 'barbar'This function is multi-byte safe.
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
str
with all remstr
prefixes and/or suffixes removed. If none of the specifiers BOTH
, LEADING
or TRAILING
are given, BOTH
is assumed. If remstr
is not specified, spaces are removed. mysql> select TRIM(' bar '); -> 'bar' mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx'); -> 'barxxx' mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx'); -> 'bar' mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz'); -> 'barx'This function is multi-byte safe.
SOUNDEX(str)
str
. Two strings that sound ``about the same'' should have identical soundex strings. A ``standard'' soundex string is 4 characters long, but the SOUNDEX()
function returns an arbitrarily long string. You can use SUBSTRING()
on the result to get a ``standard'' soundex string. All non-alphanumeric characters are ignored in the given string. All international alpha characters outside the A-Z range are treated as vowels. mysql> select SOUNDEX('Hello'); -> 'H400' mysql> select SOUNDEX('Quadratically'); -> 'Q36324'
SPACE(N)
N
space characters. mysql> select SPACE(6); -> ' '
REPLACE(str,from_str,to_str)
str
with all all occurrences of the string from_str
replaced by the string to_str
. mysql> select REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com'This function is multi-byte safe.
REPEAT(str,count)
str
repeated count
times. If count <= 0
, returns an empty string. Returns NULL
if str
or count
are NULL
. mysql> select REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
REVERSE(str)
str
with the order of the characters reversed. mysql> select REVERSE('abc'); -> 'cba'This function is multi-byte safe.
INSERT(str,pos,len,newstr)
str
, with the substring beginning at position pos
and len
characters long replaced by the string newstr
. mysql> select INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic'This function is multi-byte safe.
ELT(N,str1,str2,str3,...)
str1
if N
= 1
, str2
if N
= 2
, and so on. Returns NULL
if N
is less than 1
or greater than the number of arguments. ELT()
is the complement of FIELD()
. mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo'); -> 'ej' mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo'); -> 'foo'
FIELD(str,str1,str2,str3,...)
str
in the str1
, str2
, str3
, ...
list. Returns 0
if str
is not found. FIELD()
is the complement of ELT()
. mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 2 mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 0
FIND_IN_SET(str,strlist)
1
to N
if the string str
is in the list strlist
consisting of N
substrings. A string list is a string composed of substrings separated by `,' characters. If the first argument is a constant string and the second is a column of type SET
, the FIND_IN_SET()
function is optimized to use bit arithmetic! Returns 0
if str
is not in strlist
or if strlist
is the empty string. Returns NULL
if either argument is NULL
. This function will not work properly if the first argument contains a `,'. mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
MAKE_SET(bits,str1,str2,...)
bits
set. str1
corresponds to bit 0, str2
to bit 1, etc. NULL
strings in str1
, str2
, ...
are not appended to the result. mysql> SELECT MAKE_SET(1,'a','b','c'); -> 'a' mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); -> 'hello,world' mysql> SELECT MAKE_SET(0,'a','b','c'); -> ''
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
mysql> select EXPORT_SET(5,'Y','N',',',4) -> Y,N,Y,N
LCASE(str)
LOWER(str)
str
with all characters changed to lowercase according to the current character set mapping (the default is ISO-8859-1 Latin1). This function is multi-byte safe. mysql> select LCASE('QUADRATICALLY'); -> 'quadratically'
UCASE(str)
UPPER(str)
str
with all characters changed to uppercase according to the current character set mapping (the default is ISO-8859-1 Latin1). mysql> select UCASE('Hej'); -> 'HEJ'This function is multi-byte safe.
LOAD_FILE(file_name)
max_allowed_packet
. If the file doesn't exist or can't be read due to one of the above reasons, the function returns NULL
. mysql> UPDATE table_name SET blob_column=LOAD_FILE("/tmp/picture") WHERE id=1;
MySQL automatically converts numbers to strings as necessary, and vice versa:
mysql> SELECT 1+"1"; -> 2 mysql> SELECT CONCAT(2,' test'); -> '2 test'
If you want to convert a number to a string explicitly, pass it as the argument to CONCAT()
.
If a string function is given a binary string as an argument, the resulting string is also a binary string. A number converted to a string is treated as a binary string. This only affects comparisons.
See section 7.3.6 Date and time types for a description of the range of values each type has, and the valid formats in which date and time values may be specified.
Here is an example that uses date functions. The query below selects all records with a date_col
value from within the last 30 days:
mysql> SELECT something FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
DAYOFWEEK(date)
date
(1
= Sunday, 2
= Monday, ... 7
= Saturday). These index values correspond to the ODBC standard. mysql> select DAYOFWEEK('1998-02-03'); -> 3
WEEKDAY(date)
date
(0
= Monday, 1
= Tuesday, ... 6
= Sunday). mysql> select WEEKDAY('1997-10-04 22:23:00'); -> 5 mysql> select WEEKDAY('1997-11-05'); -> 2
DAYOFMONTH(date)
date
, in the range 1
to 31
. mysql> select DAYOFMONTH('1998-02-03'); -> 3
DAYOFYEAR(date)
date
, in the range 1
to 366
. mysql> select DAYOFYEAR('1998-02-03'); -> 34
MONTH(date)
date
, in the range 1
to 12
. mysql> select MONTH('1998-02-03'); -> 2
DAYNAME(date)
date
. mysql> select DAYNAME("1998-02-05"); -> 'Thursday'
MONTHNAME(date)
date
. mysql> select MONTHNAME("1998-02-05"); -> 'February'
QUARTER(date)
date
, in the range 1
to 4
. mysql> select QUARTER('98-04-01'); -> 2
WEEK(date)
WEEK(date,first)
date
, in the range 0
to 53
(yes, there may be the beginnings of a week 53), for locations where Sunday is the first day of the week. The two-argument form of WEEK()
allows you to specify whether the week starts on Sunday or Monday. The week starts on Sunday if the second argument is 0
, on Monday if the second argument is 1
. mysql> select WEEK('1998-02-20'); -> 7 mysql> select WEEK('1998-02-20',0); -> 7 mysql> select WEEK('1998-02-20',1); -> 8 mysql> select WEEK('1998-12-31',1); -> 53
YEAR(date)
date
, in the range 1000
to 9999
. mysql> select YEAR('98-02-03'); -> 1998
YEARWEEK(date)
YEARWEEK(date,first)
WEEK()
. Note that the year may be different from the year in the date argument for the first and the last week of the year! mysql> select YEARWEEK('1987-01-01'); -> 198653
HOUR(time)
time
, in the range 0
to 23
. mysql> select HOUR('10:05:03'); -> 10
MINUTE(time)
time
, in the range 0
to 59
. mysql> select MINUTE('98-02-03 10:05:03'); -> 5
SECOND(time)
time
, in the range 0
to 59
. mysql> select SECOND('10:05:03'); -> 3
PERIOD_ADD(P,N)
N
months to period P
(in the format YYMM
or YYYYMM
). Returns a value in the format YYYYMM
. Note that the period argument P
is not a date value. mysql> select PERIOD_ADD(9801,2); -> 199803
PERIOD_DIFF(P1,P2)
P1
and P2
. P1
and P2
should be in the format YYMM
or YYYYMM
. Note that the period arguments P1
and P2
are not date values. mysql> select PERIOD_DIFF(9802,199703); -> 11
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
ADDDATE()
and SUBDATE()
are synonyms for DATE_ADD()
and DATE_SUB()
. In MySQL 3.23, you can use +
and -
instead of DATE_ADD()
and DATE_SUB()
. (See example) date
is a DATETIME
or DATE
value specifying the starting date. expr
is an expression specifying the interval value to be added or substracted from the starting date. expr
is a string; it may start with a `-' for negative intervals. type
is a keyword indicating how the expression should be interpreted. The EXTRACT(type FROM date)
function returns the 'type' interval from the date. The following table shows how the type
and expr
arguments are related: type value | Meaning | Expected expr format |
SECOND | Seconds | SECONDS |
MINUTE | Minutes | MINUTES |
HOUR | Hours | HOURS |
DAY | Days | DAYS |
MONTH | Months | MONTHS |
YEAR | Years | YEARS |
MINUTE_SECOND | Minutes and seconds | "MINUTES:SECONDS" |
HOUR_MINUTE | Hours and minutes | "HOURS:MINUTES" |
DAY_HOUR | Days and hours | "DAYS HOURS" |
YEAR_MONTH | Years and months | "YEARS-MONTHS" |
HOUR_SECOND | Hours, minutes, | "HOURS:MINUTES:SECONDS" |
DAY_MINUTE | Days, hours, minutes | "DAYS HOURS:MINUTES" |
DAY_SECOND | Days, hours, minutes, seconds | "DAYS HOURS:MINUTES:SECONDS" |
expr
format. The ones shown in the table are the suggested delimiters. If the date
argument is a DATE
value and your calculations involve only YEAR
, MONTH
and DAY
parts (that is, no time parts), the result is a DATE
value. Otherwise the result is a DATETIME
value. mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; -> 1998-01-01 00:00:00 mysql> SELECT INTERVAL 1 DAY + "1997-12-31"; -> 1998-01-01 mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND; -> 1997-12-31 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 SECOND); -> 1998-01-01 00:00:00 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 DAY); -> 1998-01-01 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND); -> 1998-01-01 00:01:00 mysql> SELECT DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND); -> 1997-12-30 22:58:59 mysql> SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR); -> 1997-12-30 14:00:00 mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); -> 1997-12-02 mysql> SELECT EXTRACT(YEAR FROM "1999-07-02"); -> 1999 mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); -> 20102If you specify an interval value that is too short (does not include all the interval parts that would be expected from the
type
keyword), MySQL assumes you have left out the leftmost parts of the interval value. For example, if you specify a type
of DAY_SECOND
, the value of expr
is expected to have days, hours, minutes and seconds parts. If you specify a value like "1:10"
, MySQL assumes that the days and hours parts are missing and the value represents minutes and seconds. In other words, "1:10" DAY_SECOND
is interpreted in such a way that it is equivalent to "1:10" MINUTE_SECOND
. This is analogous to the way that MySQL interprets TIME
values as representing elapsed time rather than as time of day. If you use really incorrect dates, the result is NULL
. If you add MONTH
, YEAR_MONTH
or YEAR
and the resulting date has a day that is larger than the maximum day for the new month, the day is adjusted to the maximum days in the new month. mysql> select DATE_ADD('1998-01-30', Interval 1 month); -> 1998-02-28Note from the preceding example that the word
INTERVAL
and the type
keyword are not case sensitive. TO_DAYS(date)
date
, returns a daynumber (the number of days since year 0). mysql> select TO_DAYS(950501); -> 728779 mysql> select TO_DAYS('1997-10-07'); -> 729669
TO_DAYS()
is not intended for use with values that precede the advent of the Gregorian calendar (1582), because it doesn't take into account the days that were lost when the calender was changed. FROM_DAYS(N)
N
, returns a DATE
value. mysql> select FROM_DAYS(729669); -> '1997-10-07'
FROM_DAYS()
is not intended for use with values that precede the advent of the Gregorian calendar (1582), because it doesn't take into account the days that were lost when the calender was changed. DATE_FORMAT(date,format)
date
value according to the format
string. The following specifiers may be used in the format
string: %M | Month name (January ..December ) |
%W | Weekday name (Sunday ..Saturday ) |
%D | Day of the month with english suffix (1st , 2nd , 3rd , etc.) |
%Y | Year, numeric, 4 digits |
%y | Year, numeric, 2 digits |
%X | Year for the week where Sunday is the first day of the week, numeric, 4 digits, used with '%V' |
%x | Year for the week, where Monday is the first day of the week, numeric, 4 digits, used with '%v' |
%a | Abbreviated weekday name (Sun ..Sat ) |
%d | Day of the month, numeric (00 ..31 ) |
%e | Day of the month, numeric (0 ..31 ) |
%m | Month, numeric (01 ..12 ) |
%c | Month, numeric (1 ..12 ) |
%b | Abbreviated month name (Jan ..Dec ) |
%j | Day of year (001 ..366 ) |
%H | Hour (00 ..23 ) |
%k | Hour (0 ..23 ) |
%h | Hour (01 ..12 ) |
%I | Hour (01 ..12 ) |
%l | Hour (1 ..12 ) |
%i | Minutes, numeric (00 ..59 ) |
%r | Time, 12-hour (hh:mm:ss [AP]M ) |
%T | Time, 24-hour (hh:mm:ss ) |
%S | Seconds (00 ..59 ) |
%s | Seconds (00 ..59 ) |
%p | AM or PM |
%w | Day of the week (0 =Sunday..6 =Saturday) |
%U | Week (0 ..53 ), where Sunday is the first day of the week |
%u | Week (0 ..53 ), where Monday is the first day of the week |
%V | Week (1 ..53 ), where Sunday is the first day of the week. Used with '%X' |
%v | Week (1 ..53 ), where Monday is the first day of the week. Used with '%x' |
%% | A literal `%'. |
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); -> 'Saturday October 1997' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j'); -> '4th 97 Sat 04 10 Oct 277' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> select DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52'As of MySQL 3.23, the
%
character is required before format specifier characters. In earlier versions of MySQL, %
was optional. TIME_FORMAT(time,format)
DATE_FORMAT()
function above, but the format
string may contain only those format specifiers that handle hours, minutes and seconds. Other specifiers produce a NULL
value or 0
. CURDATE()
CURRENT_DATE
'YYYY-MM-DD'
or YYYYMMDD
format, depending on whether the function is used in a string or numeric context. mysql> select CURDATE(); -> '1997-12-15' mysql> select CURDATE() + 0; -> 19971215
CURTIME()
CURRENT_TIME
'HH:MM:SS'
or HHMMSS
format, depending on whether the function is used in a string or numeric context. mysql> select CURTIME(); -> '23:50:26' mysql> select CURTIME() + 0; -> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
'YYYY-MM-DD HH:MM:SS'
or YYYYMMDDHHMMSS
format, depending on whether the function is used in a string or numeric context. mysql> select NOW(); -> '1997-12-15 23:50:26' mysql> select NOW() + 0; -> 19971215235026
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)
'1970-01-01 00:00:00'
GMT). If UNIX_TIMESTAMP()
is called with a date
argument, it returns the value of the argument as seconds since '1970-01-01 00:00:00'
GMT. date
may be a DATE
string, a DATETIME
string, a TIMESTAMP
, or a number in the format YYMMDD
or YYYYMMDD
in local time. mysql> select UNIX_TIMESTAMP(); -> 882226357 mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580When
UNIX_TIMESTAMP
is used on a TIMESTAMP
column, the function will receive the value directly, with no implicit ``string-to-unix-timestamp'' conversion. FROM_UNIXTIME(unix_timestamp)
unix_timestamp
argument as a value in 'YYYY-MM-DD HH:MM:SS'
or YYYYMMDDHHMMSS
format, depending on whether the function is used in a string or numeric context. mysql> select FROM_UNIXTIME(875996580); -> '1997-10-04 22:23:00' mysql> select FROM_UNIXTIME(875996580) + 0; -> 19971004222300
FROM_UNIXTIME(unix_timestamp,format)
format
string. format
may contain the same specifiers as those listed in the entry for the DATE_FORMAT()
function. mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x'); -> '1997 23rd December 03:43:30 x'
SEC_TO_TIME(seconds)
seconds
argument, converted to hours, minutes and seconds, as a value in 'HH:MM:SS'
or HHMMSS
format, depending on whether the function is used in a string or numeric context. mysql> select SEC_TO_TIME(2378); -> '00:39:38' mysql> select SEC_TO_TIME(2378) + 0; -> 3938
TIME_TO_SEC(time)
time
argument, converted to seconds. mysql> select TIME_TO_SEC('22:23:00'); -> 80580 mysql> select TIME_TO_SEC('00:39:38'); -> 2378
DATABASE()
mysql> select DATABASE(); -> 'test'If there is no current database,
DATABASE()
returns the empty string. USER()
SYSTEM_USER()
SESSION_USER()
mysql> select USER(); -> 'davida@localhost'In MySQL 3.22.11 or later, this includes the client hostname as well as the user name. You can extract just the user name part like this (which works whether or not the value includes a hostname part):
mysql> select substring_index(USER(),"@",1); -> 'davida'
PASSWORD(str)
str
. This is the function that is used for encrypting MySQL passwords for storage in the Password
column of the user
grant table. mysql> select PASSWORD('badpwd'); -> '7f84554057dd964b'
PASSWORD()
encryption is non-reversible. PASSWORD()
does not perform password encryption in the same way that Unix passwords are encrypted. You should not assume that if your Unix password and your MySQL password are the same, PASSWORD()
will result in the same encrypted value as is stored in the Unix password file. See ENCRYPT()
. ENCRYPT(str[,salt])
str
using the Unix crypt()
system call. The salt
argument should be a string with two characters. (As of MySQL 3.22.16, salt
may be longer than two characters.) mysql> select ENCRYPT("hello"); -> 'VxuFAJXVARROc'If
crypt()
is not available on your system, ENCRYPT()
always returns NULL
. ENCRYPT()
ignores all but the first 8 characters of str
, at least on some systems. This will be determined by the behavior of the underlying crypt()
system call. ENCODE(str,pass_str)
str
using pass_str
as the password. To decrypt the result, use DECODE()
. The results is a binary string. If you want to save it in a column, use a BLOB
column type. DECODE(crypt_str,pass_str)
crypt_str
using pass_str
as the password. crypt_str
should be a string returned from ENCODE()
. MD5(string)
mysql> select MD5("testing") -> 'ae2b1fca515949e5d54fb22b8ed95575'This is an "RSA Data Security, Inc. MD5 Message-Digest Algorithm".
LAST_INSERT_ID([expr])
AUTO_INCREMENT
column. See section 22.4.29 mysql_insert_id()
. mysql> select LAST_INSERT_ID(); -> 195The last ID that was generated is maintained in the server on a per-connection basis. It will not be changed by another client. It will not even be changed if you update another
AUTO_INCREMENT
column with a non-magic value (that is, a value that is not NULL
and not 0
). If expr
is given as an argument to LAST_INSERT_ID()
in an UPDATE
clause, then the value of the argument is returned as a LAST_INSERT_ID()
value. This can be used to simulate sequences: First create the table: mysql> create table sequence (id int not null); mysql> insert into sequence values (0);Then the table can be used to generate sequence numbers like this:
mysql> update sequence set id=LAST_INSERT_ID(id+1);You can generate sequences without calling
LAST_INSERT_ID()
, but the utility of using the function this way is that the ID value is maintained in the server as the last automatically generated value. You can retrieve the new ID as you would read any normal AUTO_INCREMENT
value in MySQL. For example, LAST_INSERT_ID()
(without an argument) will return the new ID. The C API function mysql_insert_id()
can also be used to get the value. FORMAT(X,D)
X
to a format like '#,###,###.##'
, rounded to D
decimals. If D
is 0
, the result will have no decimal point or fractional part. mysql> select FORMAT(12332.123456, 4); -> '12,332.1235' mysql> select FORMAT(12332.1,4); -> '12,332.1000' mysql> select FORMAT(12332.2,0); -> '12,332'
VERSION()
mysql> select VERSION(); -> '3.23.13-log'Note that if your version ends with
-log
this means that logging is enabled. CONNECTION_ID()
thread_id
) for the connection. Every connection has its own unique id. mysql> select CONNECTION_ID(); -> 1
GET_LOCK(str,timeout)
str
, with a timeout of timeout
seconds. Returns 1
if the lock was obtained successfully, 0
if the attempt timed out, or NULL
if an error occurred (such as running out of memory or the thread was killed with mysqladmin kill
). A lock is released when you execute RELEASE_LOCK()
, execute a new GET_LOCK()
or the thread terminates. This function can be used to implement application locks or to simulate record locks. It blocks requests by other clients for locks with the same name; clients that agree on a given lock string name can use the string to perform cooperative advisory locking. mysql> select GET_LOCK("lock1",10); -> 1 mysql> select GET_LOCK("lock2",10); -> 1 mysql> select RELEASE_LOCK("lock2"); -> 1 mysql> select RELEASE_LOCK("lock1"); -> NULLNote that the second
RELEASE_LOCK()
call returns NULL
because the lock "lock1"
was automatically released by the second GET_LOCK()
call. RELEASE_LOCK(str)
str
that was obtained with GET_LOCK()
. Returns 1
if the lock was released, 0
if the lock wasn't locked by this thread (in which case the lock is not released) and NULL
if the named lock didn't exist. The lock will not exist if it was never obtained by a call to GET_LOCK()
or if it already has been released. BENCHMARK(count,expr)
BENCHMARK()
function executes the expression expr
repeatedly count
times. It may be used to time how fast MySQL processes the expression. The result value is always 0
. The intended use is in the mysql
client, which reports query execution times. mysql> select BENCHMARK(1000000,encode("hello","goodbye")); +----------------------------------------------+ | BENCHMARK(1000000,encode("hello","goodbye")) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1 row in set (4.74 sec)The time reported is elapsed time on the client end, not CPU time on the server end. It may be advisable to execute
BENCHMARK()
several times, and interpret the result with regard to how heavily loaded the server machine is. INET_NTOA(expr)
mysql> select INET_NTOA(3520061480); -> "209.207.224.40"
INET_NTOA(expr)
mysql> select INET_ATON("209.207.224.40"); -> 3520061480
GROUP BY
clauses
If you use a group function in a statement containing no GROUP BY
clause, it is equivalent to grouping on all rows.
COUNT(expr)
NULL
values in the rows retrieved by a SELECT
statement. mysql> select student.student_name,COUNT(*) from student,course where student.student_id=course.student_id GROUP BY student_name;
COUNT(*)
is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL
values. COUNT(*)
is optimized to return very quickly if the SELECT
retrieves from one table, no other columns are retrieved and there is no WHERE
clause. For example: mysql> select COUNT(*) from student;
COUNT(DISTINCT expr,[expr...])
mysql> select COUNT(DISTINCT results) from student;In MySQL you can get the number of distinct expressions combinations by giving a list of expressions. In ANSI SQL you would have to do a concatenation of all expressions inside
CODE(DISTINCT ..)
. AVG(expr)
expr
. mysql> select student_name, AVG(test_score) from student GROUP BY student_name;
MIN(expr)
MAX(expr)
expr
. MIN()
and MAX()
may take a string argument; in such cases they return the minimum or maximum string value. mysql> select student_name, MIN(test_score), MAX(test_score) from student GROUP BY student_name;
SUM(expr)
expr
. Note that if the return set has no rows, it returns NULL! STD(expr)
STDDEV(expr)
expr
. This is an extension to ANSI SQL. The STDDEV()
form of this function is provided for Oracle compatability. BIT_OR(expr)
OR
of all bits in expr
. The calculation is performed with 64-bit (BIGINT
precision. BIT_AND(expr)
AND
of all bits in expr
. The calculation is performed with 64-bit (BIGINT
precision. MySQL has extended the use of GROUP BY
. You can use columns or calculations in the SELECT
expressions which don't appear in the GROUP BY
part. This stands for any possible value for this group. You can use this to get better performance by avoiding sorting and grouping on unnecessary items. For example, you don't need to group on customer.name
in the following query:
mysql> select order.custid,customer.name,max(payments) from order,customer where order.custid = customer.custid GROUP BY order.custid;
In ANSI SQL, you would have to add customer.name
to the GROUP BY
clause. In MySQL, the name is redundant if you don't run in ANSI mode.
Don't use this feature if the columns you omit from the GROUP BY
part aren't unique in the group!
In some cases, you can use MIN()
and MAX()
to obtain a specific column value even if it isn't unique. The following gives the value of column
from the row containing the smallest value in the sort
column:
substr(MIN(concat(sort,space(6-length(sort)),column),7,length(column)))
Note that if you are using MySQL 3.22 (or earlier) or if you are trying to follow ANSI SQL, you can't use expressions in GROUP BY
or ORDER BY
clauses. You can work around this limitation by using an alias for the expression:
mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name GROUP BY id,val ORDER BY val;
In MySQL
3.23 you can do:
mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();