学习《SQL入门经典》第五版 Ryan Stephens,Ron Plew,Arie D.Jones 著 第11章
第11章 调整数据的外观
本章的重点包括:
本章介绍如何使用函数来调整输出结果的外观,有些是ANSI标准函数,有些是基于该标准的函数,还有一些是由主要的SQL实现所使用的函数。字符函数简介
如何及何时使用字符函数
ANSI SQL函数范例
常见实现的特定函数范例
转换函数概述
如何及及时使用转换函数
11.1ANSI字符函数
字符函数用于在SQL里以不同于存储方式的格式来表示字符串。
最常用的ANSI字符函数主要用于进行串接、子串和TRANSLATE等操作。
串接就是把两个单独的字符串组合为一个。
子串的概念就是从字符串里提取一部分。
TRANSLATE函数用于逐字符地把一个字符串变换为另一个,它通常有3个参数:
要被转换的字符串、要转换的字符列表、代入字符的列表。
11.2常用字符函数
字符函数主要用于对字段里的字符串或值进行比较、连接、搜索、提取片段等,可用的字符函数有很多。
11.2.1 串接函数
串接及其他一些函数在不同实现里略有不同。
假设要把JOHN和SON串接起来形成JOHNSON:
在Oracle里的代码是这样:
SELECT 'JOHN' || 'SON'
在SQL Sever里的代码是这样的:
SELECT 'JOHN' + 'SON'
在MySQL里的代码是这样:
SELECT CONCAT( 'JOHN' , 'SON')
MySQL和Oracle中都有串接函数,用于把两个字符串连接起来,其作用相当于SQL Sever中的“+”和Oracle中的“||”。
区别在于,Oracle中的串接函数只能用于两个字符串,而MySQL中的串接函数可以连接多个字符串。
例子:下面的Oracle语句吧城市和州字段的值串接在一起,并且在两个值之间放置一个逗号:
SELECT CITY || ' , ' || STATE FROM EMPLOYEE_TBL;
这个操作在Oracle中无法使用串接函数完成,因为它连接了多个字符串。
11.2.2 TRANSLATE函数
TRANSLATE函数搜索字符串里的字符并查找特定的字符,标记找到的位置,然后用替代字符串里对应的字符替换它。
其语法如下:
TRANSLATE(CHARACTER SET, VALUE1,VALUE2)
举例:
SELECT CITY,TRANSLATE(CITY,'IND','ABC')
FROM EMPLOYEE_TBL;
在这个范例里,所有的I都被替换为A,N替换为B、D替换为C
MySQL和Oracle都支持使用TRANSLATE函数,但是MS SQLSever还不支持。
11.2.3 REPLACE
REPLACE函数用于把某个字符或者字符串替换为指定的一个字符(或多个字符)
其使用类似于TRANSLATE函数,只是它是把一个字符或者字符串替换到另一个字符串里
举例:下面的语句返回雇员表里的全部城市,并且把城市名称里的I都替换为Z:
SELECT CITY,REPLACE(CITY,'I','Z')
FROM EMPLOYEE_TBL
MS SQL Sever、MySQL和Oracle全部都支持该函数的ANSI语法结构
11.2.4UPPER
大多数实现都提供了控制数据大小写的函数。
UPPER函数可以把字符串里的小写字母转化为大写。
举例:下面的语句吧字段里所有的字符都转化为大写:
SELECT UPPER(CITY) FROM EMPLOYEE_TBL;
MS SQL Sever、MySQL和Oracle全部都支持该函数的ANSI语法结构
11.2.5LOWER
LOWER把字符串里的大写字符转化为小写。
用法类似于UPPER。
MS SQL Sever、MySQL和Oracle全部都支持该函数的ANSI语法结构。
11.2.6SUBSTR
在大多数SQL实现里都有获取字符串子串的函数,但名称可能略有不同。
在Oracle里语法是:
SUBSTR(COLUMN NAME,STARTING POSITION,LENGTH)
在SQL Sever里的语法是:
SUBSTRING(COLUMN NAME,STARTING POSITION,LENGTH)
11.2.7INSTR
INSTR函数用于在字符串里寻找指定的字符集,返回其所在的位置。
语法如下所示:
INSTR(COLUMN NAME, 'SET', [ START POSITION [, OCCURRANCE ] ] )
字段名 字符 ? ? 留疑
举例:下面的语句返回表里每个州名里字母I第一次出现的位置:
SELECT INSTR(STATE,'i',1,1) FROM EMPLOYEE_TBL;
11.2.8LTRIM
LTRIM函数是另一种截取部分字符串的方式,它与SUBSTRING属于同一家族。
LTRIM用于从左剪除字符串里的字符。
举例:下面的SQL语句返回职位以及职位字符串里从左侧剪除SALES之后的结果:
SELECT POSITION,LTRIM(POSITION,'SALES')
FROM EMPLOYEE_PAY_TBL;
POSITON LTRIM(POSITION,
-----------------------------------------------------------------------
MARKETING MARKETING
TEAM LEADER TEAM LEADER
SALES MANAGER MANAGER
SALESMAN MAN
SHIPPER HIPPER
SHIPPER HIPPER
6 ROWS SELECTED.
SHIPPER里的S也被剪除掉了,虽然SHIPPER离并不包含字符串SALES。
SALES里前4个字符被忽略掉了,被搜索的字符必须以相同次序出现在目标字符串里,而且必须位于目标字符串的最左侧。
换句话说,LTRIM会剪除被搜索的字符串在目标字符串里最后一次出现位置之左的全部字符。
MS SQL Sever、MySQL和Oracle全部都支持该函数的ANSI语法结构。
11.2.9RTRIM
类似于LTRIM,RTRIM也用于剪除字符,但它是剪除字符串的右侧。
用法类似于LTRIM
MS SQL Sever、MySQL和Oracle全部都支持该函数的ANSI语法结构。
11.2.10DECODE
DECODE函数不是ANSI标准里的,至少目前还不是,但它具有强大的功能。
该函数主要用于Oracle和PostgreSQL。
它可以在字符串里搜索一个值或字符串,如果找到了,就在结果里显示另外一个字符串。
语句:略
11.3其他字符函数
下面的小节介绍其他一些值得一提的函数,它们在主流SQL实现里也是很常见的。
11.3.1LENGTH
用于得到字符串、数字、日期或表达式的长度,单位是字节。
例子:下面的语句返回产品描述及其长度:
MySQL和Oracle都支持该函数。而MS SQL Sever则使用LEN函数来实现相同的功能。SELECT PROC_DESC, LENGTH(PROD_DESC)
FROM PRODUCTS_TBL;
11.3.2IFNULL(检查NULL值)
用于在一个表达式是NULL时从另一个表达式获得值。
它可以用于大多数数据类型,但值与替代值必须是同一数据类型。
例子:下面的语句寻找NULL值,并且用99代替NULL值
SELECT PAGER,IFNULL(PAGER,99)
FROM EMPLOYEE_TBL;
只有MySQL支持该函数。
要实现相同的功能,MS SQL Sever使用ISNULL函数,而Oracle则使用COALESCE函数。
11.3.3 COALESCE
COALESECE函数也是用指定值替代NULL值,这一点与IFNULL是一样的。
其不同点是,它可以接受一个数据集,依次检查其中的每一个值,直到发现一个非NULL值。
如果没有找到非NULL值,它会返回一个NULL值。
例子:下面的范例用COALESCE函数返回BONUS,SALARY和PAY_RATE字段里的第一个NULL值。
SELECT EMP_ID,COALESCE(BONUS,SALARY,PAY_RATE)
FROM EMPLOYEE_PAY_TBL;
MS SQL Sever、MySQL和Oracle全部都支持该函数。
11.3.4LPAD(留疑---关于具体的语法)
LPAD(左填充)用于在字符串左侧添加字符或空格
11.3.5RPAD(留疑)
RPAD(右填充)用于在字符串右侧添加字符或空格
11.3.6ASCII
ASCII函数返回字符串最左侧字符的“美国信息交换标准码(ASCII)",其语法如下:
ASCII(CHARACTER SET)
下面是一些范例:
ASCII('A')返回65
更多信息请参见www.asciitable.com上的ASCII表。
11.4算术函数
在多个不同的实现之间,算术函数是相对比较标准的。
算术函数可以对数据库里的值根据算术规则进行运算。
最常见的算术函数包括:
ABS:绝对值
ROUND:舍入
SQRT:平方根
SIGN:符号
POWER:幂
CELL,FLOOR:上限和下限
EXP:指数
SIN,COS,TAN
11.5转换函数
转换函数把数据类型从一种转换为另一种。
下面是一些常见的数据转换:
本章将介绍前两种转换,其他的转换在第12章介绍。字符到数字;
数字到字符;
字符到日期;
日期到字符;
11.5.1字符串转换为数字
数值数据类型和字符串数据类型有两个主要的区别:
算术表达式和函数可以用于数值;
在输出结果里,数值是右对齐的,而字符串是左对齐的。
对于要转换为数值的字符串来说,其中的字符必须是0~9.另外加号、减号和句点可以分别用来表示正数、负数和小数。
例子:下面是使用Oracle转换函数的一个数值转换范例:
SELECT EMP_ID,TO_NUMBER(EMP_ID)
FROM EMPLOYEE_TBL;
11.5.2数字转换为字符串
例子:下面是使用Oracle转换函数的一个例子:
SELECT PAY_RATE, TO_CHAR(PAY_RATE)
FROM EMPLOYEE_PAY_TBL
WHERE PAY_RATE IS NOT NULL;
11.6字符函数的组合使用
大多数函数可以在SQL语句里组合使用。
如果不允许函数组合使用,SQL就会有很大的局限性。
11.7小结
到目前为止,我们介绍了在SQL语句(通常是个查询)里使用多种函数来调整或强化输出结果的外观。
这些函数包括字符函数、算术函数和转换函数。
需要明确的是,ANSI标准是如何实现SQL的一个方阵,但没有规定准确的语法或位置规则。
11.8问与答
问:在使用函数时,数据库里的数据是否实际发生了改变?
答:没有。在使用函数时,数据库里的数据没有发生改变。函数通常是在查询语句里来调整输出的外观。