SQL 之 函数(一)

关键字:LEFT, RIGHT, SUBSTRING, LTRIM, RTRIM, CONTACT, UPPER, LOWER, GETDATE/NOW/CURRENT_DATE, DATEPART/DATE_FORMAT, DATEDIFF, ROUND, RAND, PI, CAST, ISNULL / IFNULL/ NVL


SQL

SQL函数:字符函数、日期/时间函数、数值函数、转换函数

复合函数:把多种函数组成一个表达式的方法

 

标量函数、聚合函数

标量函数:只针对单行中的数据执行该函数。eg. LTRIM函数用于删除一个特定值中的起始空格

聚合函数:对一个较大的数据集合(或数据组)进行操作,eg. SUM函数可以用来计算一个特定的列中所有值的总和。

 

1. 字符函数

LEFT, RIGHT, SUBSTRING, LTRIM, RTRIM, CONTACT, UPPER, LOWER

比如

 

(1)LEFT  RIGHT

LEFT(CharacterValue, NumberOfCharacters)

从指定的CharacterValue中查看NumberOfCharacters个字符,返回结果。

LEFT(Hello world, 3)

返回 Hel

注意的是字符数据经常在其右边包含空格,比如在一个只有一行的表中国包含了一个名为President的列,把它定义为20个字符的长度。

President

--------------------------------

George Washington

 

针对这个表

SELECT

RIGHT (President, 10) AS Last Name

FROM table1

得到的返回数据:

Last Name

---------------------------------

hington

为什么不是Washington?因为整个列的长度是20个字符,SQL会先用空格填充不够20个字符的字段(会认为即使这一行的President字段值不足20个字符,也需要与其他行保持一致)所以“George Washington”的右边会有3个空格,当像这样要求时就会得到右边的3个空格加上“George Washington”的另外7个字符。

从中间选择:

SUBSTRING (CharacterValue, StartingPosition, NumberOfCharacters)

 

注意MySQL有时要求函数名称和放参数的左括号之间不能有空格:

SUBSTRING(CharacterValue, StartingPosition, NumberOfCharacters)

Oracle中允许SUBSTR(与SQLMySQLSUBSTRING等效的)函数的第二个参数允许负数,为负数时,需要从列的右边开始计数。

Oracle不允许编写没有FROM子句的SELECT语句:

SELECT SUBSTRING (thewhtitegoat, 4, -5) AS The answer

是不可以的;

但是提供了一个叫DUAL的虚拟表:

SELECT SUBSTRING (thewhtitegoat, 4, -5) AS The answer FROM DUAL;

 

(2)LTRIM RTRIM

修剪左边的空格:

SELECT

LTRIM (the apple) ASThe answer

返回数据

The answer

----------------

the apple

 

LTRIM会足够聪明不会删除字符串“the apple”里面的空格,只会删除字符串左边的空格。

RTRIM也是同理。

(3)CONTACT

SQL Server里面可以用“+”来连接两个字符串。在MySQL里面则要用CONTACTOracle使用连接符 ||

MySQL里面用CONTACT来连接字符串:

SELECT

OrderID,

FirstName,

LastName,

CONTACT (FirstName,  , LastName) ASWhole Name

FROM Orders

 

得到

OrderID    FirstName    LastName    Whole Name

----------------------------------------------------------------

1             Bob          Smith       Bob Smith

 

还记得列的别名要用单引号吧。本例用CONTACT连接了三个值,FirstName、空格和LastName

Oracle版的CONTACT函数只允许两个参数:

SELECT

OrderID,

FirstName,

LastName,

CONTACT (CONTACT (FirstName, ), LastName) ASWhole Name

FROM Orders

 

(4)UPPER LOWER

把任何字符串转换为全部大写或全部小写。

SELECT

UPPER (Abraham Lincoln ) ASConvert to Uppercase

 

2. 复合函数

比如之前的右子串带空格情况,解决办法:复合函数组合RIGHTRTRIM

SELECT

RIGHT (RTRIM (President), 10) ASLast Name

FROM table1

正确得到Washington

 

Oracle中,不像SQL ServerMySQL使用RIGHT,而只能用SUBSTR

SELECT

SUBSTR (RTRIM (President), -10, 10) ASLast Name

FROM table1

开始位置参数为负数,从右边开始计算,右起第10...

3. 日期/时间函数

SQL Server GETDATE DATEPARTDATEDIFF

1最简单的日期/时间函数返回当前的日期和时间:GETDATE无参数

SELECT GETDATE()

MySQL中等价的是NOW()函数,Oracle的是CURRENT_DATE()函数

 

2)能够分析日期和时间的:

DATEPART(DatePart, DateValue)

DateValue是任意日期

DatePartyear, quarter, month, dayofyear, day, week, weekday(星期几), hour, minute, second

 

对于数据“1/10/2015:

DATEPART 函数表达式

             结果值

DATEPART(month, 1/10/2015)

             10

DATEPART(day, 1/10/2015)

             1

DATEPART(week, 1/10/2015)

             40

DATEPART(weekday, 1/10/2015)

             7

1/10/2015”的month10day1week402016101日是这一年的第40周),weekday7(这天是周六,是一周中的第7天)

 

MySQL的等价函数:DATE_FORMAT,并且使用不同的值作为DateValue参数。

MySQL查询日期是该年的第几天:

SELECT DATE_FORMAT(2016-10-1,%d);

Oracle中没有与之等价的函数

 

(3)计算两个日期之间相差的天数(或周数、月数)

SQL: DATE_DIIFF

DATEDIFF (DatePart, StartDate, EndDate)

DatePart参数:year, quarter(季度), month, dayofyear, day, week, month, hour, minute, second

 

示例:7/8/20098/14/2009

DATEDIFF 函数表达式

             结果值

DATEDIFF (day,7/8/2009,8/14/2009)

             37

DATEDIFF (week,7/8/2009,8/14/2009)

             5

DATEDIFF (month,7/8/2009,8/14/2009)

             1

DATEDIFF (year,7/8/2009,8/14/2009)

             0

两个日期相差37天,5周,1个月,0

 

MySQLDATEDIFF只计算两个日期之间的天数

Oracle中没有与之等价的函数

 

4. 数值函数

(1)ROUND

ROUND (NumericValue, DecimalPlaces)

正负数、有无小数点都可

DecimalPlaces:为正整数,表示将数字四舍五入到指定的那么多个小数点;为0,表示没有小数部分(四舍五入到整数);为负整数,表示对小数点左侧前几位进行四舍五入

表达式

             结果值

ROUND (712.863, 3)

             712.863

ROUND (712.863, 2)

             712.86

ROUND (712.863, 1)

             712.9

ROUND (712.863, 0)

             713

ROUND (712.863, -1)

             710

ROUND (712.863, -2)

             700

 

(2)RAND

产生随机数。RAND ([seed]) seed是可选的参数。不使用时产生01之间的一个随机数。

SELECT

RAND () AS Random Value

改变seed可能返回不同的值

 

(3)PI

返回pi值:SELECT PI()   返回3.14159265358979

SELECT ROUND (PI(), 2)   返回3.14

 

5. 转换函数

类型转换或把NULL转换成有意义的内容

(1)CAST

CAST (Expression AS Datatype)

很多情况下并不需要用到它。

SELECT

2 * Quantity

FROM table1

这样的语句SQL能够自动把Quantity列(没有定义为数字列,比如说是字符)转换成数字列以乘2

 

示例:

比如我们把一列日期保存到一个字符列中,想要把这些日期转换成真正的日期/时间列:

SELECT

2009-04-11 ASOriginal Date

CAST (2009-04-11 AS DATETIME) ASConverted Date

 

输出

Original Date         Converted Date

----------------------------------------------

2009-04-11        2009-04-11 00:00:00

Original Date是字符数据,Converted Date是真正的日期/时间列

 

Oracle等价表达:

SELECT

2009-04-11 ASOriginal Date

CAST (11-APR-20090 AS DATE) ASConverted Date

FROM DUAL

 

 

(2)ISNULL

SQL:  NULL值转换成一个有意义的值

NULL值是没有数据的值,和零值与空格不同。

 

示例表单:

Product      Description       Color

-----------------------------------------------

1                  Chair A              Red

2                  Chair B              NULL

3                  Chair C              Green

Chair BColor列为NULL值说明还没有为这种产品提供Color

SELECT

Description,

Color

FROM  Products

 

显示:

Description       Color

-----------------------------------------------

Chair A              Red

Chair B              NULL

Chair C             Green

 

NULL对用户来说可能是困惑的结果,更想看到或者容易理解的是“unknown”之类的:

SELECT

Description,

ISNULL (Color, Unknown) ASColor

FROM  Products

这只会把NULL值改为Unknown

显示:

Description       Color

-----------------------------------------------

Chair A              Red

Chair B              Unknown

Chair C              Green

 

MySQL等价函数:IFNULL

SELECT

Description,

IFNULL (Color, Unknown) ASColor

FROM  Products;

 

Oracle等价函数:NVL

SELECT

Description,

NVL (Color, Unknown) ASColor

FROM  Products;

 

PS: Oracle遇到NULL值用破折号显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值