SQL函数之其他函数

MySQL中文参考手册- 7 MySQL 语言参考 <!-- body { font-size: 9pt; } a:hover{color:red;} a.t1:visited{color:red;} -->

DATABASE()
返回当前的数据库名字。
mysql> select DATABASE();
        -> 'test'

如果没有当前的数据库,DATABASE() 返回空字符串。

USER()
 
SYSTEM_USER()
 
SESSION_USER()
返回当前 MySQL 用户名。
mysql> select USER();
        -> 'davida@localhost'

在MySQL 3.22.11或以后版本中,这包括用户名和客户主机名。你可以象这样只提取用户名部分(值是否包括主机名部分均可工作):

mysql> select substring_index(USER(),"@",1);
        -> 'davida'
PASSWORD(str)
从纯文本口令 str 计算一个口令字符串。该函数被用于为了在 user 授权表的 Password 列中存储口令而加密 MySQL 口令。
mysql> select PASSWORD('badpwd');
        -> '7f84554057dd964b'

PASSWORD() 加密是非可逆的。PASSWORD() 不以与Unix口令加密的相同的方法执行口令加密。你不应该假定如果你的Unix 口令和你的MySQL 口令是一样的,PASSWORD() 将导致与在Unix口令文件存储的相同的加密值。见ENCRYPT()

ENCRYPT(str[,salt])
使用Unix crypt() 系统调用加密 strsalt 参数应该是一个有2个字符的字符串。(MySQL 3.22.16中, salt 可以长于2个字符。)
mysql> select ENCRYPT("hello");
        -> 'VxuFAJXVARROc'

如果crypt() 在你的系统上不可用,ENCRYPT() 总是返回NULLENCRYPT() 只保留str 起始8个字符而忽略所有其他,至少在某些系统上是这样。这将由底层的crypt() 系统调用的行为决定。

ENCODE(str,pass_str)
使用 pass_str 作为口令加密 str 。为了解密结果,使用 DECODE() 。结果是一个二进制字符串,如果你想要在列中保存它,使用一个 BLOB 列类型。
DECODE(crypt_str,pass_str)
使用 pass_str 作为口令解密加密的字符串 crypt_strcrypt_str 应该是一个由 ENCODE() 返回的字符串。
MD5(string)
对字符串计算MD5校验和。值作为一个32长的十六进制数字被返回可以,例如用作哈希(hash)键。
mysql> select MD5("testing")
        -> 'ae2b1fca515949e5d54fb22b8ed95575'

这是一个“RSA数据安全公司的MD5消息摘要算法”。

LAST_INSERT_ID([expr])
返回被插入一个 AUTO_INCREMENT 列的最后一个自动产生的值。见 20.4.29 mysql_insert_id()
mysql> select LAST_INSERT_ID();
        -> 195

产生的最后ID以每个连接为基础在服务器被维护,它不会被其他客户改变。如果你更新另外一个有非魔术值(即,不是NULL 和不是0 的一个值)的AUTO_INCREMENT 列,它甚至不会被改变。 如果expr 作为一个参数在一个UPDATE 子句的LAST_INSERT_ID() 里面给出,那么参数值作为一个LAST_INSERT_ID() 值被返回。这可以用来模仿顺序:首先创建表:

mysql> create table sequence (id int not null);
mysql> insert into sequence values (0);

然后表能被用来产生顺序号,象这样:

mysql> update sequence set id=LAST_INSERT_ID(id+1);

你可以不调用LAST_INSERT_ID() 而产生顺序,但是这样使用函数的实用程序在服务器上自动维护ID值作为最后自动产生的值。你可以检索新的ID值,就像你能读入正常MySQL 中的任何正常的AUTO_INCREMENT 值一样。例如,LAST_INSERT_ID() (没有一个参数 )将返回新ID。C API函数mysql_insert_id() 也可被用来得到值。

FORMAT(X,D)
格式化数字 X 为类似于格式 '#,###,###.##' ,四舍五入到 D 为小数。如果 D0 ,结果将没有小数点和小数部分。
mysql> select FORMAT(12332.123456, 4);
        -> '12,332.1235'
mysql> select FORMAT(12332.1,4);
        -> '12,332.1000'
mysql> select FORMAT(12332.2,0);
        -> '12,332'
VERSION()
返回表明 MySQL 服务器版本的一个字符串。
mysql> select VERSION();
        -> '3.22.19b-log'
GET_LOCK(str,timeout)
试图获得由字符串 str 给定的一个名字的锁定,第二个 timeout 为超时。如果锁定成功获得,返回 1 ,如果尝试超时了,返回 0 ,或如果发生一个错误,返回 NULL (例如从存储器溢出或线程用 mysqladmin kill 被杀死)。当你执行 RELEASE_LOCK() 时、执行一个新的 GET_LOCK() 或线程终止时,一个锁定被释放。该函数可以用来实现应用锁或模拟记录锁,它阻止其他客户用同样名字的锁定请求;赞成一个给定的锁定字符串名字的客户可以使用字符串执行子协作建议的锁定。
mysql> select GET_LOCK("lock1",10);
        -> 1
mysql> select GET_LOCK("lock2",10);
        -> 1
mysql> select RELEASE_LOCK("lock2");
        -> 1
mysql> select RELEASE_LOCK("lock1");
        -> NULL

注意,第二个RELEASE_LOCK() 调用返回NULL ,因为锁"lock1" 自动地被第二个GET_LOCK() 调用释放。

RELEASE_LOCK(str)
释放字符串 str 命名的通过 GET_LOCK() 获得的锁。如果锁被释放,返回 1 ,如果锁没被这个线程锁定(在此情况下锁没被释放)返回 0 ,并且如果命名的锁不存在,返回 NULL 。如果锁从来没有通过调用 GET_LOCK() 获得或如果它已经被释放了,锁将不存在。
BENCHMARK(count,expr)
BENCHMARK() 函数重复 count Times次执行表达式 expr ,它可以用于计时 MySQL 处理表达式有多快。结果值总是 0 。意欲用于 mysql 客户,它报告查询的执行时间。
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
+----------------------------------------------+
| BENCHMARK(1000000,encode("hello","goodbye")) |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (4.74 sec)

报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK() 若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。

7.4.13 与GROUP BY 子句一起使用的函数

如果你在不包含GROUP BY 子句的一个语句中使用聚合函数,它等价于聚合所有行。

COUNT(expr)
返回由一个 SELECT 语句检索出来的行的非 NULL 值的数目。
mysql> select student.student_name,COUNT(*)
           from student,course
           where student.student_id=course.student_id
           GROUP BY student_name;

COUNT(*) 在它返回的检索出来的行数目上有些不同,不管他们是否包含NULL 值。如果SELECT 从一个表检索,或没有检索出其他列并且没有WHERE 子句,COUNT(*) 被优化以便快速地返回。例如:

mysql> select COUNT(*) from student;

 
 
COUNT(DISTINCT expr,[expr...])
返回一个不同值的数目。
mysql> select COUNT(DISTINCT results) from student;

MySQL 中,你可以通过给出一个表达式列表以得到不同的表达式组合的数目。在 ANSI SQL中,你可能必须在CODE(DISTINCT ..) 内进行所有表达式的连接。

AVG(expr)
返回 expr 的平均值。
mysql> select student_name, AVG(test_score)
           from student
           GROUP BY student_name;

 
 
MIN(expr)
 
MAX(expr)
返回 expr 的最小或最大值。 MIN()MAX() 可以有一个字符串参数;在这种的情况下,他们返回最小或最大的字符串值。
mysql> select student_name, MIN(test_score), MAX(test_score)
           from student
           GROUP BY student_name;

 
SUM(expr)
返回 expr 的和。注意,如果返回的集合没有行,它返回NULL!
STD(expr)
 
STDDEV(expr)
返回 expr 标准差(deviation)。这是对 ANSI SQL 的扩展。该函数的形式 STDDEV() 是提供与Oracle的兼容性。
BIT_OR(expr)
返回 expr 里所有位的位或。计算用 64 位( BIGINT )精度进行。
BIT_AND(expr)
返回 expr 里所有位的位与。计算用 64 位( BIGINT )精度进行。

MySQL 扩展了GROUP BY 的用法。你可以不出现在的GROUP BY 部分的SELECT 表达式中使用列或计算,这表示这个组的任何可能值 。你可以使用它是性能更好,避免在不必要的项目上排序和分组。例如,你在下列查询中不需要在customer.name 上聚合:

mysql> select order.custid,customer.name,max(payments)
       from order,customer
       where order.custid = customer.custid
       GROUP BY order.custid;

在 ANSI SQL中,你将必须将customer.name 加到GROUP BY 子句。在MySQL 中,名字是冗余的。

如果你从GROUP BY 部分省略的列在组中不是唯一的,不要使用这个功能。

在某些情况下,你可以使用MIN()MAX() 获得一个特定的列值,即使它不是唯一的。下例给出从包含sort 列中最小值的行的column 值:

substr(MIN(concat(sort,space(6-length(sort)),column),7,length(column)))

注意, 如果你正在使用MySQL 3.22(或更早)或如果你正在试图遵从ANSI SQL,你不能在GROUP BYORDER BY 子句中使用表达式。你可以通过使用表达式的一个别名解决此限制:

mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name
           GROUP BY id,val ORDER BY val;

MySQL 3.23中,你可以这样做:

mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值