SQL中的常用函数
SQL中常用的函数可分为:
- 字符串函数
- 日期函数
- 数值函数
字符串函数
函数 | 描述 |
---|---|
CONCAT(S1, S2,…,SN) | 连接多个字符串为一个字符串 |
INSERT(str, x, y, instr) | 将字符串str从x位置开始,y个字符长的子串替换为字符串instr |
LOWER(str) | 将字符串中的所有字符变成小写 |
UPPER(str) | 将字符串中的所有字符变成大写 |
LEFT(str, x) | 返回字符串最左边的x个字符 |
RIGHT(str, x) | 返回字符串最右边的x个字符 |
LPAD(str, n, pad) | 用字符串pad对str最左边进行填充,直到长度为n个字符长度 |
RPAD(str, n, pad) | 用字符串pad对str最右边进行填充,直到长度为n个字符长度 |
LTRIM(str) | 去掉字符串str左侧的空格 |
RTRIM(str) | 去掉字符串str右侧的空格 |
REPEAT(str) | 返回str重复x次的结果 |
STRCMP(s1, s2) | 比较两个字符串ASCII码值的大小 |
TRIM(str) | 去掉字符串首尾的空格 |
SUBSTRING(str, x, y) | 返回从字符串str的x位置起y个字符长度的子串 |
mysql> SELECT CONCAT('a', 'b'), CONCAT('a', NULL);
+------------------+-------------------+
| CONCAT('a', 'b') | CONCAT('a', NULL) |
+------------------+-------------------+
| ab | NULL |
+------------------+-------------------+
1 row in set (0.00 sec)
NOTE:任何字符串和NULL拼接得到的结果都是NULL
mysql> SELECT INSERT('aaaaa', 2, 2, 'b');
+----------------------------+
| INSERT('aaaaa', 2, 2, 'b') |
+----------------------------+
| abaa |
+----------------------------+
1 row in set (0.00 sec)
mysql> SELECT LOWER('MYSQL'), UPPER('mysql');
+----------------+----------------+
| LOWER('MYSQL') | UPPER('mysql') |
+----------------+----------------+
| mysql | MYSQL |
+----------------+----------------+
1 row in set (0.00 sec)
mysql> SELECT LEFT('mysql', 2), RIGHT('mysql', 2);
+------------------+-------------------+
| LEFT('mysql', 2) | RIGHT('mysql', 2) |
+------------------+-------------------+
| my | ql |
+------------------+-------------------+
1 row in set (0.00 sec)
mysql> SELECT LEFT('mysql', 2), RIGHT('mysql', 2), LEFT('mysql', NULL), RIGHT('mysql', NULL);
+------------------+-------------------+---------------------+----------------------+
| LEFT('mysql', 2) | RIGHT('mysql', 2) | LEFT('mysql', NULL) | RIGHT('mysql', NULL) |
+------------------+-------------------+---------------------+----------------------+
| my | ql | NULL | NULL |
+------------------+-------------------+---------------------+----------------------+
1 row in set (0.00 sec)
如果LEFT或是RIGHT指定长度为NULL时,这里同样返回NULL
mysql> SELECT LPAD('MYSQL', 13, 'LOVE'), RPAD('MYSQL', 13, 'LOVE');
+---------------------------+---------------------------+
| LPAD('MYSQL', 13, 'LOVE') | RPAD('MYSQL', 13, 'LOVE') |
+---------------------------+---------------------------+
| LOVELOVEMYSQL | MYSQLLOVELOVE |
+---------------------------+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT LTRIM(' | MYSQL '), RTRIM(' MYSQL| ');
+-----------------------+-----------------------+
| LTRIM(' | MYSQL ') | RTRIM(' MYSQL| ') |
+-----------------------+-----------------------+
| | MYSQL | MYSQL| |
+-----------------------+-----------------------+
1 row in set (0.00 sec)
mysql> SELECT STRCMP('MYSQL', 'MYSQL'), STRCMP('MYSQL', 'ORACLE');
+--------------------------+---------------------------+
| STRCMP('MYSQL', 'MYSQL') | STRCMP('MYSQL', 'ORACLE') |
+--------------------------+---------------------------+
| 0 | -1 |
+--------------------------+---------------------------+
1 row in set (0.01 sec)
其他的根据函数描述就知道用法,这里就不做试验了。
数值函数
函数 | 描述 |
---|---|
ABS(x) | 返回x的绝对值 |
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x, y) | 返回 x / y 的模 |
RAND() | 生成0~1之间的随机数 |
ROUND(x, y) | 返回x的四舍五入的有y位小数的值 |
TRUNCATE(x, y) | 返回x截断位y位小数的结果,仅仅截断不进行四舍五入 |
mysql> SELECT ROUND(1.2222, 3), ROUND(1.2, 3);
+------------------+---------------+
| ROUND(1.2222, 3) | ROUND(1.2, 3) |
+------------------+---------------+
| 1.222 | 1.200 |
+------------------+---------------+
1 row in set (0.00 sec)
mysql> SELECT TRUNCATE(1.222, 2);
+--------------------+
| TRUNCATE(1.222, 2) |
+--------------------+
| 1.22 |
+--------------------+
1 row in set (0.00 sec)
日期和时间函数
函数 | 描述 |
---|---|
CURDATE() | 返回当前时间 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前的日期和时间 |
UNIX_TIMESTAMP(date) | 返回日期date的UNIX时间戳 |
FROM_UNIXTIME | 返回UNIX时间戳的日期值 |
WEEK(date) | 返回date为一年中的第几周 |
YEAR(date) | 返回date的年份 |
HOUR(time) | 返回time的小时值 |
MINUTE(time) | 返回time的分钟值 |
MONTHNAME(date) | 返回date的月份名 |
DATE_FORMAT(date, fmt) | 返回按字符串fmt格式化日期date值 |
DATE_ADD(date, INTERVAL expr type) | 返回一个日期或事件值加上一个时间间隔的时间值 |
DATEDIFF(expr, expr2) | 返回起始时间expr和结束时间expr2之间的天数 |
mysql> SELECT CURDATE(), CURTIME(), NOW();
+------------+-----------+---------------------+
| CURDATE() | CURTIME() | NOW() |
+------------+-----------+---------------------+
| 2020-04-16 | 17:44:54 | 2020-04-16 17:44:54 |
+------------+-----------+---------------------+
1 row in set (0.01 sec)
mysql> SELECT WEEK(NOW()), YEAR(NOW()), HOUR(CURTIME()), MINUTE(CURTIME()), MONTHNAME(NOW());
+-------------+-------------+-----------------+-------------------+------------------+
| WEEK(NOW()) | YEAR(NOW()) | HOUR(CURTIME()) | MINUTE(CURTIME()) | MONTHNAME(NOW()) |
+-------------+-------------+-----------------+-------------------+------------------+
| 15 | 2020 | 17 | 47 | April |
+-------------+-------------+-----------------+-------------------+------------------+
1 row in set (0.01 sec)
mysql> SELECT DATEDIFF('2008-08-08', NOW());
+-------------------------------+
| DATEDIFF('2008-08-08', NOW()) |
+-------------------------------+
| -4269 |
+-------------------------------+
1 row in set (0.01 sec)
流程函数
| 函数 | 描述 |
| :----------------------------------------------------------- | ------------------------------------------------ |
| IF(value,t, f) | 如果value为真,返回t,否则返回f |
| IFNULL(value1, value2) | 如果value不为空。返回value1,否则返回value2 |
| CASE WHEN [value1] THEN [results]...ELSE [default] END | 如果value为真,返回result1, 否则返回default |
| CASE [expr] WHEN [value] THEN [results] ... ELSE[default] END | 如果expr等于value1,返回result1,否则返回default |
mysql> SELECT IF(points > 2500, 'high', 'low') FROM CUSTOMERS;
+----------------------------------+
| IF(points > 2500, 'high', 'low') |
+----------------------------------+
| low |
| low |
| high |
| low |
| high |
| high |
| low |
| low |
| low |
| low |
| low |
+----------------------------------+
11 rows in set (0.00 sec)
mysql> SELECT IFNULL(CUSTOMERS, 0) FROM CUSTOMERS;
ERROR 1054 (42S22): Unknown column 'CUSTOMERS' in 'field list'
mysql> SELECT IFNULL(points, 0) FROM CUSTOMERS;
+-------------------+
| IFNULL(points, 0) |
+-------------------+
| 2273 |
| 947 |
| 2967 |
| 457 |
| 3675 |
| 3073 |
| 1672 |
| 205 |
| 1486 |
| 796 |
| 81 |
+-------------------+
11 rows in set (0.00 sec)
mysql> SELECT CASE WHEN points > 2500 THEN 'high' ELSE 'low' END FROM CUSTOMERS;
+----------------------------------------------------+
| CASE WHEN points > 2500 THEN 'high' ELSE 'low' END |
+----------------------------------------------------+
| low |
| low |
| high |
| low |
| high |
| high |
| low |
| low |
| low |
| low |
| low |
+----------------------------------------------------+
11 rows in set (0.00 sec)
其他常用函数
函数 | 描述 |
---|---|
DATABASE() | 返回当前数据库名 |
VERSION() | 返回当前数据库版本 |
USER() | 返回当前登录用户名 |
INET_ATON(IP) | 返回IP地址的数字表示 |
INET_NTOA(num) | 返回数字代表的IP地址 |
PASSWORD(str) | 返回sr的加密版本,一个41位的字符串 |
MD5(str) | 返回str的MD5值 |