认证主体:吴**(实名认证)
IP属地:四川
下载本文档
2、 * SQL语言在书写上类似于英文,简洁清晰,易于理解。它由关键字、表名、字段名,表达式等部分构成,SQL语言属于非过程化的4GL(第四代语言)。 * SQL语言按功能可分为DDL语言、DML语言、DCL语言和数据库事务处理语言四个类别。 * SQL语言的主要关键字有:ALTER、DROP、REVOKE、AUDIT、GRANT、ROLLBACK、COMMIT、INSERT、SELECT、COMMENT、LOCK、UPDATE、CREATE、NOAUDIT、VALIDATE、DELETE、RENAME等。 按照SQL语言的不同功用,可以进一步对SQL语言进行划分。下表给出了SQL语言的分类和功能
3、简介,表2-1 SQL语言的分类,2.1.2 SQL的基本语法 SQL语言的语法比较简单,类似于书写英文的语句。其语句一般由主句和若干个从句组成,主句和从句都由关键字引导。主句表示该语句的主要功能,从句表示一些条件或限定,有些从句是可以省略的。在语句中会引用到列名、表名或表达式。另外还有如下一些说明: * 关键字、字段名、表名等之间都要用空格或逗号等进行必要的分隔。 * 语句的大小写不敏感(查询的内容除外)。 * 语句可以写在一行或多行。 * 语句中的关键字不能略写和分开写在两行,要在每条SQL语句的结束处添加“;”号。 * 为了提高可读性,可以使用缩进。 * 从句一般写在另一行的开始处。 查
4、询语句是最常见的SQL语句,它从给定的表中,把满足条件的内容检索出来。以下是最基本的SELECT语句语法。 SELECT 字段名列表 FROM 表名 WHERE 条件; SELECT为查询语句的关键字,后跟要查询的字段名列表,字段名列表用来指定检索特定的字段,该关键字不能省略,字段名列表代表要查询的字段。 FROM 也是查询语句关键字,后面跟要查询的表名,该关键字不能省略。 WHERE条件限定检索特定的记录,满足“条件”的记录被显示出来,不满足条件的被过滤掉。 语句查询的结果往往是表的一部分行和列。如果字段名列表使用*,将检索全部的字段。如果省略WHERE条件,将检索全部的记录,训练1】 查询
5、部门10的雇员。 输入并执行查询: SELECT * FROM emp WHERE deptno=10; 结果略。 说明:该查询语句从emp表中检索出部门10 的雇员,条件由WHERE deptno=10 子句指定,2.2 基本查询和排序,2.2.1 查询的基本用法 在Oracle数据库中,对象是属于模式的,每个账户对应一个模式,模式的名称就是账户名称。在表名前面要添加模式的名字,在表的模式名和表名之间用“.”分隔。我们以不同的账户登录数据库时,就进入了不同的模式,比如登录到STUDENT 账户,就进入了STUDENT模式。而在STUDENT模式要查询属于SCOTT模式的表,就需要写成: SE
7、于日期和数值型数据,右对齐显示,如deptno列。对于字符型数据,左对齐显示,如dname列,练习1】显示emp表的雇员名称和工资。 2显示行号 每个表都有一个虚列ROWNUM,它用来显示结果中记录的行号。我们在查询中也可以显示这个列。 【训练2】 显示EMP表的行号。 输入并执行查询: SELECT rownum,ename FROM emp,结果如下: ROWNUM ENAME - - 1 SMITH 2 ALLEN 3 WARD 4 JONES 注意:显示的行号是查询结果的行号,数据在数据库中是没有行号的,3显示计算列 在查询语句中可以有算术表达式,它将形成一个新列,用于显示计算的结果,
8、通常称为计算列。表达式中可以包含列名、算术运算符和括号。括号用来改变运算的优先次序。常用的算术运算符包括: * +:加法运算符。 * -:减法运算符。 * *:乘法运算符。 * /:除法运算符。 以下训练在查询中使用了计算列,训练3】 显示雇员工资上浮20%的结果。 输入并执行查询: SELECT ename,sal,sal*(1+20/100) FROM emp; 显示结果为: ENAME SAL SAL*(1+20/100) - - - SMITH 800 960 ALLEN 1600 1920 说明:结果中共显示了3列,第3列显示工资上浮20%的结果,它不是表中存在的列,而是计算产生的结
9、果,称为计算列,练习2】显示EMP表的雇员名称以及工资和津贴的和。 4使用别名 我们可以为表的列起一个别名,它的好处是,可以改变表头的显示。特别是对于计算列,可以为它起一个简单的列别名以代替计算表达式在表头的显示。 【训练4】 在查询中使用列别名。 输入并执行: SELECT ename AS 名称, sal 工资 FROM emp; 显示结果为: 名称 工资 - - SMITH 800 ALLEN 1600,说明:表头显示的是列别名,转换为汉字显示。在列名和别名之间要用AS分隔,如ename和它的别名“名称”之间用AS隔开。AS也可以省略,如sal和它的别名“工资”之间用空格分割。 注意:如
10、果用空格分割,要区别好列名和别名,前面为列名,后面是别名。 别名如果含有空格或特殊字符或大小写敏感,需要使用双引号将它引起来,训练5】 在列别名上使用双引号。 输入并执行查询: SELECT ename AS Name, sal*12+5000 AS 年度工资(加年终奖) FROM emp; 显示结果为: Name 年度工资(加年终奖) - - SMITH 14600 ALLEN 24200,说明:其中别名“Name”有大小写的区别,别名“年度工资(加年终奖) ”中出现括号,属于特殊符号,所以都需要使用双引号将别名引起。 【练习3】显示DEPT表的内容,使用别名将表头转换成中文显示。 5连接运
11、算符 在前面,我们使用到了包含数值运算的计算列,显示结果也是数值型的。我们也可以使用字符型的计算列,方法是在查询中使用连接运算。连接运算符是双竖线“|”。通过连接运算可以将两个字符串连接在一起,训练6】 在查询中使用连接运算。 输入并执行查询: SELECTename|job AS 雇员和职务表 FROM emp; 输出结果为: 雇员和职务表 - SMITHCLERK ALLENSALESMAN,说明:在本例中,雇员名称和职务列被连接成为一个列显示。 在查询中可以使用字符和日期的常量,表示固定的字符串或固定日期。字符和日期的常量需要用单引号引起。下一个训练是作为上一个训练的改进,训练7】 在查
12、询中使用字符串常量。 输入并执行查询: SELECTename| IS |job AS 雇员和职务表 FROM emp; 输出结果为: 雇员和职务表 - SMITH IS CLERK ALLEN IS SALESMAN 说明:本练习中将雇员名称、字符串常量“ IS ”和雇员职务3个部分连接在一起,练习4】显示DEPT表的内容,按以下的形式: 部门ACCOUNTING所在的城市为NEW YORK 6消除重复行 如果在显示结果中存在重复行,可以使用的关键字DISTINCT消除重复显示,训练8】 使用DISTINCT消除重复行显示。 输入并执行查询: SELECT DISTINCT job FROM
13、 emp; 结果为: JOB - ANALYST CLERK MANAGER PRESIDENT SALESMAN,说明:在本例中,如果不使用DISTINCT关键字,将重复显示雇员职务,DISTINCT关键字要紧跟在SELECT之后。请去掉DISTINCT关键字,重新执行,并观察显示结果的不同。 【练习5】显示EMP表中不同的部门编号。 2.2.2 查询结果的排序 如果要在查询的同时排序显示结果,可以使用如下的语句: SELECT 字段列表 FROM 表名 WHERE 条件 ORDER BY 字段名1 ASC|DESC,字段名2 ASC|DESC,ORDER BY从句后跟要排序的列。ORDER
14、 BY 从句出现在SELECT语句的最后。 排序有升序和降序之分,ASC表示升序排序,DESC表示降序排序。如果不指明排序顺序,默认的排序顺序为升序。如果要降序,必须书写DESC关键字,1升序排序 【训练1】 查询雇员姓名和工资,并按工资从小到大排序。 输入并执行查询: SELECT ename, sal FROM emp ORDER BY sal; 执行结果为: ENAME SAL - - SMITH 800 JAMES 950 注意:若省略ASC和DESC,则默认为ASC,即升序排序,2降序排序 【训练2】 查询雇员姓名和雇佣日期,并按雇佣日期排序,后雇佣的先显示。 输入并执行查询: SE
15、LECT ename,hiredate FROM emp ORDER BY hiredate DESC; 结果如下: ENAME HIREDATE - - ADAMS 23-5月 -87 SCOTT 19-4月 -87,MILLER 23-1月 -82 JAMES 03-12月-81 FORD 03-12月-81 注意: DESC表示降序排序,不能省略。 3多列排序 可以按多列进行排序,先按第一列,然后按第二列、第三列.。 【训练3】 查询雇员信息,先按部门从小到大排序,再按雇佣时间的先后排序。 输入并执行查询: SELECT ename,deptno,hiredate FROM emp OR
16、DER BY deptno,hiredate,结果如下: ENAME DEPTNO HIREDATE - - - CLARK 10 09-6月 -81 KING 10 17-11月-81 MILLER 10 23-1月 -82 SMITH 20 17-12月-80 JONES 20 02-4月 -81 FORD 20 03-12月-81 SCOTT 20 19-4月 -87 说明:该排序是先按部门升序排序,部门相同的情况下,再按雇佣时间升序排序,4在排序中使用别名 如果要对计算列排序,可以为计算列指定别名,然后按别名排序。 【训练4】 按工资和工作月份的乘积排序。 输入并执行查询: SELEC
17、T empno, ename, sal*Months_between(sysdate,hiredate) AS total FROM emp ORDER BY total,执行结果为: EMPNO ENAME TOTAL - - - 7876ADAMS 221526.006 7369 SMITH 222864.661 7900 JAMES 253680.817 7654 MARTIN 336532.484 说明:求得雇员工作月份的函数Months_between将在后面介绍。sysdate表示当前日期。 【练习1】将部门表中的部门名称按字母顺序显示,2.3 条件查询,2.3.1 简单条件查询
18、要对显示的行进行限定,可在FROM从句后使用WHERE从句,在WHERE从句中给出限定的条件,因为限定条件是一个表达式,所以称为条件表达式。条件表达式中可以包含比较运算,表达式的值为真的记录将被显示。常用的比较运算符列于表2-2中,表2-2 比 较 运 算 符,训练1】 显示职务为“SALESMAN”的雇员的姓名、职务和工资。 输入并执行查询: SELECT ename,job,sal FROM emp WHERE job=SALESMAN; 执行结果为: ENAME JOB SAL - - - ALLEN SALESMAN 1600 WARD SALESMAN 1250 MARTIN SAL
19、ESMAN 1250 TURNER SALESMAN 1500,说明:结果只显示职务为“SALESMAN”的雇员。字符串和日期型数据的值是包含在单引号中的,如SALESMAN,需要用单引号引起。字符的值对大小写敏感,在emp表中存放的职务字符串全部是大写。 注意:在本练习中,如果SALESMAN写成小写或大小写混合,将不会有查询结果输出,训练2】 显示工资大于等于3000的雇员姓名、职务和工资。 输入并执行查询: SELECT ename, job,sal FROM emp WHERE sal=3000; 执行结果为: ENAME JOB SAL - - - SCOTT ANALYST 300
21、以后。 【练习1】显示部门编号为10的雇员姓名和雇佣时间,2.3.2 复合条件查询 可以用逻辑运算符构成复合的条件查询,即把两个或多个条件,用逻辑运算符连接成一个条件。有3个逻辑运算符,如表2-3所示,表2-3 逻辑运算符,运算的优先顺序是NOT,AND,OR。如果要改变优先顺序,可以使用括号。 下面是使用逻辑与运算的练习。 1使用逻辑与 【训练1】 显示工资在10002000之间(不包括1000和2000)的雇员信息,输入并执行查询: SELECT ename, job,sal FROM emp WHERE sal1000 AND sal2000; 执行结果为: ENAME JOB SAL
22、- - - ALLEN SALESMAN 1600 WARD SALESMAN 1250 MARTIN SALESMAN 1250 TURNER SALESMAN 1500 ADAMS CLERK 1100 MILLER CLERK 1300,说明:两个条件需要同时满足,所以必须使用AND运算。 注意:条件sal1000 AND sal1000 AND 2000,练习1】显示部门10中工资大于1500的雇员。 2使用逻辑或 下面是使用逻辑或运算的练习。 【训练2】 显示职务为CLERK或MANAGER的雇员信息。 输入并执行查询: SELECT * FROM emp WHERE job=CLE
23、RK OR job=MANAGER; 执行结果从略。 说明:检索职务为CLERK或MANAGER的雇员,需要使用OR运算,请自行察看结果。 注意:条件job=CLERK OR job=MANAGER不能写成job=CLERK OR MANAGER,3使用逻辑非 下面是使用逻辑非运算的练习。 【训练3】 显示部门10以外的其他部门的雇员。 输入并执行查询: SELECT * FROM emp WHERE NOT deptno=10; 执行结果从略。 说明:执行结果包含部门编号不等于10的其他部门的雇员,请自行察看结果,4使用逻辑或和逻辑与 下面是同时使用逻辑或和逻辑与的复合练习。 【训练4】 显
24、示部门10和部门20中工资小于1500的雇员。 输入并执行查询 SELECT * FROM emp WHERE (deptno=10 OR deptno=20) AND sal1500,执行结果为: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO - - - - - - - - 7369 SMITH CLERK 7902 17-12月-80 800 20 7876 ADAMS CLERK 7788 23-5月 -87 1100 20 7934 MILLER CLERK 7782 23-1月 -82 1300 10 注意:该练习中的括号是不可省的。如果省
25、略,意义有所不同,练习2】请说明在如上练习中如果省略括号,该语句所代表的含义和查询的结果。 2.3.3 条件特殊表示法 使用如表2-4所示的特殊运算表示法,可使语句更为直观,易于理解,表2-4 特殊运算符,表2-4 特殊运算符,1BETWEEN的用法 对于数值型或日期型数据,表示范围时可以用以下的特殊运算表示方法: NOT BETWEEN. AND. 【训练1】 显示工资在10002000之间的雇员信息。 输入并执行查询: SELECT * FROM emp WHERE sal BETWEEN 1000 AND 2000; 执行结果从略。 注意:下限在前,上限在后,不能颠倒。查询范围中包含上下
26、限的值,因此在本例中,查询工资包含1000和2000在内。请自行执行并察看结果,2IN的用法 使用以下运算形式,可以显示值满足特定集合的结果: NOT IN (.) 【训练2】 显示职务为“SALESMAN,“CLERK”和“MANAGER”的雇员信息。 输入并执行查询: SELECT * FROM emp WHERE job IN (SALESMAN,CLERK,MANAGER); 执行结果从略。 注意:如果在IN前面增加NOT,将显示职务不在集合列表中的雇员。以上用法同样适用于数值型集合,请自行执行并察看结果,练习1】显示部门10和20的雇员信息。 3LIKE的用法 使用LIKE操作符可完
27、成按通配符查找字符串的查询操作,该操作符适合于对数据进行模糊查询。其语句法为: NOT LIKE 匹配模式 匹配模式中除了可以包含固定的字符之外,还可以包含以下的通配符: %:代表0个或多个任意字符。 _ :代表一个任意字符,训练3】 显示姓名以“S”开头的雇员信息。 输入并执行查询: SELECT * FROM emp WHERE ename LIKE S%; 执行结果为: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO - - - - - - - - 7369 SMITH CLERK 7902 17-12月-80 800 20 7788 SCOTT
28、 ANALYST7566 19-4月 -87 3000 20 说明:SMITH和SCOTT名字均以S开头,名字后边的字符和长度任意,训练4】显示姓名第二个字符为“A”的雇员信息。 执行查询: SELECT * FROM emp WHERE ename LIKE _A%; 执行结果从略,请自行执行并察看结果。 说明:“_”代表第一个字符任意,第二个字符必须为“A”,“%”代表第二个字符后面的字符为任意字符,个数任意,练习2】显示姓名中包含字符“A”的雇员信息。 4判断空值NULL 在表中,字段值可以是空,表示该字段没有内容。如果不填写,或设置为空则我们说该字段的内容为NULL。NULL没有数据类
29、型,也没有具体的值,但是使用特定运算可以判断出来。这个运算就是: IS NOT NULL,训练5】 显示经理编号没有填写的雇员。 输入并执行查询: SELECT ename, mgr FROM emp WHERE mgr IS NULL; 执行结果为: ENAME MGR - - KING 注意:以下用法是错误的。 SELECT ename, mgr FROM emp WHERE mgr=NULL,2.4 函数,2.4.1 数值型函数 常用的数值型函数如表2-5所示,表2-5 数值型函数,训练1】 使用数值型函数练习。 步骤1:使用求绝对值函数abs。 SELECT abs(?5) FROM
30、dual; 执行结果: ABS(?5) - 5 说明:求?5的绝对值,结果为5。 步骤2:使用求平方根函数sqrt。 SELECT sqrt(2) FROM dual; 执行结果: SQRT(2) - 1.41421356 说明:2的平方根为1.41421356,步骤3:使用ceil函数。 SELECT ceil(2.35) FROM dual; 执行结果: CEIL(2.35) - 3 说明:该函数求得大于等于2.35的最小整数,结果为3,步骤4:使用floor函数。 SELECT floor(2.35) FROM dual; 执行结果: FLOOR(2.35) - 2 说明:该函数求得小于
31、等于2.35的最大整数,结果为2,步骤5:使用四舍五入函数round。 SELECT round(45.923,2), round(45.923,0), round(45.923, ?1) FROM dual; 执行结果: ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923, ?1) - - - 45.92 46 50 说明:该函数按照第二个参数指定的位置对第一个数进行四舍五入。2代表对小数点后第三位进行四舍五入,0 代表对小数位进行四舍五入,?1代表对个位进行四舍五入,步骤6:使用截断函数trunc。 SELECT trunc(45.923,2), tr
32、unc(45.923),trunc(45.923, ?1) FROM dual; 执行结果: TRUNC(45.923,2) TRUNC(45.923) TRUNC(45.923, ?1) - - - 45.92 45 40 说明:该函数按照第二个参数指定的位置对第一个数进行截断。2代表对小数点后第三位进行截断,0 代表对小数位进行截断,?1代表对个位进行截断,步骤7:使用求余数函数mod。 SELECT mod(1600, 300) FROM dual; 执行结果: MOD(1600,300) - 100 说明:1600除以300的商为5,余数为100,步骤8:使用cos函数。 SELECT
33、 cos(3.14159) FROM dual; 执行结果: COS(3.14159) - ?1 说明:cos函数的输入参数应为弧度,3.14159的cos值为?1。 函数可以嵌套使用,看如下例子,训练2】 求|sin(230o)|的值,保留一位小数。 步骤1:执行查询。 SELECT sin(230*3.14159/180) FROM dual; 结果为: SIN(230*3.14159/180) - ?.76604226 说明:先将230o转换成为弧度,然后进行计算求值,步骤2:求绝对值。 SELECT abs(sin(230*3.14159/180) FROM dual; 结果为: AB
34、S(SIN(230*3.14159/180) - .766042264 说明:本步骤求绝对值,步骤3:保留一位小数。 SELECT round(abs(sin(230*3.14159/180),1) FROM dual; 结果为: ROUND(ABS(SIN(230*3.14159/180),1) - .8 说明:本步骤进行四舍五入,保留小数点后1位。 【练习1】求23/2,四舍五入,保留一位小数,2.4.2 字符型函数 字符型函数包括大小写转换和字符串操作函数。大小写转换函数有3个。常用的字符型函数如表2-6所示,表2-6 字符函数,训练1】 如果不知道表的字段内容是大写还是小写,可以转换后
36、的右侧添加字符,以达到指定宽度。该例中雇员名称右侧连接若干个“.”,凑足15位,然后与雇员职务连接成列表。本例中使用了函数的嵌套,训练3】 显示名称以“W”开头的雇员,并将名称转换成以大写开头。 输入并执行查询: SELECT empno,initcap(ename),job FROM emp WHERE substr(ename,1,1)=W; 结果为: EMPNO INITCAP(EN JOB - - - 7521 Ward SALESMAN,说明:本例在字段列表和查询条件中分别应用了函数initcap和substr。函数initcap将雇员名称转换成以大写开头。函数substr返回ena
37、me从第一个字符位置开始,长度为1的字符串,即第一个字符,然后同大写W比较,训练4】 显示雇员名称中包含“S”的雇员名称及名称长度。 输入并执行查询: SELECT empno,ename,length(ename) FROM emp WHERE instr(ename, S, 1, 1)0; 执行结果为: EMPNO ENAME LENGTH(ENAME) - - - 7369 SMITH 5 7566 JONES 5,训练4】 显示雇员名称中包含“S”的雇员名称及名称长度。 输入并执行查询: SELECT empno,ename,length(ename) FROM emp WHERE i
38、nstr(ename, S, 1, 1)0; 执行结果为: EMPNO ENAME LENGTH(ENAME) - - - 7369 SMITH 5 7566 JONES 5,说明:本例在字段列表和查询条件中分别应用了函数length和instr。Length函数返回ename的长度。instr(ename,S1,1)函数返回ename中从第一个字符位置开始,字符串“S”第一次出现的位置。如果函数返回0,则说明ename中不包含字符串“S”;如果函数返回值大于0,则说明ename中包含字符串“S,练习1】显示部门表中部门和所在城市列表,中间以下划线“_”连接,城市名转换成以大写字母开头。 2.
42、天数。用round函数对天数进行四舍五入,练习1】显示雇员名称和雇佣的星期数。 【练习2】显示从本年1月1日开始到现在经过的天数(当前时间取SYSDATE的值)。 2.4.4 转换函数 Oracle的类型转换分为自动类型转换和强制类型转换。常用的类型转换函数有TO_CHAR、TO_DATE或TO_NUMBER,如表2-8所示,表2-8 类型转换函数,1自动类型转换 Oracle可以自动根据具体情况进行如下的转换: * 字符串到数值。 * 字符串到日期。 * 数值到字符串。 * 日期到字符串。 以下是自动转换的训练,训练1】 自动转换字符型数据到数值型。 输入并执行查询: SELECT 12.5
43、+11 FROM dual; 执行结果为: 12.5+11 - 23.5 说明:在本训练中,因为出现+运算符,说明进行的是算术运算,所以字符串12.5被自动转换成数值12.5,然后参加运算,训练2】 自动转换数值型数据到字符型。 执行以下查询: SELECT 12.5|11 FROM dual; 结果为: 12.5 - 12.511 说明:在本训练中,因为出现|运算符,说明进行的是字符串连接运算,数值11被自动转换成字符串11,然后参加运算,2日期类型转换 将日期型转换成字符串时,可以按新的格式显示。 如格式YYYY-MM-DD HH24:MI:SS表示“年-月-日 小时:分钟:秒”。Orac
47、SP。TH代表序列,SP代表全拼,训练6】 以全拼和序列显示时间。 执行以下查询: SELECT SYSDATE,to_char(SYSDATE,yyyysp),to_char(SYSDATE,mmspth), to_char(SYSDATE,ddth) FROM dual; 执行结果为: SYSDATE TO_CHAR(SYSDATE,YYYYSP) TO_CHAR( TO_C - - -,07-2月 -04 two thousand four second 07th 说明:“two thousand four”为全拼表示的2004年;“second”为全拼序列表示的2月;“07th”为用序
48、列表示的7号。 在格式字符中,前两个字符代表显示结果的大小写。如果格式中的前两个字符是大写,则输出结果的全拼也为大写。如果格式中的前两个字符是小写,则输出结果的全拼也为小写。如果格式中的前两个字符的第一个字符是大写,第二个字符是小写,则输出结果的全拼也为大写开头,后面为字符小写,训练7】 时间显示的大小写。 步骤1:执行以下查询: SELECT SYSDATE,to_char(SYSDATE,yyyysp) FROM dual; 结果为: SYSDATE TO_CHAR(SYSDATE,YYYYSP) - - 07-2月 -04 two thousand four 步骤2:执行以下查询: SE
49、LECT to_char(SYSDATE,Yyyysp) FROM dual; 结果为: SYSDATE TO_CHAR(SYSDATE,YYYYSP) - - Two Thousand Four,步骤3:执行以下查询: SELECT SYSDATE,to_char(SYSDATE,YYyysp) FROM dual; 结果为: SYSDATE TO_CHAR(SYSDATE,YYYYSP) - - TWO THOUSAND FOUR 说明:步骤1输出全拼小写的年度,步骤2输出全拼的以大写开头的年度,步骤3输出全拼大写的年度。 【练习1】显示2008年的8月8日为星期几,3数字类型转换 将数字
50、型转换成字符串时,也可以按新的格式显示。格式字符含义如表2-10所示,表2-10 数值转换符,训练8】 将数值转换成字符串并按新格式显示。 执行以下查询: SELECT TO_CHAR(123.45,0000.00), TO_CHAR(12345,L9.9EEEE) FROM dual; 结果为: TO_CHAR( TO_CHAR(12345,L9.9 - - 0123.45 RMB1.2E+04 说明:格式字符串中“0”表示一位数字,转换结果中相应的位置上没有数字则添加0。“.”表示在相应的位置上显示小数点。“L”将以本地货币符号显示于数字前,在本例中本地货币符号为“RMB”。“EEEE”将
51、显示转换为科学计数法,训练9】 将数值转换成字符串并按新格式显示。 执行以下查询: SELECT TO_CHAR(sal,$99,999) SALARY FROM emp WHERE ename = SCOTT; 结果为: SALARY - $4,000 说明:格式字符串中“$”表示转换结果前面添加$。“9”表示一位数字,“99,999”表示结果可以显示为5位的数字。“,”表示在相应的位置上添加逗号。如果实际数值位数不足5位,则只显示实际位数,如4000实际位数为4位,则只显示4位。如果实际位数超过5位,则会填充为#号,2.4.5 其他函数 Oracle还有一些函数,如decode和nvl,这
53、 nvl(job, 无):用“无”代替空的职务,训练1】 使用nvl函数转换空值。 执行以下查询: SELECTename,nvl(job,无),nvl(hiredate,01-1月-97),nvl(comm,0) FROM emp; 结果为: ENAME NVL(JOB,N NVL(HIREDA NVL(COMM,0) - - - - SMITH CLERK 17-12月-80 0 ALLEN SALESMAN 20-2月 -81 300 说明:本例中,空日期将显示为“01-1月-97”,空职务显示为“无”,空津贴将显示为0,2decode函数 decode函数可以通过比较进行内容的转换,完
54、成的功能相当于分支语句。该函数的第一个参数为要进行转换的表达式,以后的参数成对出现,最后一个参数可以单独出现。如果第一个参数的值与第二个表达式的值相等,则返回第三个表达式的值;如果不等则继续比较,如果它的值与第四个表达式的值相等,则返回第五个表达式的值,以此类推。在参数的最后位置上可以存在单独的参数,如果以上比较过程没有找到匹配值,则返回该参数的值,如果不存在该参数,则返回NULL,训练2】 将职务转换成中文显示。 执行以下查询: SELECTename,decode(job, MANAGER, 经理, CLERK,职员, SALESMAN,推销员, ANALYST,系统分析员,未知) FRO
55、M emp; 结果为: ENAME DECODE(JOB - - SMITH 职员 ALLEN 推销员 WARD 推销员 JONES 经理,MARTIN 推销员 BLAKE 经理 CLARK 经理 SCOTT 系统分析员 KING 未知 TURNER 推销员 ADAMS 职员 JAMES 职员 FORD 系统分析员 MILLER 职员 已选择14行,说明:在以上训练中,如果job字段的内容为“MANAGER”则返回“经理”,如果是“CLERK”则返回“职员”,以此类推。如果不是“MANAGER”、“CLERK”、“SALESMAN”和“ANALYST”之一,则返回“未知”,如KING的职务“P
56、RESIDENT”不在上述范围,返回“未知”。 【练习1】对部门表的部门名称和城市名进行转换,3userenv函数 函数userenv返回用户环境信息字符串,该函数只有一个字符串类型的参数,参数的内容为如下之一的字符串,可以不区分大小写: * ISDBA:判断会话用户的角色是否为SYSDBA,是则返回TRUE。 * INSTANCE:返回会话连接的INSTANCE标识符。 * LANGUAGE:返回语言、地区、数据库字符集信息。 * LANG:返回会话语言的ISO简称。 * TERMINAL:返回正在会话的终端或计算机的标识符,训练3】 返回用户终端或系统标识信息。 执行以下查询: SELEC
58、st返回参数列表中的最大值,least返回参数列表中的最小值。 这两个函数的参数是一个表达式列表,按表达式列表中的第一个表达式的类型对求值后的表达式求得最大或最小值。对字符的比较按ASCII码的顺序进行。如果表达式中有NULL,则返回NULL,训练5】 比较字符串的大小,返回最大值。 执行以下查询: SELECTgreatest(ABC,ABD,abc, abd) FROM dual; 执行结果为: GRE - abd 说明:在上述四个字符串中,大小关系为abdabcABDABC。在ASCII码表中,排在后边的字符大,小写字母排在大写字母之后。字符串的比较原则是,先比较第一位,如果相同,则继续
0/150
联系客服
本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!