回 帖 发 新 帖 刷新版面

主题:Oracle PL/SQL从入门到精通

Oracle PL/SQL从入门到精通

丁士锋  等编著













清 华 大 学 出 版 社
北  京
内 容 简 介
本书以面向应用为原则,深入浅出地介绍了Oracle平台上使用PL/SQL语言进行数据库开发的技术。通过大量的示例,详细介绍了PL/SQL的语言特性、使用技巧,同时配以两个在实际工作中的案例深入地剖析了使用PL/SQL进行Oracle开发的方方面面。
本书附带1张DVD光盘,内容为作者为本书录制的全程语音教学视频及本书所涉及的源代码。
本书分为5大篇共20章。涵盖的内容主要有PL/SQL语言基础、开发环境、变量与类型、控制语句、数据表的管理和查询、数据表的操纵、使用PL/SQL的记录与集合、各种内置函数、游标、事务处理、异常处理、子程序、包、面向对象的开发等技术点。通过示例性的代码,由浅入深,详细介绍了每一个技术要点在实际工作中的应用,对各种技术要点的应用场合进行了细致的分析。
本书适合于使用PL/SQL进行应用程序开发的人员、对软件开发有兴趣的学生及爱好者阅读和参考;对数据库管理员、企业IT运维人员也具有很强的指导作用。


本书封面贴有清华大学出版社防伪标签,无标签者不得销售。
版权所有,侵权必究。侵权举报电话:010-62782989  13701121933

图书在版编目(CIP)数据

Oracle PL/SQL从入门到精通 / 丁士锋等编著. —北京:清华大学出版社,2012.6
ISBN 978-7-302-28103-0

Ⅰ. ①O…  Ⅱ. ①丁…  Ⅲ. ①关系数据库-数据库管理系统,Oracle  Ⅳ. ①TP311.138

中国版本图书馆CIP数据核字(2012)第030492号


责任编辑:夏兆彦
封面设计:
责任校对:徐俊伟
责任印制:

出版发行:清华大学出版社    
网    址:http://www.tup.com.cn, http://www.wqbook.com
地    址:北京清华大学学研大厦A座        邮    编:100084
社 总 机:010-62770175                邮    购:010-62786544
投稿与读者服务:010-62776969,c-service@tup.tsinghua.edu.cn
质量反馈:010-62772015,zhiliang@tup.tsinghua.edu.cn
印 刷 者:
装 订 者:肖  米
经    销:全国新华书店
开    本:185mm×260mm     印    张:42.25       字    数:1055千字
          (附DVD 1张)
版    次:2012年6月第1版                  印    次:2012年6月第1次印刷
印    数:1~5000
定    价:25.00元
产品编号:045147-01
[b]当当地址:http://searchb.dangdang.com/?key=%20%20%20Oracle%20PL[/b]

回复列表 (共54个回复)

51 楼

3.使用DISTINCT查询唯一列数据
可以使用DISTINCT关键字获取列中的唯一值。例如要查询emp表中唯一职位列表,可以使用DISTINCT关键字,如以下代码所示。

SQL> SELECT DISTINCT job FROM emp;
JOB
----------
IT
分析人员
经理
老板
职员
销售人员
已选择7行。

可以看到DISTINCT关键字取出了job字段中职别唯一的字段列表。
注意:DISTINCT关键字会导致索引失效,在大型数据集查询中应该尽量避免DISTINCT查询。
4.在查询中使用表达式
在查询中可以使用复杂的表达式,比如执行计算或者做假定推测。算术表达式中的运算符优先级可参考本书第3章中介绍的运算符优先级部分的介绍。
例如下面的查询语句将emp表中的员工薪资增加12%,使用了带括号的算术运算符:

SQL> col ename format a15;
SQL> SELECT empno,ename,sal*(1+0.12) 
     EMPNO ENAME      SAL*(1+0.12)
     ----- --------- --------------------------------------------------
      7369 史密斯         1965.824
      7499 艾伦           1904
      7521 沃德           1512
      7566 约翰           3998.4
      7654 马丁           1512
      7698 布莱克         3192
      7782 克拉克         4017.496
      7788 斯科特         1971.424
      7839 金             9554.16
      7844 特纳           1792
      7876 亚当斯         1612.8
      7900 吉姆           1176
      7902 福特           4032
      7892 张八
      7893 霍九
      7894 霍十
      7895 APPS          3360
      7903 通利           2240
      7904 罗威           2240
      7898 O'Malley
已选择20行。

因为在算术运算符中,括号的优先级高于加、减、乘、除,因此上面的语句中先计算括号中的值,然后与薪资字段sal的值相乘,得到最终的运算结果。
注意:在进行算术运算时,如果列包含NULL值,那么结果也为NULL。

52 楼

5.使用列别名
在使用SELECT语句时,可以为列指定别名。比如在上面的示例语句中,算术运算符的列名为sal*(1+0.12),此时可以通过为列取一个列别名来提供语义友好的查询,如以下语句所示。

SQL> SELECT empno,ename,sal*(1+0.12) raised_sal FROM emp;
     EMPNO ENAME             RAISED_SAL
     ----- ------------ ------------------------------------------------
      7369 史密斯             1965.824
      7499 艾伦               1904
      7521 沃德               1512
      7566 约翰               3998.4
      7654 马丁               1512
      7698 布莱克             3192
      7782 克拉克             4017.496
      7788 斯科特             1971.424
      7839 金                  9554.16
      7844 特纳               1792
      7876 亚当斯             1612.8
      7900 吉姆               1176
      7902 福特               4032
      7892 张八
      7893 霍九
      7894 霍十
      7895 APPS              3360
      7903 通利               2240
      7904 罗威               2240
      7898 O'Malley
已选择20行。

可以在列名后面加一个空格,再指定友好的列名称,或者是使用可选的关键字AS。
注意:如果列别名中包含有空格、特殊字符或者大小写敏感字符,则要求用双引号。
下面的语句通过为emp表提供别名的查询,显示了中文化的字段名称。

SQL> SELECT empno 员工名称,ename "员工姓名_NAME",job 职级,sal AS 薪水 from emp;
  员工名称 员工姓名_N 职级             薪水
  ------- -------- ---------- ------------
      7369 史密斯     职员             1755.2
      7499 艾伦       销售人员         1700
      7521 沃德       销售人员         1350
      7566 约翰       经理             3570
      7654 马丁       销售人员         1350
      7698 布莱克     经理             2850
      7782 克拉克     经理             3587.05
      7788 斯科特     职员             1760.2
      7839 金         老板             8530.5
      7844 特纳       销售人员         1600
      7876 亚当斯     职员             1440
      7900 吉姆       职员             1050
      7902 福特       分析人员         3600
      7892 张八       IT
      7893 霍九
      7894 霍十
      7895 APPS                       3000
      7903 通利       职员             2000
      7904 罗威       职员             2000
      7898 O'Malley
已选择20行。

6.字符串连接
可以通过||符号连接一个或多个字段的值,使之成为单个字段,如以下示例所示。

SQL>  SELECT ename || '的薪资为:' || sal 员工薪水 FROM emp;
员工薪水
--------------------------------------------------------------
史密斯的薪资为:1755.2
艾伦的薪资为:1700
沃德的薪资为:1350
约翰的薪资为:3570
马丁的薪资为:1350
布莱克的薪资为:2850
克拉克的薪资为:3587.05
斯科特的薪资为:1760.2
金的薪资为:8530.5
特纳的薪资为:1600
亚当斯的薪资为:1440
吉姆的薪资为:1050
福特的薪资为:3600
张八的薪资为:
霍九的薪资为:
霍十的薪资为:
APPS的薪资为:3000
通利的薪资为:2000
罗威的薪资为:2000
O'Malley的薪资为:
已选择20行。

使用||连字符,能够通过列与列之间、列与算术表达式之间或者列与常数值之间的连接,来创建一个字符表达式。连字运算符两边的列被合并成一个单个的输出列。

53 楼

6.1.2  指定查询条件
上一节介绍的SQL语句总是一次性取出所有的表行数据,如果要按条件进行查询,可以使用WHERE子句来过滤所返回的行数据,其语法如下所示。

SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
[WHERE condition(s)];

WHERE子句紧跟在FROM子句的后面,其语法含义如下所示。
    WHERE关键字:限制满足查询条件的行。
    condition:由列名、表达式、常数和比较操作组成,用来指定查询的条件。
condition通常返回一个布尔值,如果该条件为True,则提取满足条件的记录;如果条件为False或NULL,则跳过不满足条件的行。
WHERE子句中的条件子句由如下的形式组成:

列名+比较条件+列名、常量或值列表。

可以在条件子句中比较列值、文字值、算式表达式或函数。下面将分别对各种条件子句进行介绍。

54 楼

1.简单WHERE子句
要查询emp表中部门编号为20的员工记录,可以使用简单的WHERE子句,如以下语句所示。

SQL> SELECT empno, ename, job, deptno
        FROM emp
       WHERE deptno = 20;
     EMPNO ENAME     JOB          DEPTNO
     ----- ------ ------- -------------
      7369 史密斯     职员             20
      7566 约翰       经理             20
      7788 斯科特     职员             20
      7876 亚当斯     职员             20
      7902 福特       分析人员         20
      7892 张八       IT               20
      7893 霍九                        20
      7894 霍十                        20
      7895 APPS                       20
      7898 O'Malley                  20
已选择10行。

在WHERE子句中使用了deptno列名等于20这样一个布尔表达式,在WHERE子句中可以使用多种比较操作符,例如可以使用大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、等于(=)或不等于(<>)等符号。例如要查询薪水大于等于3000的员工列表,可以使用如下SQL语句:

SQL> SELECT empno,ename,job,sal FROM emp WHERE sal>=3000;
     EMPNO ENAME   JOB             SAL
     ----- ------ ---------- -----------
      7566 约翰     经理             3570
      7782 克拉克   经理             3587.05
      7839 金       老板             8530.5
      7902 福特     分析人员         3600
      7895 APPS                     3000

2.日期和字符串比较
在WHERE条件子句中,对于数字类型,可以直接输入条件值,但是对于日期和字符串类型,则需要使用单引号括住条件值。
&#61477;注意:单引号中的字符串是区分大写小的。
例如要查询emp表中job为职员的员工列表,可以使用如下的语法:

SQL> SELECT empno,ename,job,sal FROM emp WHERE job='职员';
     EMPNO   ENAME     JOB               SAL
     -----   ------ ----------- ------------
      7369   史密斯     职员             1755.2
      7788   斯科特     职员             1760.2
      7876   亚当斯     职员             1440
      7900   吉姆       职员             1050
      7903   通利       职员             2000
      7904   罗威       职员             2000
已选择6行。

如果将CLERK的大小写进行更改,查找到的结果则完全不同。例如下面的语句根本查不到任何数据:

SELECT * FROM emp WHERE JOB='clerk';
SELECT * FROM emp WHERE JOB='Clerk';
SELECT * FROM emp WHERE JOB='cLerk';

在查询日期类型的条件时,必须要进行数据类型匹配,例如为hiredate提供一个字符串是非法的,必须使用内置的TO_DATE函数转换字符串为日期值。例如要查询雇佣期等于1981-12-3的员工,可以使用如下的语法:

SQL> SELECT empno,ename,job,sal,hiredate FROM emp WHERE hiredate = TO_DATE ('1981-12-3', 'YYYY-MM-DD');
     EMPNO ENAME    JOB            SAL   HIREDATE
     ----- ---- ------------- ------- -------------
      7900 吉姆       职员           1050  03-12月-81
      7902 福特       分析人员       3600  03-12月-81

&#61477;注意:Oracle 数据库以内部数字格式存储日期,表示为:世纪、年、月、日、小时、分和秒。默认的日期显示是DD-MON-RR。
可以通过使用TO_CHAR函数将日期型转换为格式化的字符串来提供友好的查询结果显示,例如将上述查询更改为如下的语句:

SQL> SELECT empno, ename, job, sal, TO_CHAR (hiredate, 'YYYY-MM-DD') hiredate
      FROM emp
     WHERE hiredate = TO_DATE ('1981-12-3', 'YYYY-MM-DD');
     EMPNO ENAME    JOB            SAL     HIREDATE
     ----- ---- ------------ -------- -------------
      7900 吉姆      职员           1050     1981-12-03
      7902 福特      分析人员       3600     1981-12-03

使用TO_CHAR可以指定日期的显示格式,使得日期的显示符合常见的日期显示格式。

我来回复

您尚未登录,请登录后再回复。点此登录或注册