赞
踩
SQL函数(行函数)的使用
不同DBMS的函数差异
功能 | SQL Server函数 | Oracle函数或语句 | MySQL函数 |
获取字符串的某部分 | SUBSTRING() | SUBSTR() | SUBSTRING() |
获取当前日期 | GETDATE() | SYSDATE | CURDATE() |
转换数据类型 | CONVERT() | 有多个具体函数,如TO_DATE()将字符串转换为日期,TO_CHAR()将数字或日期转换为字符串。 | CONVERT() |
转换函数用于将具体DBMS的数值转换成其他数据类型或对其进行格式化,经常用到的转换是将日期和数字转换成指定的字符串格式,或者将字符串转换成有效的日期或数值。
在SQL Server中,使用CONVERT()和CAST()两个函数转换数据类型。
CONVERT(datatype[(length)],expression,[style]) |
其中,datatype为数据类型,如果是CHAR、VARCHAR、BINARY或VARBINARY数据类型,则可以选择length参数设置长度;expression为表达式,如果要将日期型数据转换为字符型数据,则还可以使用style参数设置日期显示格式。sytle参数可以取两类值,如果从第一类取值,则返回日期的年份为2位;如果从第二类取值,则返回日期的年份为4位。
当把一个日期转换为字符串时,CONVERT()函数默认的输出格式是“mon dd yy hh:mi AM(或PM)”,即省略style参数。
CONVERT()函数的例子
功能 | 函数实现 |
字符到数字 | CONVERT(numeric,’15’) |
数字到字符 | CONVERT(char,12) |
字符到日期 | CONVERT(datetime,’15-09-1977’),CONVERT(datetime,’SEP 15,1977’) |
日期到字符 | CONVERT(char,GETDATE()),CONVERT(char,GETDATE(),102) --102是ANSI标准 |
十六进制到二进制 | CONVERT(binary,’3C’)) |
二进制到十六进制 | CONVERT(char,二进制字段) |
获取当前系统时间 | CONVERT(char,GETDATE(),8) |
分析:将出生日期转换为字符串,应当使用CONVERT()函数;因为需要按照德国日期格式显示,查找德国标准的style值;又因为年份要求是4位,所以选择style参数的值为104
SELECT name AS 姓名,CONVERT(CHAR,birthday,104) AS 生日 FROM student ORDER BY birthday; |
CAST()函数是SQL92标准函数,使用CAST()函数也可以转换数据类型,但是在格式化日期时间数据方面不如CONVERT()函数方便。
CAST(expression AS datatype[(length)]) |
其中,expression为表达式;datatype为数据类型,如果是CHAR、VARCHAR、BINARY或VARBINARY数据类型,则可以选择length参数设置长度。
SELECT name AS 姓名,CAST(birthday as char) AS 生日 FROM student ORDER BY birthday; |
可以看出,出生日期已经被转换为字符串,如果只想要日期部分,不想要时间,则可以在类型后设置长度。
SELECT name AS 姓名,CAST(birthday as char(11)) AS 生日 FROM student ORDER BY birthday; |
本例中,只给“出生日期”分配了11个字节的长度,所以只把前面的日期部分留下,后面的时间部分被自动截掉了。
CAST()函数不能改变原表字段的数据类型。
GETDATE()函数用于获取当前系统时间:GETDATE()
例如,在查询分析器中输入如下SELECT语句,运行后即可获得当前系统时间
SELECT GETDATE() |
DATEADD()函数用于在指定日期上增加年、月、日或者时间等,其返回值为日期型数据。
DATEADD(datepart,number,date) |
--在当前时间的“年”上增加了10年,并返回10年后的日期 SELECT DATEADD(year,10,GETDATE()) |
--在当前时间的“月”上增加了10个月,并返回10个月后的日期 SELECT DATEADD(MONTH,10,GETDATE()) |
注:datepart参数值可以使用缩写,例如,DATEADD(mm,10,GETDATE())也是在当前时间上增加10个月。
SELECT name AS 姓名, birthday AS 出生日期, DATEADD(DAY,10000,birthday) AS 出生后第10000天, DATEADD(MONTH,800,birthday) AS 出生后第800月 FROM student ORDER BY birthday; |
DATEDIFF()函数用于获取两个日期间的差,并返回数值数据。
DATEDIFF(datepart,date1,date2) |
datepart参数规定在日期的哪个部分(如年份、月份等)增加(减小)数值;date1和date2是日期或者日期格式的字符串。
SELECT name AS 姓名, birthday AS 出生日期, DATEDIFF(YEAR,birthday,GETDATE()) AS 年龄 FROM student ORDER BY birthday DESC; |
返回的是当前日间和出生日期之间的年份差,即年龄。
DATENAME()函数用于获取日期的一部分,并以字符串形式返回。
DATENAME(datepart,date) |
datepart参数规定在日期的哪个部分(年、月)增加(减小)数值;date是日期或者日期格式的字符串;例如,假设当前日期为1月29日,则DATENAME(month,GETDATE())的结果为字符串‘01’,DATENAME(dd,GETDATE())的结果为字符串‘29’。
SELECT * FROM student WHERE DATENAME(DAY,birthday)='25' ORDER BY birthday DESC; |
DATEPART()函数用于获取日期的一部分,并以整数值返回。
DATEPART(datepart,date) |
DATEPART()函数返回的是数值,因为必须与条件表达式中的数值进行比较(例如date为25),数值不用引号。
SELECT * FROM student WHERE DATEPART(DAY,birthday)=25 ORDER BY birthday DESC; |
在SQL Server中,还有YEAR()、MONTH()、DAY()3个函数,分别用于获取日期数据的年份、月份和日期部分,这3个函数的返回值都是数值型。
数学函数允许操作数值数据。
分析:首先应当使用RADIANS()函数计算30度角的弧度值,其次对弧度值使用SIN()函数求正弦值,最后应当对结果进行四舍五入的计算。
ROUND | (numeric_表达式,length) | 返回数字表达式并四舍五入为指定的的长度或精度 |
SIN | (float_表达式) | 返回给定float表达式的给给定角度(以弧度为单位)的三角正弦值(近似值) |
RADIANS | (numeric_表达式) | 对于在数字表达式中输入的度数值返回弧度值 |
SELECT ROUND(SIN(RADIANS(30.0)),1) AS "30度的正弦值"; |
字符函数允许操作字符数据。
函数 | 参数 | 说明 |
ASCII | (char_表达式) | 返回字符表达式结果最左边字符的ASCII码 |
RTRIM | (char_表达式) | 删除字符串右边所有的空格 |
SOUNDEX | (char_表达式) | 返回由4个字符组成的代码(SOUNDEX)以评估两个字符串的相似性 |
UPPER | (char_表达式) | 将字符表达式中的所有小写字母全部转换成大写字母 |
分析:有时人们经常会忽视英文字母的大小写,如将“Tom Green”写为“tom green”;此时,如果数据库管理系统没有自动转换匹配的功能,则会将这两个字符看作是不同人的姓名,从而导致查询出错。为了解决这类问题,应当将数据库中的字符串的所有字母转换为大写(或小写)字母,然后与大写(或小写)字母的字符串进行比较。
SELECT tname,tel,email FROM foreign_teacher WHERE UPPER(tname)='TOM GREEN'; |
SELECT tname+'('+country+')' AS "姓名(国家)", hiredate AS 雇用日期, tel 联系电话 FROM foreign_teacher; |
将AS后的别名“姓名(国家)”放入双引号中的原因是别名中含有圆括号。
使用RTRIM()函数将姓名的尾随空格去掉,然后再拼接。
SELECT RTRIM(tname)+'('+country+')' AS "姓名(国家)", hiredate AS 雇用日期, tel 联系电话 FROM foreign_teacher; |
从foreign_teacher表中查询所有加拿大籍教师的姓名(tname)、出生日期(birth)和电子邮件(email)。
SELECT tname,birth,email FROM foreign_teacher WHERE SOUNDEX(country)=SOUNDEX('canda'); |
可见,即使拼错了加拿大的英文名称,使用SOUNDEX()函数还是能够查到正确的结果;SOUNDEX()函数并不支持汉字的读音比较。
CONVERT(value,type) |
其中type为数据类型,转换的数据类型有限,可以是以下值中的一个:
SELECT CONVERT('12345',SIGNED); |
CAST(value AS type) |
其中,type为数据类型
SELECT CAST('12345' AS signed); |
使用CURDATE()函数、CURTIME()函数可以获取当前日期、当前时间
SELECT CURDATE() AS 当前日期,CURTIME() AS 当前时间; |
日期运算函数用于对日期时间进行加减运算。
其中ADDDATE()和SUBDATE()是DATE_ADD和DATE_SUB()的同义词,也可以用运算符(+)和(-)进行运算。
在上面4个函数中,date是一个DATETIME或DATE值,expr是对date进行加减运算的一个表达式字符串,type指明表达式expr应该如何被解释。type可取以下值:
后天(即当前日期增加2天)再往后推2小时,其运算字符串“2 2”,使用DAY_HOUR类型进行运算。
SELECT NOW() AS 当前日期,DATE_ADD(NOW(),INTERVAL "2 2" DAY_HOUR) AS 运算结果; |
在日期运算函数中,expr中允许使用任何标点做分隔符,如果所有date都是DATE值,结果是另一个DATE值,否则结果是一个DATETIME值。
另外,如果type关键词不完整,则MySQL从右端取值;例如,DAY_SECOND因为缺少小时分钟,等于MINUTE_SECOND;如果增加MONTH、YEAR_MONTH或YEAR,天数大于结果月份的最大天数,则使用最大天数。
SQL Server中的ISNULL()函数可以将NULL值更改为其他值
ISNULL(check_expression,replacement_value) |
c1 | c2 |
10 | NULL |
20 | 200 |
NULL | NULL |
其创建语句和插入语句分别如下:
CREATE TABLE testnull ( c1 int, c2 int ); INSERT INTO testnull VALUES(10,NULL),(20,200),(NULL,NULL); |
下面的语句将c2字段所有的NULL值显示为0
SELECT c1,ISNULL(c2,0) as c2 FROM testnull; |
上面的查询语句并不能将c2字段的NULL值更改为0,而只是将NULL值显示为0。
MySQL中对应SQL Server的ISNULL()函数是IFNULL()函数。
SELECT c1,IFNULL(c2,0) FROM testnull; |
IF…ELSE逻辑函数指的是根据判断条件返回不同结果的函数Oracle中的DECODE()函数和SQL Server中的CASE()函数就是这种函数。
CASE WHEN 条件表达式1 THEN 返回值 1 WHEN 条件表达式2 THEN 返回值 2 …… WHEN 条件表达式n THEN 返回值 n ELSE 返回值 n+1 END |
SELECT tname 外教姓名, 性别 = CASE WHEN sex = 'm' THEN '男' WHEN sex = 'f' THEN '女' ELSE '错误数据' END FROM foreign_teacher WHERE country='USA' ORDER BY sex; |
CASE()函数实际上还有一种形式:
SELECT tname 外教姓名, 性别 = CASE sex WHEN 'm' THEN '男' WHEN 'f' THEN '女' ELSE '错误数据' END FROM foreign_teacher WHERE country='USA' ORDER BY sex; |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。