Maison > base de données > tutoriel mysql > 与MSSQL对比学习MYSQL的心得(六)--函数_MySQL

与MSSQL对比学习MYSQL的心得(六)--函数_MySQL

WBOY
Libérer: 2016-06-01 13:05:19
original
1051 Les gens l'ont consulté

数学函数

1、求余函数MOD(X,Y)

MOD(X,Y)返回x被y除后的余数,MOD()对于带有小数部分的数值也起作用,他返回除法运算后的精确余数

SELECT MOD(31,8)

Copier après la connexion

2、四舍五入函数TRUNCATE(X,Y)

TRUNCATE(X,Y)返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小数部分。

若y设为负数,则截去(归零)x小数点左边起第y位开始后面所有低位的值。

SELECT TRUNCATE(1.32,1)

Copier après la connexion

TRUNCATE(1.32,1)保留小数点后一位数字,返回值为1.3

TIPS:ROUND(X,Y)函数在截取值的时候会四舍五入,而TRUNCATE(x,y)直接截取值,并不进行四舍五入

3、求余函数HEX(X)和UNHEX(X)函数

有以下的代码可以演示HEX和UNHEX的功能:

SELECT HEX('this is a test str')
Copier après la connexion

查询的结果为:746869732069732061207465737420737472

SELECT UNHEX('746869732069732061207465737420737472')
Copier après la connexion

查询的结果为:this is a test str

字符串函数

计算字符串字符数的函数

1、CHAR_LENGTH(STR)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符

SELECT CHAR_LENGTH('DATE')

Copier après la connexion



2、合并字符串函数CONCAT_WS(x,s1,s2,......)

CONCAT_WS(x,s1,s2,......),CONCAT_WS代表CONCAT with Separator,是CONCAT()函数的特殊形式。

第一个参数x是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是

其他参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL值。

SELECT CONCAT_WS('-','1st','2nd','3rd'),CONCAT_WS('-','1st',NULL,'3rd')

Copier après la connexion

CONCAT_WS('-','1st','2nd','3rd')使用分隔符‘-'将3个字符串连接成一个字符串,结果为“1st-2nd-3rd”;

CONCAT_WS('-','1st',NULL,'3rd')因为第二个值为NULL,所以第二个值不会出现在结果里

3、替换字符串的函数INSERT(S1,X,LEN,S2)

INSERT(S1,X,LEN,S2)函数跟SQLSERVER里的STUFF()函数的功能是一样的,这里不作介绍了

4、填充字符串的函数LPAD(S1,LEN,S2)和RPAD(S1,LEN,S2)

LPAD(S1,LEN,S2)返回字符串s1,其左边由字符串s2填补到len字符串长度。假如s1的长度大于len,则返回值被缩短至len字符。

LPAD()函数和RPAD()函数功能跟SQLSERVER里的 REPLACE()相似,不过功能更加强大

SELECT LPAD('hello',4,'??'),LPAD('hello',10,'??')

Copier après la connexion

字符串“hello”长度大于4,不需要填充,因此LPAD('hello',4,'??')只返回被缩短的长度为4的子串

字符串“hello”长度小于10,LPAD('hello',10,'??')返回结果为“?????hello”,左侧填充“?”,长度为10

5、RPAD(S1,LEN,S2)返回字符串s1,其右边被字符串s2填补至len字符长度。假如字符串s1的长度大于len,则返回值被缩短到len字符长度

SELECT RPAD('hello',4,'?')

Copier après la connexion

字符串“hello”长度大于4,不需要填充,因此RPAD('hello',4,'?')只返回被缩短的长度为4的子串"hell"

6、删除空格的函数TRIM(S)

TRIM(S)删除字符串s两侧的空格

MYSQL这里比SQLSERVER方便,SQLSERVER要删除两边的空格,需要使用: SELECT LTRIM(RTRIM(' hello '))

SELECT TRIM(' book ')

Copier après la connexion

删除指定字符串的函数TRIM(S1 FROM S)

7、TRIM(S1 FROM S)删除字符串s中两端所有的子字符串s1。s1为可选项,在未指定情况下,删除空格

SELECT TRIM('xy' FROM 'xyxboxyokxxyxy')

Copier après la connexion

'xyxboxyokxxyxy'两端的重复字符串“xy”,而中间的“xy”并不删除,结果为

xboxyokx

8、重复生成字符串的函数REPEAT(S,N)

这个函数跟SQLSERVER里的REPLICATE()函数是一样的,参数个数都是一样的,这里不作介绍了

9、比较字符串大小的函数STRCMP(S1,S2)

STRCMP(S1,S2)若所有的字符串均相同,则返回0;若根据当前分类次序,第一个参数小于第二个,则返回-1,其他情况返回1

SELECT STRCMP('txt','txt2') ,STRCMP('txt2','txt'),STRCMP('txt','txt')

Copier après la connexion

“txt”小于“txt2”,因此 STRCMP('txt','txt2') 返回结果为-1

STRCMP('txt2','txt')返回结果为1

“txt”与“txt”相等,因此STRCMP('txt','txt')返回结果为0

10、匹配子串开始位置的函数

LOCATE(STR1,STR)、POSITION(STR1 IN STR)、INSTR(STR,STR1)3个函数作用相同,返回子字符串str1在字符串str中的开始位置

这三个函数跟SQLSERVER里的CHARINDEX()函数功能类似

SELECT LOCATE('ball','football'),POSITION('ball' IN 'football') ,INSTR('football','ball')

Copier après la connexion

子字符串“ball”在字符串“football”中从第5个字母位置开始,因此3个函数返回结果都为5

11、返回指定位置的字符串的函数

ELT(N,字符串1,字符串2,字符串3,...,),若N=1,则返回值为字符串1,若N=2,则返回值为字符串2,以此类推。

若N小于1或大于参数的数目,则返回值为NULL

SELECT ELT(3,'1st','2nd','3rd'),ELT(3,'net','os')

Copier après la connexion

由结果可以看到,ELT(3,'1st','2nd','3rd')返回第3个位置的字符串“3rd”;指定返回字符串位置超出参数个数,返回NULL

12、返回指定字符串位置的函数FIELD(S,S1,S2,...)

FIELD(S,S1,S2,...)返回字符串s在列表s1,s2,......中第一次出现的位置,在找不到s的情况下,返回值为0。

如果s为NULL,则返回值为0,原因是NULL不能同任何值进行同等比较。

SELECT FIELD('hi','hihi','hey','hi','bas') AS coll,
FIELD('hi','hihi','lo','hilo','foo') AS col2

Copier après la connexion

FIELD('hi','hihi','hey','hi','bas')函数中字符串hi出现在列表的第3个字符串位置,因此返回结果为3

FIELD('hi','hihi','lo','hilo','foo') 列表中没有字符串hi,因此返回结果为0

13、返回子串位置的函数FIND_IN_SET(S1,S2)

FIND_IN_SET(S1,S2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗号

‘,'分开的字符串组成的列表。如果s1不在s2或s2为空字符串,则返回值为0。如果任意一个参数为NULL,则返回值为NULL。

这个函数在第一个参数包含一个逗号‘,'时将无法正常运行。

SELECT FIND_IN_SET('hi','hihi,hey,hi,bas')

Copier après la connexion

虽然FIND_IN_SET(S1,S2)和FIELD(S,S1,S2,...)两个函数格式不同,但作用类似,都可以返回指定字符串在字符串列表中的位置

14、选取字符串的函数MAKE_SET(X,S1,S2,...)

MAKE_SET(X,S1,S2,...)返回由x的二进制数指定的相应位的字符串组成的字符串,s1对应比特1,s2对应比特01以此类推。

s1,s2...中的NULL值不会被添加到结果中。

SELECT MAKE_SET(1,'a','b','c') AS col1,
MAKE_SET(1|4,'hello','nice','world') AS col2
Copier après la connexion


1的二进制值为0001,4的二进制值为0100,1与4进行异或操作之后的二进制值为0101,从右到左第一位和第三位为1。

MAKE_SET(1,'a','b','c')返回第一个字符串

MAKE_SET(1|4,'hello','nice','world') 返回从左端开始第一和第三个字符串组成的字符串

日期和时间函数

1、获取当前日期的函数和获取当前时间的函数

CURDATE()、CURRENT_DATE()、CURRENT_TIMESTAMP()、LOCALTIME()、NOW()、SYSDATE()

以上函数都是返回当前日期和时间值,MYSQL的函数数量的确比SQLSERVER多很多,SQLSERVER获取当前时间和日期用的

函数是: SELECT GETDATE()

SELECT NOW()

Copier après la connexion

返回UTC日期的函数和返回UTC时间的函数

MYSQL里返回UTC日期和时间是分开的,而SQLSERVER里是一起的

SELECT GETUTCDATE()

Copier après la connexion

MYSQL

SELECT UTC_DATE(),UTC_TIME()

Copier après la connexion



2、获取月份的函数MONTHNAME(DATE)

MONTHNAME(DATE)函数返回日期date对应月份的英文全名

SELECT MONTHNAME('2013-8-2')

Copier après la connexion

返回8月份的英文

3、获取季度、分钟和秒钟的函数

QUARTER(DATE)返回date对应的一年中的季度值,范围是从1~4

使用QUARTER(DATE)函数返回指定日期对应的季度

SELECT QUARTER('11-04-01')

Copier après la connexion



4月份在第二季度,所以返回2

4、MINUTE(TIME)返回time对应的分钟数,范围是从0~59

SELECT MINUTE('11-02-03 10:10:06')

Copier après la connexion

返回10分钟

5、SECOND(time) 返回time对应的秒数,范围是从0~59

SELECT SECOND('10:23:10')

Copier après la connexion

返回10秒

6、获取日期的指定值的函数EXTRACT(type FROM date)

EXTRACT(type FROM date)这个函数跟SQLSERVER里的DATEPART()函数是一样的

获取日期中的年份

SQLSERVER

SELECT DATEPART(YEAR,'2013-2-3')

Copier après la connexion



MYSQL

SELECT EXTRACT(YEAR FROM '2013-2-3')

Copier après la connexion

7、时间和秒钟转换的函数

TIME_TO_SEC(time)返回已转化为秒的time参数,转换公式为:小时*3600+分钟*60+秒

SELECT TIME_TO_SEC('23:22:00')

Copier après la connexion



SEC_TO_TIME(second)函数可以将秒转换为小时、分钟和秒数的second参数值

SELECT SEC_TO_TIME('84120')

Copier après la connexion

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)

Copier après la connexion

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)

Copier après la connexion

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()

Copier après la connexion



2、CONNECTION_ID()返回MYSQL服务器当前连接的次数,每个连接都有各自唯一的ID

查看当前用户的连接数

SELECT CONNECTION_ID()

Copier après la connexion

这里返回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

Copier après la connexion

show full processlist

Copier après la connexion

各个列的含义

(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()

Copier après la connexion


可以看到,两个函数的作用相同

6、获取用户名的函数

USER()、CURRENT_USER()、CURRENT_USER、SYSTEM_USER()、SESSION_USER()

这几个函数返回当前被MYSQL服务器验证的用户名和主机名组合。这个值符合确定当前登录用户

存取权限的MYSQL帐户。一般情况下,这几个函数的返回值是相同的。

SELECT  USER(),CURRENT_USER(),SYSTEM_USER()

Copier après la connexion


返回结果指示了当前帐户连接服务器的用户名以及所连接的客户主机,root为当前登录的用户名,localhost为登录的主机名

7、获取字符串的字符集和排序方式的函数

CHARSET(STR)返回字符串str自变量的字符集

SELECT  CHARSET('abc') ,CHARSET(CONVERT('abc' USING latin1)),CHARSET(VERSION())

Copier après la connexion


CHARSET('abc')返回系统默认的字符集utf8;

CHARSET(CONVERT('abc' USING latin1))返回的字符集为latin1;

VERSION()返回的字符串使用utf8字符集,因此CHARSET返回结果为utf8

8、COLLATION(str)返回字符串str的字符排列方式

SELECT  COLLATION(_latin2 'abc'),COLLATION(CONVERT('abc' USING utf8))

Copier après la connexion


可以看到,使用不同字符集时字符串的排列方式不同

9、获取最后一个自动生成的ID值的函数

LAST_INSERT_ID()自动返回最后一个INSERT或UPDATE为AUTO_INCREMENT列设置的第一个发生的值

(1)一次插入一条记录

首先创建表worker,其ID字段带有AUTO_INCREMENT约束

CREATE TABLE worker(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
NAME VARCHAR(30)
)
Copier après la connexion

分别单独向表worker插入2条记录

INSERT INTO worker VALUES(NULL,'jimmy');
INSERT INTO worker VALUES(NULL,'tom')

SELECT * FROM worker
Copier après la connexion

查看已经插入的数据可以发现,最后一条插入的记录的ID字段值为2,使用LAST_INSERT_ID()查看最后自动生成的ID值

SELECT LAST_INSERT_ID()

Copier après la connexion
Copier après la connexion



可以看到,一次插入一条记录时,返回值为最后一条插入记录的ID值

(2)一次同时插入多条记录

接下来,向表中插入多条记录

INSERT INTO worker VALUES(NULL,'kevin'),(NULL,'michal'),(NULL,'nick')
Copier après la connexion

查询已经插入的记录

SELECT * FROM worker 

Copier après la connexion

可以看到最后一条记录的ID字段值为5,使用LAST_INSERT_ID()查看最后自动生成的ID值

SELECT LAST_INSERT_ID()

Copier après la connexion
Copier après la connexion

结果显示,ID字段值不是5而是3,这是为什麽呢?

在向数据表插入一条记录时,LAST_INSERT_ID()返回带有AUTO_INCREMENT约束的字段最新生成的值2;继续向表

中同时添加3条记录,这时候因为当使用一条INSERT语句插入多个行时,LAST_INSERT_ID只返回插入的第一行数据

时产生的值,在这里为第3条记录。之所以这样,是因为这使依靠其他服务器复制同样的INSERT语句变得简单

TIPS:LAST_INSERT_ID是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID返回表b中的ID值

这里跟SQLSERVER不一样

使用下面脚本来测试,无论使用方式一还是方式二,当前的LAST_INSERT_ID都是最后一个值

CREATE TABLE [dbo].[aaa](
  [a] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
  [name] [nvarchar](50) NOT NULL
) ON [PRIMARY]
 

Copier après la connexion

USE [sss]



SELECT * FROM [dbo].[aaa]

INSERT INTO [dbo].[aaa]
    ( [name] )
VALUES ( N'sdfsdf' -- name - nvarchar(50)
     )
SELECT * FROM [dbo].[aaa]

INSERT INTO [dbo].[aaa]
    ( [name] )
VALUES ( N'sdf969' -- name - nvarchar(50)
     ),('lkjj96'),('565656')

SELECT IDENT_CURRENT('aaa')

SELECT * FROM [dbo].[aaa]

Copier après la connexion


加密函数

1、加密函数PASSWORD(STR)

PASSWORD(STR)从原文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULL

SELECT PASSWORD('NEWPWD')

Copier après la connexion


MYSQL将PASSWORD函数加密后的密码保存到用户权限表中

TIPS:PASSWOR()函数在MYSQL服务器的鉴定系统中使用;不应将他用在个人应用程序中,PASSWORD()函数加密是单向的(不可逆)

PASSWORD执行密码加密与UNIX中密码加密方式不同

2、加密函数MD5(str)

MD5(str)为字符串算出一个MD5 128比特校验和。该值以32位十六进制数字的二进制字符串形式返回,若参数为NULL,则会返回NULL

SELECT MD5('123')

Copier après la connexion



3、加密函数ENCODE(str,pswd_str)

ENCODE(str,pswd_str)使用pswd_str作为密码,加密str。使用DECODE()解密结果,结果是一个和str长度相同的二进制字符串

SELECT ENCODE('nihao','123')

Copier après la connexion


可以看到加密后的结果为乱码

4、解密函数DECODE(crypt_str,pswd_str)

DECODE(crypt_str,pswd_str)使用pswd_str作为密码,解密加密字符串crypt_str,crypt_str是由ENCODE()返回的字符串

SELECT DECODE(ENCODE('nihao','123'),'123')

Copier après la connexion


可以看到,解密出来的字符串

ENCODE()和DECODE互为反函数

其他函数

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

FORMAT(x,n)将数字x格式化,并以四舍五入的方式保留小数点后n位,结果以字符串的形式返回。

若n为0,则返回结果函数不含小数部分

SELECT FORMAT(12332.123465,4)

Copier après la connexion


FORMAT(12332.123465,4)保留4位小数点值,并进行四舍五入,结果为12,332.1235

2、不同进制的数字转换的函数

CONV(N,from_base,to_base)函数进行不同进制数间的转换。

SELECT CONV('a',16,2)

Copier après la connexion


CONV('a',16,2)将十六进制的a转换为二进制表示的数值。

3、IP地址与数字相互转换的函数

INET_ATON(expr)给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。

地址可以是4或8比特地址

INET_NTOA(expr)给定一个数字网络地址(4或8比特),返回作为字符串的该地址的点地址表示。

4、加锁函数和解锁函数

GET_LOCK(str,timeout)设法使用字符串str给定的名字得到一个锁,超时为timeout秒。

RELEASE_LOCK(str)解开被GET_LOCK()获取的,用字符串str所命名的锁。

IS_FREE_LOCK(str)检查名为str的锁是否可以使用

IS_USED_LOCK(str)检查名为str的锁是否正在被使用

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

BENCHMARK(count,expr)函数重复count次执行表达式expr。他可以用于计算MYSQL处理表达式的速度。

结果值通常为0(0只是表示处理过程很快,并不是没有花费时间)

另一个作用是他可以在MYSQL客户端内部报告语句执行的时间。

首先,使用PASSWORD函数加密密码

SELECT PASSWORD('nihao')

Copier après la connexion


可以看到PASSWORD()函数执行花费的时间为0.00098秒

下面使用BENCHMARK函数重复执行PASSWORD操作500000次

SELECT BENCHMARK(500000,PASSWORD('nihao'))

Copier après la connexion


由此可以看出,使用BENCHMARK执行500000次的时间为0.49690秒,明显比执行一次的时间延长了。

TIPS:BENCHMARK报告的时间是客户端经过的时间,而不是在服务器端的CPU时间,每次执行后报告的时间并不一定是相同的。

6、改变字符集的函数

CONVERT(...using...)带有USING的CONVERT()函数被用来在不同的字符集之间转化数据。

SELECT CHARSET('string'),CHARSET(CONVERT('string' USING latin1))

Copier après la connexion


默认为utf8字符集,通过CONVERT()将字符串“string”的默认字符集改为latin1

7、改变数据类型的函数

CAST(x,AS type)和CONVERT(x,type)函数将一个类型的值转换为另一个类型的值,可转换的type有:

BINARY、CHAR(n)、DATE、TIME、DATETIME、DECIMAL、SIGNED、UNSIGNED

在SQLSERVER里也是使用这两个函数进行数据类型转换的~

SELECT CAST(100 AS CHAR(2)),CONVERT('2013-8-9 12:12:12',TIME)

Copier après la connexion

可以看到, CAST(100 AS CHAR(2))将整数数据100转换为带有2个显示宽度的字符串类型,结果为10

CONVERT('2013-8-9 12:12:12',TIME)将DATETIME类型的值,转换为TIME类型值,结果为“12:12:12”

总结

这一节简单介绍了MYSQL里的一些函数,并且比较了与SQLSERVER的区别


TIPS:

1、MYSQL中,日期时间以字符串形式存储在数据表中,因此可以使用字符串函数分别截取日期时间值的不同部分

2、修改默认的字符集,更改MYSQL默认的字符集,在Windows中,只需要修改my.ini,该文件在MYSQL安装目录下。

修改配置文件中的default-character-set和character-set-server参数值,将其改为想要的字符集名称,如:

gbk、gb2312、latin1等,修改完之后,重启MYSQL服务,即可生效。

如果不确定当前使用的字符集,可以使用下面的SQL语句来查看当前字符集进行对比

SHOW VARIABLES LIKE 'character_set_%'

Copier après la connexion


 

如有不对的地方,欢迎大家拍砖o(∩_∩)o

控制流程函数
编辑

[1] a) CASE WHEN THEN 函数
语法: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 时,返回对应的result,否则返回ELSE后的result。
在第二个方案中,当满足条件condition时,返回对应的result,否则返回ELSE后的result。
两种方案中,如果都不满足而且如果没有ELSE 部分,则返回值为NULL
b) IF 函数用法
语法: IF(expr1,expr2,expr3)
函数用法说明:如果 expr1 是 TRUE (expr1  0 and expr1  NULL) ,则 IF() 的返回值为 expr2 ; 否则返回值则为 expr3 。 IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定
c) IFNULL 函数
语法: IFNULL(expr1,expr2)
函数用法说明:假如 expr1 不为 NULL ,则 IFNULL() 的返回值为 expr1 ; 否则其返回值为 expr2 。 IFNULL() 的返回值是数字或是字符串,具体情况取决于其所使用的语境
2字符串函数
编辑

a) 函数 ascii(str)
函数用法说明:返回值为字符串 str 的最左字符的数值。假如 str 为空字符串,则返回值为 0 。假如 str 为 NULL ,则返回值为 NULL 。 ASCII() 用于带有从 0 到 255 的数值的字符
b) 函数 BIN(N)
函数用法说明:返回值为 N 的二进制值的字符串表示,其中 N 为一个 longlong (BIGINT) 数字。这等同于 CONV(N ,10,2) 。假如 N 为 NULL ,则返回值为 NULL 。
c) 函数CHAR(N ,... [USING charset ])
函数用法说明: CHAR() 将每个参数 N 理解为一个整数,其返回值为一个包含这些整数的代码值所给出的字符的字符串。 NULL 值被省略。
d) 函数CHAR_LENGTH(str )
函数使用说明:返回值为字符串 str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。对于一个 包含五个二字节字符集 , LENGTH() 返回值为 10, 而 CHAR_LENGTH() 的返回值为 5
e) 函数 CHARACTER_LENGTH(str )
函数使用说明: CHARACTER_LENGTH() 是 CHAR_LENGTH() 的同义词。
f) 函数 COMPRESS(string_to_compress )
函数使用说明: COMPRESS( 压缩一个字符串。这个函数要求 MySQL 已经用一个
诸如 zlib 的压缩库压缩过。 否则,返回值始终是 NULL 。 UNCOMPRESS() 可将压缩过的字符串进行解压缩 ) 。
g) 函数 CONCAT(str1 ,str2 ,...)
函数使用说明:返回结果为连接参数产生的字符串。如有任何一个参数为 NULL ,则
返回值为 NULL 。或许有一个或多个参数。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)
h) 函数 CONCAT_WS(separator ,str1 ,str2 ,...)
函数使用说明: CONCAT_WS() 代表 CONCAT With Separator ,是 CONCAT() 的
特殊形式。 第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL ,则结果为 NULL 。函数会忽略任何分隔符参数后的 NULL 值。
i) 函数CONV(N from_base, to_base)
函数使用说明:不同数基间转换数字。返回值为数字的 N 字符串表示,由 from_base 基转化为 to_base 基。如有任意一个参数为 NULL ,则返回值为 NULL 。自变量 N 被理解为一个整数,但是可以被指定为一个整数或字符串。最小基数为 2 ,而最大基数则为 36 。 If to_base 是一个负数,则 N 被看作一个带符号数。否则, N 被看作无符号数。 CONV() 的运行精确度为 64 比特。
j) 函数 ELT(N ,str1 ,str2 ,str3 ,...)
函数使用说明:若 N = 1 ,则返回值为 str1 ,若 N = 2 ,则返回值为 str2 ,以此
类推。 若 N 小于 1 或大于参数的数目,则返回值为 NULL 。 ELT() 是 FIELD() 的补数
k) 函数 EXPORT_SET(bits ,on ,off [,separator [,number_of_bits ]])
函数使用说明: 返回值为一个字符串,其中对于 bits 值中的每个位组,可以得到
一个 on 字符串,而对于每个清零比特位,可以得到一个 off 字符串。 bits 中的比特值按照从右到左的顺序接受检验 ( 由低位比特到高位比特 ) 。字符串被分隔字符串分开 ( 默认为逗号 ‘,') ,按照从左到右的顺序被添加到结果中。 number_of_bits 会给出被检验的二进制位数 ( 默认为 64) 。
l) 函数 FIELD(str, str1, str2, str3, …...)
函数使用说明:返回值为 str1 , str2 , str3 ,…… 列表中的 str 指数。在找不到 str 的情况下,返回值为 0 。如果所有对于 FIELD() 的参数均为字符串,则所有参数均按照字符串进行比较。如果所有的参数均为数字,则按照数字进行比较。否则,参数按照双倍进行比较。如果 str 为 NULL ,则返回值为 0 ,原因是 NULL 不能同任何值进行同等比较。 FIELD() 是 ELT() 的补数。
m) 函数FIND_IN_SET(str, strlist)
函数使用说明: 假如字符串 str 在由 N 子链组成的字符串列表 strlist 中, 则返
回值的范围在 1 到 N 之间 。一个字符串列表就是一个由一些被 ‘,' 符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是 type SET 列,则 FIND_IN_SET() 函数被优化,使用比特计算。如果 str 不在 strlist 或 strlist 为空字符串,则返回值为 0 。如任意一个参数为 NULL ,则返回值为 NULL 。 这个函数在第一个参数包含一个逗号 (‘,') 时将无法正常运行。
n) 函数 FORMAT(X ,D )
函数使用说明: 将 number X 设置为格式 '#,###,###.##', 以四舍五入的方式保留到小数点后 D 位 , 而返回结果为一个字符串。
o) 函数 HEX(N_or_S )
函数使用说明:如果N_OR_S 是一个数字,则返回一个 十六进制值 N 的 字符串表示,在这里, N 是一个longlong (BIGINT) 数。这相当于 CONV(N,10,16) 。如果N_OR_S 是一个字符串,则返回值为一个N_OR_S 的十六进制字符串表示,其中每个N_OR_S 里的每个字符被转化为两个十六进制数字。
p) 函数INSTR(str,substr)
函数使用说明:返回字符串 str 中子字符串的第一个出现位置。这和LOCATE() 的双参数形式相同,除非参数的顺序被颠倒。
q) 函数LCASE(str)
函数使用说明:LCASE() 是 LOWER() 的同义词
r) 函数LEFT(str,len)
函数使用说明:返回从字符串str 开始的len 最左字符
s) 函数 LENGTH(str )
函数使用说明: 返回值为字符串 str 的长度,单位为字节。一个多字节字符算作多字节。这意味着 对于一个包含 5 个 2 字节字符的字符串, LENGTH() 的返回值为 10, 而 CHAR_LENGTH() 的返回值则为5 。
t) 函数 LOAD_FILE(file_name)
函数使用说明:读取文件并将这一文件按照字符串的格式返回。 文件的位置必须在服务器上 , 你必须为文件制定路径全名,而且你还必须拥有 FILE 特许权。文件必须可读取,文件容量必须小于 max_allowed_packet 字节。若文件不存在,或因不满足上述条件而不能被读取, 则函数返回值为 NULL
u) 函数 LOCATE(substr ,str ) , LOCATE(substr ,str ,pos )
函数使用说明:第一个语法返回字符串 str 中子字符串substr 的第一个出现位置。第二个语法返回字符串 str 中子字符串substr 的第一个出现位置, 起始位置在pos 。如若substr 不在str 中,则返回值为0 。
v) 函数LOWER(str )
函数使用说明:返回字符串 str 以及所有根据最新的字符集映射表变为小写字母的字符
w) 函数LPAD(str ,len ,padstr )
函数使用说明:返回字符串 str , 其左边由字符串padstr 填补到len 字符长度。假如str 的长度大于len , 则返回值被缩短至 len 字符。
x) 函数LTRIM(str )
函数使用说明:返回字符串 str ,其引导空格字符被删除。
y) 函数 MAKE_SET(bits ,str1 ,str2 ,...)
函数使用说明: 返回一个设定值 ( 一个包含被 ‘,' 号分开的字字符串的字符串 ) ,由在 bits 组中具有相应的比特的字符串组成。 str1 对应比特 0, str2 对应比特 1, 以此类推。 str1 , str2 , ... 中的 NULL 值不会被添加到结果中。
z) 函数 MID(str ,pos ,len )
函数使用说明: MID(str ,pos ,len ) 是 SUBSTRING(str ,pos ,len ) 的同义词。
aa) 函数 OCT(N )
函数使用说明:返回一个 N 的八进制值的字符串表示,其中 N 是一个 longlong (BIGINT) 数。这等同于 CONV(N,10,8) 。若 N 为 NULL ,则返回值为 NULL 。
bb) 函数 OCTET_LENGTH(str )
函数使用说明: OCTET_LENGTH() 是 LENGTH() 的同义词。
cc) 函数ORD(str )
函数使用说明:若字符串str 的最左字符是一个多字节字符,则返回该字符的代码, 代码的计算通过使用以下公式计算其组成字节的数值而得出:
(1st byte code)
+ (2nd byte code × 256)
+ (3rd byte code × 2562
) ...
假如最左字符不是一个多字节字符,那么 ORD() 和函数ASCII() 返回相同的值
dd) 函数 POSITION(substr IN str )
函数使用说明:POSITION(substr IN str ) 是 LOCATE(substr ,str ) 同义词
ee) 函数QUOTE(str )
函数使用说明:引证一个字符串,由此产生一个在SQL 语句中可用作完全转义数据值的结果。 返回的字符串由单引号标注,每例都带有单引号 (‘'') 、 反斜线符号 (‘\') 、 ASCII NUL 以及前面有反斜线符号的Control-Z 。如果自变量的值为NULL, 则返回不带单引号的单词 “NULL” 。
ff) 函数REPEAT(str ,count )
函数使用说明:返回一个由重复的字符串str 组成的字符串,字符串str 的数目等于count 。 若 count 
Copier après la connexion
Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal