按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
SQL 21 日自学通(V1。0) 翻译人 笨猪
输出
line 5 truncated。
1 ttitle left 'Report for Product: &prod_title' skip 2
2 col product_name new_value prod_title
3 select product_name; unit_cost
4 from products
5* where product_name = 'COFFEE MUG'
输入
SQL》 @prod1
输出
Report for Product: COFFEE MUG
PRODUCT_NAME UNIT_COST
COFFEE MUG 6。95
分析
PRODUCT_NAME 列的值已经通过 NEW_VALUE 方法被存入了变量 PROD_TITLE
中 该变量中的值将在稍后被 TTITLE 命令调用
对于在 SQL 中更多的变量信息 请参见第 18 天的 PL/SQL 简介 以及第 19 天的
TRANSACT SQL 简介
DUAL 表
DUAL 表是在每一个 ORACLE 数据库中都存在的虚拟表 它只有一个叫 DUMMY 的
列和一行值为 X 的数据 这个表可以由所有的用户出于通用的目标如进行计算 这时它可
以像一个计算器一样使用 或维护 SYSDATE 的格式而使用
输入
SQL》 desc dual;
输出
Name Null? Type
DUMMY VARCHAR2(1)
输入
SQL》 select * from dual
460
…………………………………………………………Page 461……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输出
D
X
让我们来看一对使用 DUAL 表的例子
输入
SQL》 select sysdate from dual;
输出
SYSDATE
08…MAY…97
输入
SQL》 select 2 * 2 from dual;
输出
2*2
非常简单 第一条语句从 DUAL 表中选择了 SYSDATE 以取得今天的日期 第二个例
子显示了如何用这个表来进行乘法计算 我们的答案是 2*2 的结果为 4
DECODE 函数
DECODE 函数是 SQL*PLUS 中众多功能强大的函数之一— — 也许它的功能是最强大
的 标准的 SQL 中没有过程函数 它是包括在如 COBOL 和 C 语言中的
DECODE 语句与程序语言中的 IF THEN 语句类似 对于复杂的报表来说灵活性是
必需的 DECODE 可以弥补标准的 SQL 与过程语言函数之间的缺陷
语法
DECODE(column1; value1; output1; value2; output2; output3)
语法中的例子是对 column1 列执行 DECODE 函数 如果 column1 有一个值为 value1
那么将会用 output1 来代替当前值 如果 column1 的值为value2 那么就会用 OUTPUT2 来
代替当前值 如果 column1 中哪两个值都不是 那么就会用 OUTPUT3 来代替当前值
实际应用的例子呢 我们先来对一个新表运行一下 SELECT 语句
输入
SQL》 select * from states;
461
…………………………………………………………Page 462……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输入
ST IL
IN OH
FL CA
KY NY
7 rows selected。
现在来用一下 DECODE 命令
输入
SQL》 select decode(state;'IN';'INDIANA';'OTHER') state from states;
输出
STATE OTHER
INDIANA OTHER
OTHER OTHER
OTHER OTHER
7 rows selected。
分析
符合条件 州为 IN 的记录只有一条 所以只有一行显示为 INDIANA 其它的记录
看上去都不符合 因为它们的显示为 OTHER
下边的例子为表中的每一个值提供了输入字符串 只有当你的州不在列表中时 你才
会收到 OTHER 信息
输入
SQL》 select decode(state;'IN';'INDIANA';
2 'FL';'FLORIDA';
3 'KY';'KENTUCKY';
4 'IL';'ILLINOIS';
5 'OH';'OHIO';
6 'CA';'CALIFORNIA';
7 'NY';'NEW YORK';'OTHER')
8 from states;
输出
462
…………………………………………………………Page 463……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
DECODE(STATE)
INDIANA
FLORIDA
KENTUCKY
ILLINOIS
OHIO
CALIFORNIA
NEW YORK
7 rows selected。
这实在太容易了 在下一个例子中将引入一个 PAY 表 这个表可以显示职 DECODE
函数更为强大的能力
输入
SQL》 col hour_rate hea 〃HOURLY|RATE〃 for 99。00
SQL》 col date_last_raise hea 〃LAST|RAISE〃
SQL》 select name; hour_rate; date_last_raise
2 from pay;
输出
HOURLY LAST
NAME RATE RAISE
JOHN 12。60 01…JAN…96
JEFF 8。50 17…MAR…97
RON 9。35 01…OCT…96
RYAN 7。00 15…MAY…96
BRYAN 11。00 01…JUN…96
MARY 17。50 01…JAN…96
ELAINE 14。20 01…FEB…97
7 rows selected。
准备好了吗 现在是给在 PAY 表中的每个人长工资的时候了 如果某个人上次长工资
的时间是 1997 年 那么将他的工资上浮 10% 如果他上次长工资是在 1996 年 那么将他
的工资上浮 20% 此外 还要显示在这两种情况下工资上调的百分率
输入
SQL》 col new_pay hea 'NEW PAY' for 99。00
SQL》 col hour_rate hea 'HOURLY|RATE' for 99。00
463
…………………………………………………………Page 464……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 col date_last_raise hea 'LAST|RAISE'
SQL》 select name; hour_rate; date_last_raise;
2 decode(substr(date_last_raise;8;2);'96';hour_rate * 1。2;
3 '97';hour_rate * 1。1) new_pay;
4 decode(substr(date_last_raise;8;2);'96';'20%';
5 '97';'10%';null) increase
6 from pay;
输出
HOURLY LAST
NAME RATE RAISE NEW PAY INC
JOHN 12。60 01…JAN…96 15。12 20%
JEFF 8。50 17…MAR…97 9。35 10%
RON 9。35 01…OCT…96 11。22 20%
RYAN 7。00 15…MAY…96 8。40 20%
BRYAN 11。00 01…JUN…96 13。20 20%
MARY 17。50 01…JAN…96 21。00 20%
ELAINE 14。20 01…FEB…97 15。62 10%
7 rows selected。
分析
根据输出情况 除了 JEFF 和 ELAINE 每个人的工资都上涨了 20% 他们在今年已经
涨过工资了
日期转换
如果你想