与MSSQL对比学习MYSQL的心得(六)--函数(3)
MYSQL
SELECT EXTRACT(YEAR FROM '2013-2-3')
7、时间和秒钟转换的函数
TIME_TO_SEC(time)返回已转化为秒的time参数,转换公式为:小时*3600+分钟*60+秒
SELECT TIME_TO_SEC('23:22:00')
SEC_TO_TIME(second)函数可以将秒转换为小时、分钟和秒数的second参数值
SELECT SEC_TO_TIME('84120')
SEC_TO_TIME(second)函数和TIME_TO_SEC(time)函数互为反函数
8、计算日期和时间的函数
MYSQL里计算日期和时间的函数比较多
增加日期:DATE_ADD(date,interval expr type),ADDDATE(date,interval expr type)
减去日期:DATE_SUB(date,interval expr type),SUBDATE(date,interval expr type)
增加时间:ADD_TIME(date,expr)
减去时间:SUBTIME(date,expr)
时间差:DATEDIFF()
日期和时间格式化:
DATE_FORMAT(date,format)
TIME_FORMAT(time,format)
返回日期时间字符串的显示格式:GET_FORMAT(val_type,format_type)
相对来说,SQLSERVER在时间日期方面的计算就没有那么多函数了
基本上SQLSERVER利用下面两个函数来通杀日期时间计算的场景
SELECT DATEADD(),DATEDIFF()
条件判断函数
条件判断函数也称为流程控制函数,根据满足的条件的不同,执行相应的流程。
MYSQL中进行条件判断的函数有IF、IFNULL、CASE
虽然SQLSERVER里也有IF和CASE,不过MYSQL里的IF语句的语法跟SQLERVER有很大出入
1、IF(expr,v1,v2)函数
IF(expr,v1,v2)如果表达式expr是TRUE(expr<>0 and expr<>NULL),则IF()的返回值为v1;
否则返回值为v2。IF()的返回值为数字值或字符串值,具体情况视其所在语境而定
SELECT IF(1>2,2,3)
1>2的结果为FALSE,IF(1>2,2,3)返回第二个表达式的值3。
TIPS:如果v1或v2中只有一个明确是NULL,则IF()函数的结果类型为非NULL表达式的结果类型。
2、IFNULL(V1,V2)函数
IFNULL(V1,V2)假如v1不为NULL,则IFNULL(V1,V2)的返回值为v1;否则其返回值为v2。
IFNULL()的返回值是数字或是字符串,具体情况视语境而定
SELECT IFNULL(1,2),IFNULL(NULL,10)
IFNULL(1,2)虽然第二个值也不为空,但返回结果依然是第一个值;
IFNULL(NULL,10)第一个值为空,因此返回“10”
注意:IFNULL(V1,V2)函数跟SQLSERVER里的 SELECT NULLIF() 函数不一样
SQLSERVER里的NULLIF函数
需要两个参数,如果两个指定的表达式等价,则返回null
例子:NULLIF(a,b)
说明:如果a和b是相等的,那么返回NULL,如果不相等返回a
select NULLIF('eqeqweqwe','1') 结果是eqeqweqwe
select NULLIF(1,1) 结果是NULL
a和b的类型要一致
3、CASE函数
注意:一个CASE表达式的默认返回值类型是任何返回值的相容集合类型,但具体情况视其所在语境而定。
如果用字符串语境中,则返回结果为字符串。如果用在数字语境中,则返回结果为十进制、实数值或整数值
这个数据类型在拼接SQL语句的时候特别容易忽略,有时候会在拼接SQL语句的时候,case 后面的表达式或者when后面的表达式不一致报错!
参考文章:http://support.microsoft.com/kb/969467/zh-cn
修补程序: 错误消息,当您运行查询时,SQL Server 2008年中使用 CASE 函数:"转换失败时转换为数据类型 < Type2 > < Type1 > 值 < 值 >"
在MSDN论坛也有一个相关的帖子,大概是因为拼接sql的时候case 后面的表达式值的数据类型和else后面的表达式值的数据类型不一致导致拼接sql失败
具体的帖子地址忘记了,也找不到,如果找到以后会补充上
系统信息函数
1、获取MYSQL版本号、连接数和数据库名的函数
VERSION()返回指示MYSQL服务器版本的字符串。这个字符串使用utf8字符集
SELECT VERSION()
2、CONNECTION_ID()返回MYSQL服务器当前连接的次数,每个连接都有各自唯一的ID
查看当前用户的连接数
SELECT CONNECTION_ID()
这里返回1,返回值根据登录的次数会有不同。
3、SHOW PROCESSLIST;
4、SHOW FULL PROCESSLIST;
processlist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态
帮助识别出有问题的查询语句等。
如果是root帐号,能看到所有用户的当前连接。如果是其他普通帐号,则只能看到自己占用的连接。showprocesslist只能列出当前100条
如果想全部列出,可以使用SHOW FULL PROCESSLIST命令
SHOW PROCESSLIST
SHOW FULL PROCESSLIST
show full processlist会看到连接使用的内存
show processlist
show full processlist
各个列的含义
(1)id列,用户登录mysql时,系统分配的“connection_id”
(2)user列,显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句
(3)host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户
(4)db列,显示这个进程目前连接的是哪个数据库
(5)command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)
(6)time列,显示这个状态持续的时间,单位是秒
(7)state列,显示使用当前连接的sql语句的状态,很重要的列,后续会有所有状态的描述,state只是语句执行中的某一个状态。一个sql语句,
以查询为例
可能需要经过
copying to tmp table,
sorting result,
sending data
等状态才可以完成
(8)info列,显示这个sql语句,是判断问题语句的一个重要依据。
5、DATABASE()和SCHEMA()函数返回使用utf8字符集的默认(当前)数据库名
SELECT DATABASE(),SCHEMA()
可以看到,两个函数的作用相同
6、获取用户名的函数
USER()、CURRENT_USER()、CURRENT_USER、SYSTEM_USER()、SESSION_USER()
这几个函数返回当前被MYSQL服务器验证的用户名和主机名组合。这个值符合确定当前登录用户