侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

MySql其他函数的使用方式

孔子说JAVA
2022-09-19 / 0 评论 / 0 点赞 / 21 阅读 / 3,174 字 / 正在检测是否收录...

MySQL数据库中提供了很丰富的函数,这些函数可以帮助用户更加方便的处理表中的数据,他们会对传递进来的参数进行处理,并返回一个处理结果,也就是返回一个值。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。SELECT语句及其条件表达式都可以使用这些函数。同时,INSERT 、UPDATE、DELECT语句及其条件表达式也可以使用这些函数。本文主要讲解格式化函数、进制转换函数等其他函数。函数列表如下:

函数名称 作 用
FORMAT(x,n) 将数字x进行格式化,保留小数点后n位。
GET_LOCK(name,time) 定义一个名称为nam、持续时间长度为time秒的锁
RELEASE_LOCK(name) 解除名称为name的锁
IS_FREE_LOCK(name) 判断是否已使用名为name的锁定
BENCHMARK(count.expr) 将表达式expr重复执行count次,返回执行时间

1、FORMAT(x,n) 格式化函数

格式化函数 FORMAT(x,n) 可以将数字x进行格式化,将x保留到小数点后n位。

mysql> SELECT FORMAT(3.1415926,3);
+----------------------------------+
| FORMAT(3.1415926,3)              |
+----------------------------------+
| 3.142                            |
+----------------------------------+
1 row in set (0.00 sec)

2、加锁函数和解锁函数

MySQL中显式锁(MySQL用户级锁函数)的特点是使用起来更加灵活与个性,相比MySQL隐式的行级锁不同,用户级锁函数使用的可控性更强,可以个性化指定“锁的名称”和锁的过期时间,以及探测锁的可用性等。与传统的隐式锁不同的是,显式锁需要用户显式加锁与解锁,并且该类所也不会随着事务的提交或者回滚而释放,需要显式释放,与此同时,可能会对MySQL的复制产生一定的副作用。

GET_LOCK(name,time)函数定义一个名称为name、持续时间长度为time秒的锁。如果锁定成功,则返回1;如果尝试超时,则返回0;如果遇到错误,返回NULL。

  • 尝试使用超时秒数的超时获得一个由字符串str给出的名称的锁。
  • 负超时值意味着无限超时。
  • 锁是独占的。
  • 只能由一个会话持有,其他会话无法获得同名的锁。

RELEASE_LOCK(name)函数解除名称为name的锁。如果解锁成功,则返回1;如果尝试超时,返回0了如果解锁失败,返回NULL;

  • 获取了锁之后,用完了,就要释放,不然别的sql就执行不了。

RELEASE_ALL_LOCKS()函数释放当前会话持有的所有命名锁并返回释放的锁数(如果没有,则为0)

IS_FREE_LOCK(name)函数判断是否已使用名为name的锁定。如果使用,返回0,否则,返回1;

  • 检查名为str 的锁是否可以使用(即未锁定)。如果锁空闲(没有人使用锁),则返回1,如果锁正在使用,则返回0,如果发生错误(例如不正确的参数),则返回NULL。

IS_USED_LOCK(锁名)函数检查锁是否正在被使用,返回结果为当前连接ID。

  • 检查名为str 的锁是否正在使用中(即锁定)。如果是,则返回持有锁的客户端会话的连接标识符。否则,它返回NULL。

GET_LOCK、RELEASE_LOCK、IS_FREE_LOCK、IS_USED_LOCK基于同样的锁名才有效,如果是不一样的锁名肯定就么有用了。

假如用GET_LOCK()得到的锁,当执行RELEASE_LOCK()或连接断开(正常或非正常)时,这个锁就会解除。

SELECT GET_LOCK('MySQL',10) AS GetLock,
    IS_USED_LOCK('MySQL') AS ISUsedLock,
    IS_FREE_LOCK('MySQL') AS ISFreeLock,
    RELEASE_LOCK('MySQL') AS ReleaseLock;

image-1663233338209

从上图中代码执行的结果可以看出:

  • GET_LOCK(‘MySQL’,10)返回结果为1,说明成功得到了一个名称为’MySQL’的锁,持续时间为10秒。
  • IS_USED_LOCK(‘MySQL’)返回结果为当前连接ID,表示名称为’MySQL’的锁正在被使用。
  • IS_FREE_LOCK(‘MySQL’)返回结果为0,说明名称为’MySQL’的锁正在被使用。
  • RELEASE_LOCK(‘MySQL’)返回值为1,说明解锁成功。

3、重复执行指定操作的函数

BENCHMARK(count.expr)函数将表达式expr重复执行count次,然后返回执行时间。该函数可以用来判断MySQL处理表达式的速度。

  • 表达式可以是sql语句,也可以是函数。
mysql> SELECT BENCHMARK(10000,NOW());
+----------------------------------+
| BENCHMARK(10000,NOW())           |
+----------------------------------+
| 0                                |
+----------------------------------+
1 row in set (0.00 sec)

我们可以把count值改大了,这样执行的时间就会变长。

mysql> SELECT BENCHMARK(1000000,NOW());
+----------------------------------+
| BENCHMARK(1000000,NOW())         |
+----------------------------------+
| 0                                |
+----------------------------------+
1 row in set (0.01 sec)

expr可以是其他函数或表达式:

mysql> SELECT BENCHMARK(1000000,md5('test'));
+----------------------------------+
| BENCHMARK(1000000,md5('test'))   |
+----------------------------------+
| 0                                |
+----------------------------------+
1 row in set (0.01 sec)

mysql> SELECT BENCHMARK(1000000,1+1);
+----------------------------------+
| BENCHMARK(1000000,1+1)           |
+----------------------------------+
| 0                                |
+----------------------------------+
1 row in set (0.01 sec)

expr还可以是sql语句:

mysql> SELECT BENCHMARK(10000000,'select * from goods');
+-------------------------------------------------+
| BENCHMARK(10000000,'select * from goods')       |
+-------------------------------------------------+
| 0                                               |
+-------------------------------------------------+
1 row in set (0.03 sec)
0

评论区