Mysql函数手册

来源:互联网 发布:mac常用快捷键 编辑:程序博客网 时间:2024/06/05 17:09

Mysql函数手册

日期函数:

一、MySQL 获得当前日期时间 函数

1.1 获得当前日期+时间(date + time)函数:now()

 

mysql> select now();

 

+---------------------+

| now() |

+---------------------+

| 2017-2-28 22:20:46 |

+---------------------+

 

除了 now() 函数能获得当前的日期时间外,MySQL中还有下面的函数:

 

current_timestamp()

,current_timestamp

,localtime()

,localtime

,localtimestamp -- (v4.0.6)

,localtimestamp() -- (v4.0.6)

 

这些日期时间函数,都等同于 now()。鉴于now() 函数简短易记,建议总是使用now() 来替代上面列出的函数。

 

1.2 获得当前日期+时间(date + time)函数:sysdate()

 

sysdate() 日期时间函数跟 now()类似,不同之处在于:now()在执行开始时值就得到了, sysdate()在函数执行时动态得到值。看下面的例子就明白了:

 

mysql> select now(), sleep(3), now();

 

+---------------------+----------+---------------------+

| now() | sleep(3) | now() |

+---------------------+----------+---------------------+

| 2017-2-28 22:28:21 | 0 | 2017-2-28 22:28:21 |

+---------------------+----------+---------------------+

mysql> select sysdate(), sleep(3), sysdate();

 

+---------------------+----------+---------------------+

| sysdate() | sleep(3) | sysdate() |

+---------------------+----------+---------------------+

| 2017-2-28 22:28:41 | 0 | 2017-2-28 22:28:44 |

+---------------------+----------+---------------------+

 

可以看到,虽然中途 sleep 3 秒,但 now() 函数两次的时间值是相同的;sysdate() 函数两次得到的时间值相差3 秒。MySQL Manual中是这样描述 sysdate()的:Return the time at which the function executes

 

sysdate() 日期时间函数,一般情况下很少用到。

 

2. 获得当前日期(date)函数:curdate()

 

mysql> select curdate();

 

+------------+

| curdate() |

+------------+

| 2017-2-28 |

+------------+

 

其中,下面的两个日期函数等同于 curdate()

 

current_date()

,current_date

 

3. 获得当前时间(time)函数:curtime()

 

mysql> select curtime();

 

+-----------+

| curtime() |

+-----------+

| 22:41:30 |

+-----------+

 

其中,下面的两个时间函数等同于 curtime()

 

current_time()

,current_time

 

4. 获得当前 UTC日期时间函数:utc_date(), utc_time(), utc_timestamp()

 

mysql> select utc_timestamp(), utc_date(), utc_time(), now()

 

+---------------------+------------+------------+---------------------+

| utc_timestamp() | utc_date() | utc_time() | now() |

+---------------------+------------+------------+---------------------+

| 2017-2-28 14:47:11 | 2017-2-28 | 14:47:11 | 2017-2-28 22:47:11 |

+---------------------+------------+------------+---------------------+

 

因为我国位于东八时区,所以本地时间 = UTC 时间 + 8 小时。UTC时间在业务涉及多个国家和地区的时候,非常有用。

 

二、MySQL 日期时间 Extract(选取) 函数。

1. 选取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微秒

 

set @dt = '2008-09-10 07:15:30.123456';

 

select date(@dt); -- 2008-09-10

select time(@dt); -- 07:15:30.123456

select year(@dt); -- 2008

select quarter(@dt); -- 3

select month(@dt); -- 9

select week(@dt); -- 36

select day(@dt); -- 10

select hour(@dt); -- 7

select minute(@dt); -- 15

select second(@dt); -- 30

select microsecond(@dt); -- 123456

 

2. MySQL Extract() 函数,可以上面实现类似的功能:

 

set @dt = '2008-09-10 07:15:30.123456';

 

select extract(year from @dt); -- 2008

select extract(quarter from @dt); -- 3

select extract(month from @dt); -- 9

select extract(week from @dt); -- 36

select extract(day from @dt); -- 10

select extract(hour from @dt); -- 7

select extract(minute from @dt); -- 15

select extract(second from @dt); -- 30

select extract(microsecond from @dt); -- 123456

select extract(year_month from @dt); -- 200809

select extract(day_hour from @dt); -- 1007

select extract(day_minute from @dt); -- 100715

select extract(day_second from @dt); -- 10071530

select extract(day_microsecond from @dt); -- 10071530123456

select extract(hour_minute from @dt); -- 715

select extract(hour_second from @dt); -- 71530

select extract(hour_microsecond from @dt); -- 71530123456

select extract(minute_second from @dt); -- 1530

select extract(minute_microsecond from @dt); -- 1530123456

select extract(second_microsecond from @dt); -- 30123456

 

MySQL Extract() 函数除了没有date(),time()的功能外,其他功能一应具全。并且还具有选取‘day_microsecond’ 等功能。注意这里不是只选取day microsecond,而是从日期的day 部分一直选取到microsecond 部分。够强悍的吧!

 

MySQL Extract() 函数唯一不好的地方在于:你需要多敲几次键盘。

 

3. MySQL dayof... 函数:dayofweek(), dayofmonth(), dayofyear()

 

分别返回日期参数,在一周、一月、一年中的位置。

 

set @dt = '2017-2-28';

 

select dayofweek(@dt); -- 6

select dayofmonth(@dt); -- 8

select dayofyear(@dt); -- 221

 

日期 '2017-2-28' 是一周中的第 6 天(1 = Sunday, 2 = Monday, ..., 7 = Saturday);一月中的第8 天;一年中的第221 天。

 

4. MySQL week... 函数:week(), weekofyear(), dayofweek(), weekday(), yearweek()

 

set @dt = '2017-2-28';

 

select week(@dt); -- 31

select week(@dt,3); -- 32

select weekofyear(@dt); -- 32

 

select dayofweek(@dt); -- 6

select weekday(@dt); -- 4

 

select yearweek(@dt); -- 200831

 

MySQL week() 函数,可以有两个参数,具体可看手册。 weekofyear()week()一样,都是计算“某天”是位于一年中的第几周。 weekofyear(@dt)等价于 week(@dt,3)

 

MySQL weekday() 函数和 dayofweek()类似,都是返回“某天”在一周中的位置。不同点在于参考的标准, weekday(0 = Monday, 1 = Tuesday, ..., 6 = Sunday)dayofweek:(1 = Sunday, 2 = Monday, ..., 7 = Saturday

 

MySQL yearweek() 函数,返回 year(2008) + week位置(31)

 

5. MySQL 返回星期和月份名称函数:dayname(), monthname()

 

set @dt = '2017-2-28';

 

select dayname(@dt); -- Friday

select monthname(@dt); -- August

 

思考,如何返回中文的名称呢?

 

6. MySQL last_day() 函数:返回月份中的最后一天。

 

select last_day('2008-02-01'); -- 2008-02-29

select last_day('2017-2-28'); -- 2008-08-31

 

MySQL last_day() 函数非常有用,比如我想得到当前月份中有多少天,可以这样来计算:

 

mysql> select now(), day(last_day(now())) as days;

 

+---------------------+------+

| now() | days |

+-----------------

----+------+

| 2008-08-09 11:45:45 | 31 |

+---------------------+------+

 

三、MySQL 日期时间计算函数

1. MySQL 为日期增加一个时间间隔:date_add()

 

set @dt = now();

 

select date_add(@dt, interval 1 day); -- add 1 day

select date_add(@dt, interval 1 hour); -- add 1 hour

select date_add(@dt, interval 1 minute); -- ...

select date_add(@dt, interval 1 second);

select date_add(@dt, interval 1 microsecond);

select date_add(@dt, interval 1 week);

select date_add(@dt, interval 1 month);

select date_add(@dt, interval 1 quarter);

select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day); -- sub 1 day

 

MySQL adddate(), addtime()函数,可以用 date_add()来替代。下面是 date_add()实现 addtime()功能示例:

 

mysql> set @dt = '2008-08-09 12:12:33';

 

mysql>

mysql> select date_add(@dt, interval '01:15:30' hour_second);

 

+------------------------------------------------+

| date_add(@dt, interval '01:15:30' hour_second) |

+------------------------------------------------+

| 2008-08-09 13:28:03 |

+------------------------------------------------+

mysql> select date_add(@dt, interval '1 01:15:30' day_second);

 

+-------------------------------------------------+

| date_add(@dt, interval '1 01:15:30' day_second) |

+-------------------------------------------------+

| 2008-08-10 13:28:03 |

+-------------------------------------------------+

 

date_add() 函数,分别为 @dt增加了“1小时1530秒” 和 “11小时1530秒”。建议:总是使用date_add() 日期时间函数来替代adddate(), addtime()

 

2. MySQL 为日期减去一个时间间隔:date_sub()

 

mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

 

+----------------------------------------------------------------+

| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |

+----------------------------------------------------------------+

| 1997-12-30 22:58:59 |

+----------------------------------------------------------------+

 

MySQL date_sub() 日期时间函数 和 date_add()用法一致,不再赘述。另外,MySQL中还有两个函数 subdate(), subtime(),建议,用date_sub() 来替代。

 

3. MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)

 

函数参数P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。

 

MySQL period_add(P,N):日期加/减去N月。

 

mysql> select period_add(200808,2), period_add(20080808,-2)

 

+----------------------+-------------------------+

| period_add(200808,2) | period_add(20080808,-2) |

+----------------------+-------------------------+

| 200810 | 20080806 |

+----------------------+-------------------------+

 

MySQL period_diff(P1,P2):日期 P1-P2,返回N 个月。

 

mysql> select period_diff(200808, 200801);

 

+-----------------------------+

| period_diff(200808, 200801) |

+-----------------------------+

| 7 |

+-----------------------------+

 

MySQL 中,这两个日期函数,一般情况下很少用到。

 

4. MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

 

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。

 

select datediff('2017-2-28', '2008-08-01'); -- 7

select datediff('2008-08-01', '2017-2-28'); -- -7

 

MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回time 差值。

 

select timediff('2017-2-28 08:08:08', '2017-2-28 00:00:00'); -- 08:08:08

select timediff('08:08:08', '00:00:00'); -- 08:08:08

 

注意:timediff(time1,time2) 函数的两个参数类型必须相同。

 

四、MySQL 日期转换函数、时间转换函数

1. MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)

 

select time_to_sec('01:00:05'); -- 3605

select sec_to_time(3605); -- '01:00:05'

 

2. MySQL (日期、天数)转换函数:to_days(date), from_days(days)

 

select to_days('0000-00-00'); -- 0

select to_days('2017-2-28'); -- 733627

select from_days(0); -- '0000-00-00'

select from_days(733627); -- '2017-2-28'

 

3. MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)

 

select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09

select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09

select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09

select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30

select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

 

可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看MySQL 手册。

 

4. MySQL Date/Time to Str(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)

 

mysql> select date_format('2017-2-28 22:23:00', '%W %M %Y');

 

+------------------------------------------------+

| date_format('2017-2-28 22:23:00', '%W %M %Y') |

+------------------------------------------------+

| Friday August 2008 |

+------------------------------------------------+

mysql> select date_format('2017-2-28 22:23:01', '%Y%m%d%H%i%s');

 

+----------------------------------------------------+

| date_format('2017-2-28 22:23:01', '%Y%m%d%H%i%s') |

+----------------------------------------------------+

| 20080808222301 |

+----------------------------------------------------+

mysql> select time_format('22:23:01', '%H.%i.%s');

 

+-------------------------------------+

| time_format('22:23:01', '%H.%i.%s') |

+-------------------------------------+

| 22.23.01 |

+-------------------------------------+

 

MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format)能够把一个日期/时间转换成各种各样的字符串格式。它是str_to_date(str,format) 函数的 一个逆转换。

 

5. MySQL 获得国家地区时间格式函数:get_format()

 

MySQL get_format() 语法:

 

get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'

 

MySQL get_format() 用法的全部示例:

 

select get_format(date,'usa') ; -- '%m.%d.%Y'

select get_format(date,'jis') ; -- '%Y-%m-%d'

select get_format(date,'iso') ; -- '%Y-%m-%d'

select get_format(date,'eur') ; -- '%d.%m.%Y'

select get_format(date,'internal') ; -- '%Y%m%d'

select get_format(datetime,'usa') ; -- '%Y-%m-%d %H.%i.%s'

select get_format(datetime,'jis') ; -- '%Y-%m-%d %H:%i:%s'

select get_format(datetime,'iso') ; -- '%Y-%m-%d %H:%i:%s'

select get_format(datetime,'eur') ; -- '%Y-%m-%d

%H.%i.%s'

select get_format(datetime,'internal') ; -- '%Y%m%d%H%i%s'

select get_format(time,'usa') ; -- '%h:%i:%s %p'

select get_format(time,'jis') ; -- '%H:%i:%s'

select get_format(time,'iso') ; -- '%H:%i:%s'

select get_format(time,'eur') ; -- '%H.%i.%s'

select get_format(time,'internal') ; -- '%H%i%s'

 

MySQL get_format() 函数在实际中用到机会的比较少。

 

6. MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

 

select makedate(2001,31); -- '2001-01-31'

select makedate(2001,32); -- '2001-02-01'

select maketime(12,15,30); -- '12:15:30'

 

五、MySQL 时间戳(Timestamp)函数

1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()

 

mysql> select current_timestamp, current_timestamp();

 

+---------------------+---------------------+

| current_timestamp | current_timestamp() |

+---------------------+---------------------+

| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |

+---------------------+---------------------+

 

2. MySQL Unix时间戳、日期)转换函数:

 

unix_timestamp(),

unix_timestamp(date),

from_unixtime(unix_timestamp),

from_unixtime(unix_timestamp,format)

 

下面是示例:

 

select unix_timestamp(); -- 1218290027

select unix_timestamp('2017-2-28'); -- 1218124800

select unix_timestamp('2017-2-28 12:30:00'); -- 1218169800

select from_unixtime(1218290027); -- '2008-08-09 21:53:47'

select from_unixtime(1218124800); -- '2017-2-28 00:00:00'

select from_unixtime(1218169800); -- '2017-2-28 12:30:00'

select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'

 

3. MySQL 时间戳(timestamp)转换、增、减函数:

 

timestamp(date) -- date to timestamp

timestamp(dt,time) -- dt + time

timestampadd(unit,interval,datetime_expr) --

timestampdiff(unit,datetime_expr1,datetime_expr2) --

 

请看示例部分:

 

select timestamp('2017-2-28'); -- 2017-2-28 00:00:00

select timestamp('2017-2-28 08:00:00', '01:01:01'); -- 2017-2-28 09:01:01

select timestamp('2017-2-28 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2017-2-28 08:00:00'); -- 2008-08-09 08:00:00

select date_add('2017-2-28 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

 

MySQL timestampadd() 函数类似于 date_add()

 

select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1

select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485

select timestampdiff(hour,'2017-2-28 12:00:00','2017-2-28 00:00:00'); -- -12

 

select datediff('2017-2-28 12:00:00', '2008-08-01 00:00:00'); -- 7

 

MySQL timestampdiff() 函数就比 datediff()功能强多了,datediff()只能计算两个日期(date)之间相差的天数。

 

六、MySQL 时区(timezone)转换函数

convert_tz(dt,from_tz,to_tz)

select convert_tz('2017-2-28 12:00:00', '+08:00', '+00:00'); -- 2017-2-28 04:00:00

 

时区转换也可以通过 date_add, date_sub, timestampadd来实现。

 

select date_add('2017-2-28 12:00:00', interval -8 hour); -- 2017-2-28 04:00:00

select date_sub('2017-2-28 12:00:00', interval 8 hour); -- 2017-2-28 04:00:00

select timestampadd(hour, -8, '2017-2-28 12:00:00'); -- 2017-2-28 04:00:00

 

 

 

字符串处理函数

符串或串(String)是由零个或多个字符组成的有限序列。一般记为s='a1a2•••an'(n>=0)。它是编程语言中表示文本的数据类型。

通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。设pq是两个串,求qp中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。

下面我们来看看MySQL中的字符串函数

假如结果的长度大于 max_allowed_packet系统变量的最大值时,字符串值函数的返回值为NULL

对于在字符串位置操作的函数,第一个位置的编号为 1

◆ ASCII(str)

返回值为字符串str的最左字符的数值。假如str为空字符串,则返回值为0 。假如strNULL,则返回值为NULLASCII()用于带有从 0255的数值的字符。

mysql> SELECT ASCII('2');

 

        -> 50

 

mysql> SELECT ASCII(2);

 

        -> 50

 

mysql> SELECT ASCII('dx');

 

        -> 100

ORD()函数。

◆ BIN(N)

返回值为N的二进制值的字符串表示,其中  N为一个longlong (BIGINT)数字。这等同于 CONV(N,10,2)。假如NNULL,则返回值为NULL

mysql> SELECT BIN(12);
-> '1100'

◆ BIT_LENGTH(str)

返回值为二进制的字符串str长度。

mysql> SELECT BIT_LENGTH('text');
-> 32

◆ CHAR(N,... [USING charset])

CHAR()将每个参数N理解为一个整数,其返回值为一个包含这些整数的代码值所给出的字符的字符串。NULL值被省略。

mysql> SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> SELECT CHAR(77,77.3,'77.3');
-> 'MMM'

大于 255CHAR()参数被转换为多结果字符。 例如,CHAR(256)相当于 CHAR(1,0),CHAR(256*256)则相当于 CHAR(1,0,0)

mysql> SELECT HEX(CHAR(1,0)), HEX(CHAR(256));
+----------------+----------------+
| HEX(CHAR(1,0)) | HEX(CHAR(256)) |
+----------------+----------------+
| 0100           | 0100           |
+----------------+----------------+
mysql> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));
+------------------+--------------------+
| HEX(CHAR(1,0,0)) | HEX(CHAR(256*256)) |
+------------------+--------------------+
| 010000           | 010000             |
+------------------+--------------------+

CHAR()的返回值为一个二进制字符串。可选择使用USING语句产生一个给出的字符集中的字符串:

mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
+---------------------+--------------------------------+
| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |
+---------------------+--------------------------------+
| binary              | utf8                           |
+---------------------+--------------------------------+

如果 USING已经产生,而结果字符串不符合给出的字符集,则会发出警告。同样,如果严格的SQL模式被激活,则CHAR()的结果会成为NULL

◆ CHAR_LENGTH(str)

返回值为字符串str的长度,长度的单位为字符。一个多字节字符算作一个单字符。对于一个包含五个二字节字符集, LENGTH()返回值为10, CHAR_LENGTH()的返回值为5

◆ CHARACTER_LENGTH(str)

CHARACTER_LENGTH()CHAR_LENGTH()的同义词。

◆ COMPRESS(string_to_compress)

压缩一个字符串。这个函数要求 MySQL已经用一个诸如zlib的压缩库压缩过。  否则,返回值始终是NULLUNCOMPRESS()可将压缩过的字符串进行解压缩。

mysql> SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
-> 21
mysql> SELECT LENGTH(COMPRESS(''));
-> 0
mysql> SELECT LENGTH(COMPRESS('a'));
-> 13
mysql> SELECT LENGTH(COMPRESS(REPEAT('a',16)));
-> 15

压缩后的字符串的内容按照以下方式存储:

空字符串按照空字符串存储。

非空字符串未压缩字符串的四字节长度进行存储(首先为低字节),后面是压缩字符串。如果字符串以空格结尾,就会在后加一个".",以防止当结果值是存储在CHARVARCHAR类型的字段列时,出现自动把结尾空格去掉的现象。(不推荐使用CHAR VARCHAR来存储压缩字符串。最好使用一个 BLOB列代替)。

◆ CONCAT(str1,str2,...)                      

返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为 NULL。或许有一个或多个参数。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型cast, 例如:SELECT CONCAT(CAST(int_col AS CHAR), char_col)

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() 代表CONCAT With Separator ,是CONCAT()的特殊形式。  第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL 值。

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'

CONCAT_WS()不会忽略任何空字符串。(然而会忽略所有的NULL)。

◆ CONV(N,from_base,to_base)

不同数基间转换数字。返回值为数字的N字符串表示,由from_base基转化为to_base 基。如有任意一个参数为NULL,则返回值为NULL。自变量 N 被理解为一个整数,但是可以被指定为一个整数或字符串。最小基数为2 ,而最大基数则为36If to_base 是一个负数,则N 被看作一个带符号数。否则,N 被看作无符号数。CONV() 的运行精确度为64比特。

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'

◆ ELT(N,str1,str2,str3,...)

N = 1,则返回值为  str1,若N = 2,则返回值为str2 ,以此类推。若N小于1或大于参数的数目,则返回值为NULL ELT()   FIELD()的补数。

mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'

◆ EXPORT_SET(bits,on,off[,separator[,number_of_bits]])

返回值为一个字符串,其中对于bits值中的每个位组,可以得到一个on 字符串,而对于每个清零比特位,可以得到一个off字符串。bits 中的比特值按照从右到左的顺序接受检验 (由低位比特到高位比特)。字符串被分隔字符串分开(默认为逗号‘,’),按照从左到右的顺序被添加到结果中。number_of_bits会给出被检验的二进制位数 (默认为64)

mysql> SELECT EXPORT_SET(5,'Y','N',',',4);
-> 'Y,N,Y,N'
mysql> SELECT EXPORT_SET(6,'1','0',',',10);
-> '0,1,1,0,0,0,0,0,0,0'

◆ FIELD(str,str1,str2,str3,...)

返回值为str1, str2, str3,……列表中的str指数。在找不到str的情况下,返回值为 0

如果所有对于FIELD()的参数均为字符串,则所有参数均按照字符串进行比较。如果所有的参数均为数字,则按照数字进行比较。否则,参数按照双倍进行比较。

如果str NULL,则返回值为0,原因是NULL不能同任何值进行同等比较。FIELD()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)

假如字符串str在由N 子链组成的字符串列表strlist中, 则返回值的范围在 1N 之间 。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则   FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strliststrlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为NULL。 这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2

◆ FORMAT(X,D)

number X设置为格式'#,###,###.##', 以四舍五入的方式保留到小数点后D,而返回结果为一个字符串。

◆ HEX(N_or_S)

如果N_OR_S是一个数字,则返回一个 十六进制值 N的字符串表示,在这里,   N是一个longlong (BIGINT)数。这相当于CONV(N,10,16)

如果N_OR_S是一个字符串,则返回值为一个N_OR_S的十六进制字符串表示, 其中每个N_OR_S里的每个字符被转化为两个十六进制数字。

mysql> SELECT HEX(255);
-> 'FF'
mysql> SELECT 0x616263;
-> 'abc'
mysql> SELECT HEX('abc');
-> 616263

◆ INSERT(str,pos,len,newstr)

返回字符串 str,其子字符串起始于 pos 位置和长期被字符串 newstr取代的len字符。  如果pos 超过字符串长度,则返回值为原始字符串。 假如len的长度大于其它字符串的长度,则从位置pos开始替换。若任何一个参数为null,则返回值为NULL

mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'
mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
-> 'Quadratic'
mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
-> 'QuWhat'

这个函数支持多字节字元。

◆ INSTR(str,substr)

返回字符串 str中子字符串的第一个出现位置。这和LOCATE()的双参数形式相同,除非参数的顺序被颠倒。

mysql> SELECT INSTR('foobarbar', 'bar');
-> 4
mysql> SELECT INSTR('xbar', 'foobar');
-> 0

这个函数支持多字节字元,并且只有当至少有一个参数是二进制字符串时区分大小写。

◆ LCASE(str)

LCASE() LOWER()的同义词。

◆ LEFT(str,len)

返回从字符串str开始的len 最左字符。

mysql> SELECT LEFT('foobarbar', 5);
-> 'fooba'

◆ LENGTH(str)

返回值为字符串str的长度,单位为字节。一个多字节字符算作多字节。这意味着 对于一个包含52字节字符的字符串,LENGTH() 的返回值为10, CHAR_LENGTH()的返回值则为5

mysql> SELECT LENGTH('text');
-> 4

◆ LOAD_FILE(file_name)

读取文件并将这一文件按照字符串的格式返回。文件的位置必须在服务器上,你必须为文件制定路径全名,而且你还必须拥有FILE特许权。文件必须可读取,文件容量必须小于 max_allowed_packet字节。

若文件不存在,或因不满足上述条件而不能被读取,则函数返回值为 NULL

mysql> UPDATE tbl_name
SET blob_column=LOAD_FILE('/tmp/picture')
WHERE id=1;

◆ LOCATE(substr,str) , LOCATE(substr,str,pos)

第一个语法返回字符串 str中子字符串substr的第一个出现位置。第二个语法返回字符串str中子字符串substr的第一个出现位置,起始位置在pos。如若substr不在str中,则返回值为0

mysql> SELECT LOCATE('bar', 'foobarbar');
-> 4
mysql> SELECT LOCATE('xbar', 'foobar');
-> 0
mysql> SELECT LOCATE('bar', 'foobarbar',5);
-> 7

这个函数支持多字节字元,并且只有当至少有一个参数是二进制字符串时区分大小写。

◆ LOWER(str)

返回字符串 str以及所有根据最新的字符集映射表变为小写字母的字符 (默认为  cp1252 Latin1)

mysql> SELECT LOWER('QUADRATICALLY');
-> 'quadratically'

这个函数支持多字节字元。

◆ LPAD(str,len,padstr)

返回字符串 str,其左边由字符串padstr 填补到len 字符长度。假如str的长度大于len,则返回值被缩短至 len字符。

mysql> SELECT LPAD('hi',4,'??');
-> '??hi'
mysql> SELECT LPAD('hi',1,'??');
-> 'h'

◆ LTRIM(str)

返回字符串 str,其引导空格字符被删除。

mysql> SELECT LTRIM('  barbar');
-> 'barbar'

这个函数支持多字节字元。

◆ MAKE_SET(bits,str1,str2,...)

返回一个设定值 (一个包含被‘,’号分开的字字符串的字符串),由在bits 组中具有相应的比特的字符串组成。str1对应比特 0, str2对应比特1,以此类推。str1, str2, ...中的NULL值不会被添加到结果中。

mysql> SELECT MAKE_SET(1,'a','b','c');
-> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
-> 'hello,world'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');
-> 'hello'
mysql> SELECT MAKE_SET(0,'a','b','c');
-> ''

◆ MID(str,pos,len)

MID(str,pos,len) SUBSTRING(str,pos,len)的同义词。

◆ OCT(N)

返回一个 N的八进制值的字符串表示,其中N 是一个longlong (BIGINT)数。这等同于CONV(N,10,8)。若NNULL ,则返回值为NULL

mysql> SELECT OCT(12);
-> '14'

◆ OCTET_LENGTH(str)

OCTET_LENGTH() LENGTH()的同义词。

◆ ORD(str)

若字符串str的最左字符是一个多字节字符,则返回该字符的代码, 代码的计算通过使用以下公式计算其组成字节的数值而得出:

(1st byte code)
+ (2nd byte code × 256)
+ (3rd byte code × 2562) ...

假如最左字符不是一个多字节字符,那么 ORD()和函数ASCII()返回相同的值。

mysql> SELECT ORD('2');
-> 50

◆ POSITION(substr IN str)

POSITION(substr IN str)LOCATE(substr,str)同义词。

◆ QUOTE(str)

引证一个字符串,由此产生一个在SQL语句中可用作完全转义数据值的结果。 返回的字符串由单引号标注,每例都带有单引号 (‘'’)、 反斜线符号(‘\’)ASCII NUL以及前面有反斜线符号的Control-Z。如果自变量的值为NULL,则返回不带单引号的单词 “NULL”

mysql> SELECT QUOTE('Don\'t!');
-> 'Don\'t!'
mysql> SELECT QUOTE(NULL);
-> NULL

◆ REPEAT(str,count)

返回一个由重复的字符串str组成的字符串,字符串str的数目等于count。若 count <= 0,则返回一个空字符串。若strcount NULL,则返回NULL

mysql> SELECT REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'

◆ REPLACE(str,from_str,to_str)

返回字符串str以及所有被字符串to_str替代的字符串from_str

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'

这个函数支持多字节字元。

◆ REVERSE(str)

返回字符串 str,顺序和字符顺序相反。

mysql> SELECT REVERSE('abc');
-> 'cba'

这个函数支持多字节字元。

◆ RIGHT(str,len)

从字符串str开始,返回最右len 字符。

mysql> SELECT RIGHT('foobarbar', 4);
-> 'rbar'

这个函数支持多字节字元。

◆ RPAD(str,len,padstr)

返回字符串str,其右边被字符串 padstr填补至len字符长度。假如字符串str的长度大于 len,则返回值被缩短到与len 字符相同长度。

mysql> SELECT RPAD('hi',5,'?');
-> 'hi???'
mysql> SELECT RPAD('hi',1,'?');
-> 'h'

这个函数支持多字节字元。

 

◆ RTRIM(str)

返回字符串 str,结尾空格字符被删去。

mysql> SELECT RTRIM('barbar   ');
-> 'barbar'

这个函数支持多字节字元。

◆ SOUNDEX(str)

str返回一个soundex字符串。 两个具有几乎同样探测的字符串应该具有同样的soundex 字符串。一个标准的soundex字符串的长度为4个字符,然而SOUNDEX()函数会返回一个人以长度的字符串。 可使用结果中的SUBSTRING()来得到一个标准 soundex字符串。在str中,会忽略所有未按照字母顺序排列的字符。 所有不在A-Z范围之内的国际字母符号被视为元音字母。

mysql> SELECT SOUNDEX('Hello');
-> 'H400'
mysql> SELECT SOUNDEX('Quadratically');
-> 'Q36324'

注意:这个函数执行原始的Soundex算法,而非更加流行的加强版本(D. Knuth所述)。其区别在于原始版本首先会删去元音,其次是重复,而加强版则首先删去重复,而后删去元音。

◆ expr1 SOUNDS LIKE expr2

这相当于SOUNDEX(expr1) = SOUNDEX(expr2)

◆ SPACE(N)

返回一个由N间隔符号组成的字符串。

mysql> SELECT SPACE(6);
-> '      '

◆ SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)

不带有len参数的格式从字符串str返回一个子字符串,起始于位置pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos字符,而不是字符串的开头位置。在以下格式的函数中可以对pos使用一个负值。

mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica'      
mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila'      
mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki'
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki'

这个函数支持多字节字元。

注意,如果对len使用的是一个小于1的值,则结果始终为空字符串。

SUBSTR()SUBSTRING()的同义词。

◆ SUBSTRING_INDEX(str,delim,count)

在定界符 delim以及count 出现前,从字符串str返回自字符串。若count为正值,则返回最终定界符(从左边开始)左边的一切内容。若count为负值,则返回定界符(从右边开始)右边的一切内容。

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'

这个函数支持多字节字元。

◆ TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)

返回字符串 str, 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTHLEADINTRAILING中没有一个是给定的,则假设为BOTHremstr 为可选项,在未指定情况下,可删除空格。

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'

这个函数支持多字节字元。

◆ UCASE(str)

UCASE()UPPER()的同义词。

◆ UNCOMPRESS(string_to_uncompress)

对经COMPRESS()函数压缩后的字符串进行解压缩。若参数为压缩值,则结果为NULL。这个函数要求  MySQL已被诸如zlib 之类的压缩库编译过。否则, 返回值将始终是 NULL

mysql> SELECT UNCOMPRESS(COMPRESS('any string'));
-> 'any string'
mysql> SELECT UNCOMPRESS('any string');
-> NULL

◆ UNCOMPRESSED_LENGTH(compressed_string)

返回压缩字符串压缩前的长度。

mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));
-> 30

◆ UNHEX(str)

执行从HEX(str)的反向操作。就是说,它将参数中的每一对十六进制数字理解为一个数字,并将其转化为该数字代表的字符。结果字符以二进制字符串的形式返回。

mysql> SELECT UNHEX('4D7953514C');
-> 'MySQL'
mysql> SELECT 0x4D7953514C;
-> 'MySQL'
mysql> SELECT UNHEX(HEX('string'));
-> 'string'
mysql> SELECT HEX(UNHEX('1267'));
-> '1267'

◆ UPPER(str)

返回字符串str, 以及根据最新字符集映射转化为大写字母的字符(默认为cp1252 Latin1).

mysql> SELECT UPPER('Hej');
-> 'HEJ'

该函数支持多字节字元。

 

数学函数

所有的数学函数在一个出错的情况下返回NULL 


单目减。改变参数的符号。 
mysql> select - 2; 

注意,如果这个操作符与一个BIGINT使用,返回值是一个BIGINT!这意味着你应该避免在整数上使用-,那可能有值-2^63 
ABS(X) 
返回X的绝对值。 
mysql> select ABS(2); 
-> 2 
mysql> select ABS(-32); 
-> 32 

该功能可安全用于BIGINT值。 

SIGN(X) 
返回参数的符号,为-101,取决于X是否是负数、零或正数。 
mysql> select SIGN(-32); 
-> -1 
mysql> select SIGN(0); 
-> 0 
mysql> select SIGN(234); 
-> 1 

MOD(N,M) 
 

(类似C中的%操作符)。返回NM除的余数。 
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 

注意返回值被变换为一个BIGINT! 

ROUND(X,D) 
返回参数X的四舍五入的有D为小数的一个数字。如果D0,结果将没有小数点或小数部分。 
mysql> select ROUND(1.298, 1); 
-> 1.3 
mysql> select ROUND(1.298, 0); 
-> 1 

注意返回值被变换为一个BIGINT! 

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的以10为底的对数。 
mysql> select LOG10(2); 
-> 0.301030 
mysql> select LOG10(100); 
-> 2.000000 
mysql> select LOG10(-100); 
-> NULL 

POW(X,Y) 
 
POWER(X,Y) 
返回值XY次幂。 
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() 
返回PI的值(圆周率)。 
mysql> select PI(); 
-> 3.141593 

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不在-11的范围,返回NULL 
mysql> select ACOS(1); 
-> 0.000000 
mysql> select ACOS(1.0001); 
-> NULL 
mysql> select ACOS(0); 
-> 1.570796 

ASIN(X) 
返回X反正弦值,即其正弦值是XL如果X不在-11的范围,返回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 
ATAN2(X,Y) 
返回2个变量XY的反正切。它类似于计算Y/X的反正切,除了两个参数的符号被用来决定结果的象限。 
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) 
返回在范围01.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。 
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.7888 

你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做:Select * FROM table_name orDER BY RAND(),这是有利于得到一个来自Select * FROM table1,table2 Where a=b AND c
LEAST(X,Y,...) 
22个以上的参数,返回最小(最小值)的参数。参数使用下列规则进行比较: 
如果返回值被使用在一个INTEGER上下文,或所有的参数都是整数值,他们作为整数比较。 
如果返回值被使用在一个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" 

MySQL3.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位小数。如果D0,结果将没有小数点或小数部分。 
mysql> select TRUNCATE(1.223,1); 
-> 1.2 
mysql> select TRUNCATE(1.999,1); 
-> 1.9 
mysql> select TRUNCATE(1.999,0); 
-> 1

 

0 0