moon

ywc : hello world

【MySQL视频笔记5】mysql函数

一、数学函数

  • ABS(x) 返回绝对值

  • ACOS() 返回X的反余弦值,即余弦值为X的值。如果X不在-1到1的范围内,则返回NULL。

mysql> SELECT ACOS(1);
        -> 0
mysql> SELECT ACOS(1.0001);
        -> NULL
mysql> SELECT ACOS(0);
        -> 1.5707963267949
  • ASIN(X) 返回X的反正弦值,即正弦为X的值。如果X不在-1到1的范围内,则返回NULL。
mysql> SELECT ASIN(0.2);
        -> 0.20135792079033
mysql> SELECT ASIN('foo');

+-------------+
| ASIN('foo') |
+-------------+
|           0 |
+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'foo' |
+---------+------+-----------------------------------------+
  • ATAN(X) 返回X的反正切值,即正切值为X的值。
mysql> SELECT ATAN(2);
        -> 1.1071487177941
mysql> SELECT ATAN(-2);
        -> -1.1071487177941
  • ATAN(Y,X), ATAN2(Y,X) 返回Y / X的反正切值,两个参数的符号用于确定结果的象限。
mysql> SELECT ATAN(-2,2);
        -> -0.78539816339745
mysql> SELECT ATAN2(PI(),0);
        -> 1.5707963267949
  • CEIL(X),CEILING(x) 返回大于x的最小整数
mysql> SELECT CEILING(1.23);
        -> 2
mysql> SELECT CEILING(-1.23);
        -> -1

对于精确值数字参数,返回值具有精确值数字类型。
对于字符串或浮点参数,返回值具有浮点类型。

  • CONV(N,from_base,to_base)
    在不同的数字基础之间转换数字。
    返回数字N的字符串表示形式,从基本from_base转换为基本to_base
    如果任何参数为NULL,则返回NULL。
    参数N被解释为整数,但可以指定为整数或字符串。
    最小基数为2,最大基数为36.
    如果from_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'+X'0a',10,10);
        -> '40'
  • bin(x) 返回x二进制(oct 八进制,hex 十六进制)
mysql> select bin(7);
+--------+
| bin(7) |
+--------+
| 111    |
+--------+
  • floor() 返回小于x的最大整数

  • exp(x)返回e的x次方(e,自然对数函数的底数 lnx, 约2.718281828459045…)

mysql> select exp(1);
+-------------------+
| exp(1)            |
+-------------------+
| 2.718281828459045 |
+-------------------+
  • RAND()RAND(N)
    返回一个随机浮点值 v ,范围在 0 到1 之间 (即, 其范围为 0 ≤ v ≤ 1.0)。
    若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列。
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.7019567384402796 |
+--------------------+
  • LOCATE(substr,str) , LOCATE(substr,str,pos)
    第一个语法返回字符串 str中子字符串substr的第一个出现位置。
    第二个语法返回字符串 str中子字符串substr的第一个出现位置, 起始位置在pos。
    如若substr 不在str中,则返回值为0。
mysql> select locate('世','你好 世界');
+--------------------------+
| locate('世','你好 世界')           |
+--------------------------+
|                        4 |
+--------------------------+

mysql> select locate('a','hello world');
+---------------------------+
| locate('a','hello world') |
+---------------------------+
|                         0 |
+---------------------------+
  • POSITION(substr IN str) 返回字符串第一次出现的位置
mysql> select position('@' in 'ywc@2018.cmo');
+---------------------------------+
| position('@' in 'ywc@2018.cmo') |
+---------------------------------+
|                               4 |
+---------------------------------+
  • right(str,len) 从字符串 str 右边开始,返回 len 个字符。
mysql> select right('hello world',3);
+------------------------+
| right('hello world',3) |
+------------------------+
| rld                    |
+------------------------+
//取出@后缀
mysql> select id,email,right(email,length(email)-position('@' in `email`)) as hz
 from email;
+------+-----------------+-----------+
| id   | email           | hz        |
+------+-----------------+-----------+
|    1 | ywc@qq.com      | qq.com    |
|    2 | moon@sina.cn    | sina.cn   |
|    3 | ymoon@gmail.com | gmail.com |
+------+-----------------+-----------+

所以存储的时候可以把email以@为界,分别存储在两个列中,在想查询后缀的时候可省去以上,优化了数据库查询

二、聚合函数

  • group_concat(col) 返回属于一组的列值连接组合而成的结果
mysql> select goods_id,cat_id from goods where cat_id=24;
+----------+--------+
| goods_id | cat_id |
+----------+--------+
|       69 |     24 |
|       70 |     24 |
|       72 |     24 |
|       64 |     24 |
|       63 |     24 |
|       61 |     24 |
|       62 |     24 |
|       68 |     24 |
+----------+--------+

mysql> select group_concat(goods_id,'') from goods where cat_id=24;
+---------------------------+
| group_concat(goods_id,'') |
+---------------------------+
| 69,70,72,64,63,61,62,68   |
+---------------------------+

三、字符串函数

  • ascii(char) 返回字符串的ASCII码值
mysql> select ascii('a');
+------------+
| ascii('a') |
+------------+
|         97 |
+------------+
  • length(str)返回字符串str的字节数
mysql> select length('hello world');
+-----------------------+
| length('hello world') |
+-----------------------+
|                    11 |
+-----------------------+

mysql> select length('你好 世界'); //gbk编码的字符,空格占两个字节
+---------------------+
| length('你好 世界')  |
+---------------------+
|                   9 |
+---------------------+

mysql> select tid,tname,length(tname) from t; //utf8编码的字符占三个字节
+------+----------+---------------+
| tid  | tname    | length(tname) |
+------+----------+---------------+
|    1 | 国安      |             6 |
|    2 | 甲花      |             6 |
|    3 | 公益联队   |            12 |
+------+----------+---------------+
  • char_length(str)返回字符串str的字符数
mysql> select tid,tname,length(tname),char_length(tname) from t;
+------+----------+---------------+--------------------+
| tid  | tname    | length(tname) | char_length(tname) |
+------+----------+---------------+--------------------+
|    1 | 国安         |             6 |                  2 |
|    2 | 甲花        |             6 |                  2 |
|    3 | 公益联队         |            12 |                  4 |
+------+----------+---------------+--------------------+
  • reverse(str) 反转字符串str
mysql> select tid,tname,reverse(tname) from t;
+------+----------+----------------+
| tid  | tname    | reverse(tname) |
+------+----------+----------------+
|    1 | 国安         | 安国               |
|    2 | 甲花        | 花甲               |
|    3 | 公益联队         | 队联益公             |
+------+----------+----------------+

四、日期函数

  • now()获取当前日期和时间
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-05-16 13:47:51 |
+---------------------+
  • curdate(),current_date()返回当前日期
mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2018-05-16 |
+------------+
  • curdate(),current_date()返回当前时间
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 13:50:14  |
+-----------+
  • dayofweek(date) 返回 date 在那周的第几天
mysql> select dayofweek('2018-05-16');
+----------------------+
| dayofweek(curdate()) |
+----------------------+
|                    4 |
+----------------------+

//注意:周日是第一天
  • week(date) 返回日期 date 在当年的第几周
mysql> select week(curdate());
+-----------------+
| week(curdate()) |
+-----------------+
|              19 |
+-----------------+

问:按周统计加班时间

如下表,1~5 的 num 相加,6~12 的 num 相加

mysql> select * from overtime;
+------+------------+
|num   |  date      |
+------+------------+
|    5 | 2018-05-01 |
|    6 | 2018-05-02 |
|    7 | 2018-05-03 |
|    8 | 2018-05-04 |
|    9 | 2018-05-05 |
|   10 | 2018-05-06 |
|   11 | 2018-05-07 |
|   12 | 2018-05-08 |
|   13 | 2018-05-09 |
|   14 | 2018-05-10 |
|   15 | 2018-05-11 |
|   16 | 2018-05-12 |
+------+------------+

答:
mysql> select sum(num) as overtime,week(dt) as wk from overtime group by wk;
+----------+------+
| overtime | wk   |
+----------+------+
|       35 |   17 |
|       91 |   18 |
+----------+------+

五、加密函数

  • md5(str)计算字符串str的md5效验和
mysql> select md5('123');
+----------------------------------+
| md5('123')                       |
+----------------------------------+
| 202cb962ac59075b964b07152d234b70 |
+----------------------------------+
//该加密算法不可逆

良好的加密:
1.不可逆。 即不可以根据加密后的值逆推原值
2.碰撞性底。 即两个加密后的值重复的可能性底

六、流程控制函数

  • 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

    在第一个方案的返回结果中, value=compare-value。
    第二个方案的返回结果是第一种情况的真实结果。
    如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。

mysql> select * from b;
+------+------+
| id   | num  |
+------+------+
| b    |    5 |
| c    |   10 |
| d    |   15 |
| e    | NULL |
+------+------+
4 rows in set (0.00 sec)

mysql> SELECT
    ->  id,
    ->  CASE `num`
    -> WHEN 5 THEN
    ->  '值5'
    -> WHEN 10 THEN
    ->  10
    -> WHEN 15 THEN
    ->  '值15'
    -> ELSE
    ->  '其他值'
    -> END AS nums
    -> FROM
    ->  b;
+------+--------+
| id   | nums   |
+------+--------+
| b    | 值5     |
| c    | 10     |
| d    | 值15    |
| e    | 其他值      |
+------+--------+
4 rows in set, 1 warning (0.01 sec)


mysql> SELECT
    ->  id,
    ->  CASE
    -> WHEN num THEN
    ->  1
    -> ELSE
    ->  0
    -> END AS nums
    -> FROM
    ->  b;
+------+------+
| id   | nums |
+------+------+
| b    |    1 |
| c    |    1 |
| d    |    1 |
| e    |    0 |
+------+------+
4 rows in set (0.00 sec)
  • IF(expr1,expr2,expr3)
    如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。
mysql> SELECT
    ->  id,
    -> IF (num = 5, '值5', '其他') AS num
    -> FROM
    ->  b;
+------+------+
| id   | num  |
+------+------+
| b    | 值5   |
| c    | 其他     |
| d    | 其他     |
| e    | 其他     |
+------+------+
4 rows in set, 1 warning (0.00 sec)
  • IFNULL(expr1,expr2)
    假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。
mysql> SELECT
    ->  id,
    -> IFNULL (num,'expr1为NULL') AS num
    -> FROM
    ->  b;
+------+-------------+
| id   | num         |
+------+-------------+
| b    | 5           |
| c    | 10          |
| d    | 15          |
| e    | expr1为NULL  |
+------+-------------+
4 rows in set (0.00 sec)
  • NULLIF(expr1,expr2)
    如果expr1 = expr2 成立,那么返回值为NULL,否则返回值为 expr1。
mysql> SELECT
    ->  id,
    -> NULLIF (num,5) as num
    -> FROM
    ->  b;
+------+------+
| id   | num  |
+------+------+
| b    | NULL |
| c    |   10 |
| d    |   15 |
| e    | NULL |
+------+------+
4 rows in set (0.00 sec)

七、系统函数

  • user()
    返回用户及所在主机,判断自己身份
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
  • database()
    返回当前正在操作的数据库
mysql> select database();
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)
  • version()
    返回当前数据库版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.53    |
+-----------+
1 row in set (0.03 sec)

使用mysql函数会影响查询速度,应通过表结构等减少函数的使用

阅读更多
版权声明:本文为ywcmoon原创文章,未经允许不得转载。 https://blog.csdn.net/qq_39251267/article/details/80322781
个人分类: MySQL数据库
想对作者说点什么? 我来说一句

韩忠康mysql视频教程笔记

2017年09月20日 6.69MB 下载

没有更多推荐了,返回首页

不良信息举报

【MySQL视频笔记5】mysql函数

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭