mysql中的函数

常用函数

字符串函数

  • CANCAT(S1,S2,…Sn)函数:把传入的参数连接成为一个字符串。
    下面的例子把“aaa”、“bbb”、“ccc”3 个字符串连接成了一个字符串“aaabbbccc”。另外,
    任何字符串与 NULL 进行连接的结果都将是 NULL。
mysql> select concat('aaa','bbb','ccc') ,concat('aaa',null);
| concat('aaa','bbb','ccc') | concat('aaa',null) |
+---------------------------+--------------------+
| aaabbbccc
| NULL
|
+---------------------------+--------------------+
1 row in set (0.05 sec)
  • INSERT(str ,x,y,instr)函数:将字符串 str 从第 x 位置开始,y 个字符长的子串替换为字符
    串 instr。
    下面的例子把字符串“beijing2018you”中的从第 12 个字符开始以后的 3 个字符替换成
    “me”。
mysql> select INSERT('beijing2018you',12,3, 'me') ;
+-------------------------------------+
| INSERT('beijing2018you',12,3, 'me') |
+-------------------------------------+
| beijing2018me
|
+-------------------------------------+
1 row in set (0.00 sec)
  • LOWER(str)和 UPPER(str)函数:把字符串转换成小写或大写。
    在字符串比较中,通常要将比较的字符串全部转换为大写或者小写,如下例所示:
mysql> select lower('BEIJING2018'),UPPER('beijing2018');
+----------------------+----------------------+
| lower('BEIJING2018') | UPPER('beijing2018') |
+----------------------+----------------------+
| beijing2018          | BEIJING2018          |
+----------------------+----------------------+
1 row in set (0.00 sec)


  • LEFT(str,x)和 RIGHT(str,x)函数:分别返回字符串最左边的 x 个字符和最右边的 x 个字符。
    如果第二个参数是 NULL,那么将不返回任何字符串。
mysql> select left('beijing2018',7),left('beijing2018',null),right('beijing2018',4);
+-----------------------+--------------------------+------------------------+
| left('beijing2018',7) | left('beijing2018',null) | right('beijing2018',4) |
+-----------------------+--------------------------+------------------------+
| beijing               | NULL                     | 2018                   |
+-----------------------+--------------------------+------------------------+
1 row in set (0.00 sec)
  • LPAD(str,n ,pad)和 RPAD(str,n ,pad)函数:用字符串 pad 对 str 最左边和最右边进行填充,
    直到长度为 n 个字符长度。
    下例中显示了对字符串“2018”和“beijing”分别填充后的结果。
mysql> select lpad('2018',20,'beijing'),rpad('beijing',20,'2018');
+---------------------------+---------------------------+
| lpad('2018',20,'beijing') | rpad('beijing',20,'2018') |
+---------------------------+---------------------------+
| beijingbeijingbe2018      | beijing2018201820182      |
+---------------------------+---------------------------+
1 row in set (0.00 sec)

  • LTRIM(str)和 RTRIM(str)函数:去掉字符串 str 左侧和右侧空格。
    下例中显示了字符串“beijing”加空格进行过滤后的结果。
mysql> select ltrim('  |beijing'),rtrim('beijing|  ');
+---------------------+---------------------+
| ltrim('  |beijing') | rtrim('beijing|  ') |
+---------------------+---------------------+
| |beijing            | beijing|            |
+---------------------+---------------------+
1 row in set (0.00 sec)

  • REPEAT(str,x)函数:返回 str 重复 x 次的结果。
    下例中对字符串“mysql”重复显示了 3 次。
mysql> select repeat('mysql',3);
+-------------------+
| repeat('mysql',3) |
+-------------------+
| mysqlmysqlmysql   |
+-------------------+
1 row in set (0.00 sec)

  • REPLACE(str,a,b)函数:用字符串 b 替换字符串 str 中所有出现的字符串 a。
    下例中用字符串“2018”代替了字符串“beijing_2008”中的“_2008”。
mysql> select replace('beijing_2008','_2008','2018');
+----------------------------------------+
| replace('beijing_2008','_2008','2018') |
+----------------------------------------+
| beijing2018                            |
+----------------------------------------+
1 row in set (0.00 sec)
  • STRCMP(s1,s2)函数:比较字符串 s1 和 s2 的 ASCII 码值的大小。如果 s1 比 s2 小,那么返回-1;
    如果 s1 与 s2 相等,那么返回 0;如果 s1 比 s2 大,那么返回 1。如下例:
mysql> select strcmp('a','b'),strcmp('b','b'),strcmp('c','b');
+-----------------+-----------------+-----------------+
| strcmp('a','b') | strcmp('b','b') | strcmp('c','b') |
+-----------------+-----------------+-----------------+
|              -1 |               0 |               1 |
+-----------------+-----------------+-----------------+
1 row in set (0.02 sec)

  • TRIM(str)函数:去掉目标字符串的开头和结尾的空格。
    下例中对字符串“$ beijing2008 $ ”进行了前后空格的过滤。
mysql> select trim(' $ beijing $  ');
+------------------------+
| trim(' $ beijing $  ') |
+------------------------+
| $ beijing $            |
+------------------------+
1 row in set (0.00 sec)

  • SUBSTRING(str,x,y)函数:返回从字符串 str 中的第 x 位置起 y 个字符长度的字串。
    此函数经常用来对给定字符串进行字串的提取,如下例所示。
mysql> select substring('beijing2018',8,4),substring('beijing2018',1,7);
+------------------------------+------------------------------+
| substring('beijing2018',8,4) | substring('beijing2018',1,7) |
+------------------------------+------------------------------+
| 2018                         | beijing                      |
+------------------------------+------------------------------+
1 row in set (0.00 sec)

数值函数

  • ABS(x)函数:返回 x 的绝对值。
    下例中显示了对正数和负数分别取绝对值之后的结果。
mysql> select abs(-0.8);
+-----------+
| abs(-0.8) |
+-----------+
|       0.8 |
+-----------+
1 row in set (0.01 sec)
  • CEIL(x)函数:返回大于 x 的最大整数。
    下例中显示了对 0.8 和-0.8 分别 CEIL 后的结果。
mysql> select ceil(-0.8),ceil(0.8);
+------------+-----------+
| ceil(-0.8) | ceil(0.8) |
+------------+-----------+
|          0 |         1 |
+------------+-----------+
1 row in set (0.00 sec)
  • FLOOR(x)函数:返回小于 x 的最大整数,和 CEIL 的用法刚好相反。
    下例中显示了对 0.8 和-0.8 分别 FLOOR 后的结果。
mysql> select floor(-0.8),floor(0.8);
+-------------+------------+
| floor(-0.8) | floor(0.8) |
+-------------+------------+
|          -1 |          0 |
+-------------+------------+
1 row in set (0.00 sec)

  • MOD(x,y)函数:返回 x/y 的模。
    和 x%y 的结果相同,模数和被模数任何一个为 NULL 结果都为 NULL。如下例所示:
mysql> select mod(15,10),mod(null,10);
+------------+--------------+
| mod(15,10) | mod(null,10) |
+------------+--------------+
|          5 |         NULL |
+------------+--------------+
1 row in set (0.00 sec)

  • RAND()函数:返回 0 到 1 内的随机值。
    每次执行结果都不一样,如下例所示:
mysql> select rand(),rand();
+---------------------+--------------------+
| rand()              | rand()             |
+---------------------+--------------------+
| 0.23571444790411222 | 0.5954422015654316 |
+---------------------+--------------------+
1 row in set (0.00 sec)

利用此函数可以取任意指定范围内的随机数,比如需要产生 0~100 内的任意随机整数,可
以操作如下:

mysql> select ceil(100*rand()),ceil(100*rand());
+------------------+------------------+
| ceil(100*rand()) | ceil(100*rand()) |
+------------------+------------------+
|               28 |               57 |
+------------------+------------------+
1 row in set (0.01 sec)
  • ROUND(x,y)函数:返回参数 x 的四舍五入的有 y 位小数的值。
    如果是整数,将会保留 y 位数量的 0;如果不写 y,则默认 y 为 0,即将 x 四舍五入后取整。
    适合于将所有数字保留同样小数位的情况。如下例所示。
mysql> select round(1,1),round(1.1,2),round(1,2);
+------------+--------------+------------+
| round(1,1) | round(1.1,2) | round(1,2) |
+------------+--------------+------------+
|          1 |         1.10 |          1 |
+------------+--------------+------------+
1 row in set (0.00 sec)
  • TRUNCATE(x,y)函数:返回数字 x 截断为 y 位小数的结果。
    注意 TRUNCATE 和 ROUND 的区别在于 TRUNCATE 仅仅是截断,而不进行四舍五入。下例中
    描述了二者的区别:
mysql> select round(1.235,2),truncate(1.235,2);
+----------------+-------------------+
| round(1.235,2) | truncate(1.235,2) |
+----------------+-------------------+
|           1.24 |              1.23 |
+----------------+-------------------+
1 row in set (0.00 sec)

日期和时间函数

  • CURDATE()函数:返回当前日期,只包含年月日。
mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2018-10-14 |
+------------+
1 row in set (0.15 sec)
  • CURTIME()函数:返回当前时间,只包含时分秒。
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 15:22:53  |
+-----------+
1 row in set (0.02 sec)

  • NOW()函数:返回当前的日期和时间,年月日时分秒全都包含。
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-10-14 15:24:06 |
+---------------------+
1 row in set (0.00 sec)

  • UNIX_TIMESTAMP(date)函数:返回日期 date 的 UNIX 时间戳。
mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
|       1539501927 |
+------------------+
1 row in set (0.00 sec)
  • FROM_UNIXTIME ( unixtime ) 函 数 : 返 回 UNIXTIME 时 间 戳 的 日 期 值 , 和
    UNIX_TIMESTAMP(date)互为逆操作。
mysql> select from_unixtime(1539501927);
+---------------------------+
| from_unixtime(1539501927) |
+---------------------------+
| 2018-10-14 15:25:27       |
+---------------------------+
1 row in set (0.00 sec)

  • WEEK(DATE)和 YEAR(DATE)函数:前者返回所给的日期是一年中的第几周,后者返回所
    给的日期是哪一年。
mysql> select week(now()),year(now());
+-------------+-------------+
| week(now()) | year(now()) |
+-------------+-------------+
|          41 |        2018 |
+-------------+-------------+
1 row in set (0.00 sec)

  • HOUR(time)和 MINUTE(time)函数:前者返回所给时间的小时,后者返回所给时间的分钟。
mysql> select hour(curtime()),minute(curtime());
+-----------------+-------------------+
| hour(curtime()) | minute(curtime()) |
+-----------------+-------------------+
|              15 |                30 |
+-----------------+-------------------+
1 row in set (0.00 sec)
  • MONTHNAME(date)函数:返回 date 的英文月份名称。
mysql> select monthname(now());
+------------------+
| monthname(now()) |
+------------------+
| October          |
+------------------+
1 row in set (0.00 sec)
  • DATEDIFF(date1,date2)函数:用来计算两个日期之间相差的天数。
    下面的例子计算出当前距离2019年还有多少天:
mysql> select datediff('2019-01-01',now());
+------------------------------+
| datediff('2019-01-01',now()) |
+------------------------------+
|                           79 |
+------------------------------+
1 row in set (0.00 sec)

流程函数

下面的例子中模拟了对职员薪水进行分类,这里首先创建并初始化一个职员薪水表:

mysql> create table salary(userid int,salary decimal(9,2));
Query OK, 0 rows affected (0.34 sec)

插入一些测试数据:

mysql> insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null);
Query OK, 6 rows affected (0.06 sec)
Records: 6  Duplicates: 0  Warnings: 0

接下来,通过这个表来介绍各个函数的应用。

  • IF(value,t,f)函数:我们认为月薪在 2000 元以上的职员属于高薪,用“high”表示;而
    2000 元以下的职员属于低薪,用“low”表示。
mysql> select if(salary>2000,'high','low') from salary;
+------------------------------+
| if(salary>2000,'high','low') |
+------------------------------+
| low                          |
| low                          |
| high                         |
| high                         |
| high                         |
| low                          |
+------------------------------+
6 rows in set (0.00 sec)

  • IFNULL(value1,value2)函数:这个函数一般用来替换 NULL 值的,我们知道 NULL 值是不
    能参与数值运算的,下面这个语句就是把 NULL 值用 0 来替换。
mysql> select ifnull(salary,0) from salary;
+------------------+
| ifnull(salary,0) |
+------------------+
|          1000.00 |
|          2000.00 |
|          3000.00 |
|          4000.00 |
|          5000.00 |
|             0.00 |
+------------------+
6 rows in set (0.00 sec)

  • CASE WHEN [value1] THEN[result1]…ELSE[default]END 函 数 : 我 们 也 可 以 用 case
    when…then 函数实现上面例子中高薪低薪的问题。
mysql> select case when salary<=2000 then 'low' else 'high' end from salary;
+---------------------------------------------------+
| case when salary<=2000 then 'low' else 'high' end |
+---------------------------------------------------+
| low                                               |
| low                                               |
| high                                              |
| high                                              |
| high                                              |
| high                                              |
+---------------------------------------------------+
6 rows in set (0.00 sec)

CASE [expr] WHEN [value1] THEN[result1]…ELSE[default]END 函数:这里还可以分多种情况把职
员的薪水分多个档次,比如下面的例子分成高、中、低 3 种情况。

mysql> select case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end from salary;
+-----------------------------------------------------------------------+
| case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end |
+-----------------------------------------------------------------------+
| low                                                                   |
| mid                                                                   |
| high                                                                  |
| high                                                                  |
| high                                                                  |
| high                                                                  |
+-----------------------------------------------------------------------+
6 rows in set (0.00 sec)

其他常用函数

  • DATABASE()函数:返回当前数据库名。
mysql> select database();
+------------+
| database() |
+------------+
| hyp01      |
+------------+
1 row in set (0.00 sec)

  • VERSION()函数:返回当前数据库版本。
mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.7.23-0ubuntu0.18.04.1 |
+-------------------------+
1 row in set (0.01 sec)
  • USER()函数:返回当前登录用户名。
mysql> select user();
+---------------+
| user()        |
+---------------+
| hyp@localhost |
+---------------+
1 row in set (0.00 sec)

  • MD5(str)函数:返回字符串 str 的 MD5 值,常用来对应用中的数据进行加密。
mysql> select md5('123345');
+----------------------------------+
| md5('123345')                    |
+----------------------------------+
| 42dae262b8531b3df48cde9cc018c512 |
+----------------------------------+
1 row in set (0.00 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值