Oracle SQL

 基于Oracle的SQL语法:

1、create语句:
create table tablename
(  column1  datatype [constraint],
   column2  datatype [constraint],
               .
               .
               .
   columnn  datatype [constraint]
);
常用的数据类型:char(size),varchar(size),number(size),date.
如:create table customer (
    last_name varchar2(30) not null,
    state_cd  varchar(2),
    sales     number);

 

customer:
Teplow                                                       MA     23445.67
Abbev                                                        GA      6969.96
Alloex                                                       MA      9898.78
Nicholson                                                    CA      6868.99
Martin                                                       CA      2345.45
Laursen                                                      CA        34.34
Bambi                                                        CA      1234.55
McGraw                                                       NJ       123.89

 


2、describe语句:
用法: DESCRIBE [schema.]object[@db_link];
如:describe customer;

3、Insert语句:
insert into tablename values(column1,column2,column3);
如:insert into customer values('Abbev','GA',6969.96);
insert into tablename (column1_name,column3_name) values(column1,column3);
如:insert into customer (last_name,sales) values ('Alloex',9898.78);

4、update语句:
update tablename1[,tablname2..]
set column1=新值[,column2=新值,column3=新值,..]
[where <条件表达式>];


5、delete语句:
delete命令用来从表中删除一行或多行数据。
delete from tablename
[where <条件表达式>];

6、alter语句:
在创建表后,用户可能想要增加表列时用到alter table 命令。在多数情况下,用户都

是用alter增加表列到表中的。
例如:
如果表customer要增加表列sale_date       alter table customer add (sale_date

date);
改变一个已存在表列的数据类型            alter table x modify(col1 date);
同时更改多个表列                        alter table x modify (col1 date,col5

number(3,1));
删除不再想要的列                        alter table customer drop column

sale_date;

7、Select语句:
select  检索信息
from tablename1[,tablename2...]
[where<条件表达式〉]
[order by<分类规则>];                /*分类*/

where子句:
(1),选择所有的表中数据:
select * from tablename;
如:select * from customer;
(2)and,or
如:
select *
from customer
where state_cd='CA' and sales>2000;
(3)!=(^=,<>),<,<=,>,>=,=
如:
select *
from customer
where state_cd != 'MA';
(4)between..and..,not between..and
如:
select *
from customer
where sales between 1000 and 10000;
(5)in(..),not in
如:
select *
from customer
where state_cd in ('CA','MA');
(6)like,not like
如:
select *
from customer
where last_name like 'M%' or last_name like '%cho%';

order by子句:
升序:asc(默认)
降序:desc
如:select * from customer order by state_cd desc,last_name;
    select * from customer order by last_name,state_cd desc;
多级排序有先后之分。

8、别名:
select right.col,left.col
from X right,Y left
where right.col=left.col;

 

表7-7 数值型常用函数
函数返回值样例显示
ceil(n)          大于等于数值n的最小整数                select ceil(10.6)

from customer; 11
floor(n)         小于等于数值n的最大整数                select floor(10.6)

from customer; 1 0
mod(m,n)         m除以n的余数,若n = 0,则返回m         select mod(7,5) from

customer; 2
power(m,n)       m的n次方                               select power(3,2)

from customer; 9
round(n,m)       将n四舍五入,保留小数点后m位           select round

(1234.5678,2) from customer; 1 2 3 4 . 5 7
sign(n)          若n = 0,返回0;否则n > 0,返回1 ;     select sign(12) from

customer; 1
                 n < 0 ,返回- 1
sqrt(n)          n的平方根                              select sqrt(25) from

customer; 5


表7-8 常用字符函数
函数返回值样例显示
initcap(char)     把每个字符串的第一个字符换成大写      Select initcap

('mr.teplow') from customer; Mr.Teplow
lower(char)       整个字符串换成小写                    Select lower

('Mr.Frank Townson') from customer; mr.terry beaker
replace(char,str1,str2) 字符串中所有str1换成str2        select replace

('Scott','S','Boy') from customer; B o y c o t t
soundex(char)     字符串的语音表示,常用于              select last_name from

employee where                  
    名字的模糊查询,可查找发音相似拼写不同的字符串      Abbey soundex

(last_name)=soundex('SMYTHE');
substr(char,m,n)  取出从m字符开始的n个字符的子串        select substr

('ABCDEF',2,1) from customer; C D
length(char)      求字符串的长度                        select length

('Anderson') from customer; 8


表7-9 常用日期型函数
函数返回值样例显示
Sysdate               当前日期和时间          Select sysdate from customer;

28-FEB-02 on February 28,2002
Last_day              本月最后一天            Select last_day(sysdate) from

customer; 31-MAR-02 on March 12,2002
Add_months(d,n)       当前日期d后推n个月      Select add_months(sysdate,2)

from customer;18-MAY-02 on March 18,2002
Months_between(f,s)   日期f和s间相差月数    Select months_between

(sysdate,'12- 13 in April 2003 MAR,-02')from customer;
Next_day(d,day)       d后第一周指定的day日期  Select next_day

(sysdate,'Monday') from customer;03-JAN-02 on December30,2001

 

表7-10 常用日期数据格式
格式返回值样例显示
Y或YY或YYY   年的最后一位,两位或三位  Select to_char(sysdate,'YYY') from

customer;         002表示2002年
SYEAR或YEAR  年,SYEAR使公元前的年份  Select to_char(sysdate,'SYEAR') from

customer;    -1112表示公元前1112年
Q            季度,1~3月为第一季度       Select to_char(sysdate,'Q') from

customer;         2表示第二季度
MM           月份数                 Select to_char(sysdate,'MM') from

customer;             12表示12月
RM           月份的罗马表示         Select to_char(sysdate,'RM') from

customer;             IV表示4月
Month        用9个字符长度表示的月份名       Select to_char(sysdate,'Month')

from customer; May后跟6个空格表示5月
WW           当年第几周          Select to_char(sysdate,'WW') from customer;

           24表示2002年6月13日为第24周
W            本月第几周        Select to_char(sysdate,'W') from customer;   

           1 2002年10月1日为第1周
DDD          当年第几天,1月1日为001,  Select to_char(sysdate,'DDD') from

customer;     363 2002年12月29日为第363天
DD           当月第几天      Select to_char(sysdate,'DD') from customer;    

                 04 10月4日为第4天
D            周内第几天      Select to_char(sysdate,'D') from customer;     

                 5 2002年3月14日为星期一
DY           周内第几天缩写  Select to_char(sysdate,'DY') from customer;    

             SUN 2002年3月24日为星期天
HH或HH12     12进制小时数    Select to_char(sysdate,'HH') from customer;    

              0 2午夜2点过8分为02
HH24         24小时制        select to_char(sysdate,'HH24') from customer;  

                   14下午2点08分为14
MI           分钟数(0~59)   Select to_char(sysdate,'MI') from customer;    

         17下午4点17分
SS           秒数(0~59)     Select to_char(sysdate,'SS') from customer;    

           22 11点3分22秒

提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分

钟也能工作,但结果是错误的。


Oracle提供三种主要的转换函数。
(1).To_char     将任意类型的数据转换成字符类型。语句select to_char(8897) from

customer;返回一个包含字符串8 8 9 7的字符类型的数据。

(2).To_number   将一组合法的数字字符串(如字符数据8897)转换成数值。语句select

to_number('8897') from customer;返回一个包括数值8897的数值类型的数据。

(3).To_date    将适合格式的字符串数据转换成日期型数据,这是最容易产生错误的转

换。因为12-DEC-02是合法的日期格式,语句select to_date('12-DEC-02') from

customer;能成功地进行数据转换。而语句select to_date('bad date') from

customer;在执行时会出问题。语句select to_date('20021227','YYYYMMDD') from

customer;将返回日期27-DEC-02,因为在to_date函数中的日期格式和被转化的数据是

合法的。语句select to_date ('20021236','YYYYMMDD') from customer;将失败,因

为在12月中没有36天。
提示用to_date转换机制时,如果被转换的数据格式不对,会出现各种各样的Oracle错误

 

 

 


现在将学习如何把它们组合起来编写一个大的报表。在SQL*Plus中,有许多参数可控制

SQL*Plus的输出显示格式。利用SQL*Plus命令show all,用户能知道显示格式的当前设

置。
该命令的输出格式大致如下:
SQL> show all;
appinfo为OFF并且已设置为"SQL*Plus"
arraysize 15
autocommit OFF
autoprint OFF
autorecovery OFF
autotrace OFF
blockterminator "." (hex 2e)
btitle OFF and 为下一条 SELECT 语句的前几个字符
cmdsep OFF
colsep " "
compatibility version NATIVE
concat "." (hex 2e)
copycommit 0
COPYTYPECHECK 为 ON
define "&" (hex 26)
describe DEPTH 1 LINENUM OFF INDENT ON
echo OFF
editfile "afiedt.buf"
embedded OFF
escape OFF
用于6或更多行的 FEEDBACK ON
flagger OFF
flush ON
heading ON
headsep "|" (hex 7c)
instance "local"
linesize 80
lno 15
loboffset 1
logsource ""
long 80
longchunksize 80
markup HTML OFF HEAD "<style type='text/css'> body {font:10pt

Arial,Helvetica,sans-serif; color:blac
newpage 1
null ""
numformat ""
numwidth 10
pagesize 14
PAUSE 为OFF
pno 1
recsep WRAP
recsepchar " " (hex 20)
release 902000400
repfooter OFF and 为 NULL
repheader OFF and 为 NULL
serveroutput OFF
shiftinout INVISIBLE
showmode OFF
spool OFF
sqlblanklines OFF
sqlcase MIXED
sqlcode 0
sqlcontinue "> "
sqlnumber ON
sqlpluscompatibility 8.1.7
sqlprefix "#" (hex 23)
sqlprompt "SQL> "
sqlterminator ";" (hex 3b)
suffix "sql"
tab ON
termout ON
time OFF
timing OFF
trimout ON
trimspool OFF
ttitle OFF and 为下一条 SELECT 语句的前几个字符
underline "-" (hex 2d)
USER 为"CIY"
verify ON
wrap : 行将为已换行
如上所示,用户可以设置其中很多参数来改变当前工作环境,下面介绍更改其中一些主
要参数。

1 、页和行的大小
  命令set linesize告诉Oracle页宽是多少,最常用的设置为80和132。为设置行宽为80

,可输入命令set linesize 80。set pagesize命令告诉Oracle页的长度是多少,常用设

置为55和60。为了更容易地看到分页,可以用命令set pagesize 30设置页长为30行。
2、 页头标
  可以用ttitle命令设置每页的标题。ttitle命令包括许多选项。通常使用的缺省设置

为:标题文本在行中央,每页上都有日期和页号。如果需要两行头标,则需要使用竖字

符( | )。命令ttitle 'Database techologies|Customer Report'使Orale居中放置文本

“ Database Technologies”为第一个头标行,然后将文本“ Customer Report”居中

放置在第二行。
3、 页脚标
  可用btitle命令在每页的底部放置一些信息。我们建议用户将程序名放在此处。如果

用户需要改一个报告时,只要指定页底部的程序名,就可知道要改那个报告,这有助于

避免混淆。命令btitle '---sample.sql---'使SQL*Plus把文本“---sample.sql---”放

于每一页底部中央。用户还可以使用left或right 关键字将btitle命令中的文字放到相

应的位置。如果btitle命令中没有用
于定位的关键字,Oracle将文本放在底行的中央。
4、 将SQL*Plus结果写到文件中
  spool命令使Oracle将SQL*Plus的输出保存到一个数据文件中。spool命令中要指定输

出文件名。如在Windows NT上,要将SQL*Plus的输出保存到数据文件out.lis中,可用命

令spool c:/report/out.lis。在大多数操作系统中,如果用户未指定后缀,系统会自动

在文件名后增加后缀“.lst”。例如,命令spool report会自动产生一个名为

report.lst的文件。
提示SQL*Plus自动把文件扩展名加到spool命令中指定的文件名后。在不同的操作系统中

,扩展名可能不同。
如果已执行了命令set linesize 70, set pagesize 23,并用命令col sales format

99999999格式化了sales表列,要保存SQL语句select * from customer的输出到一个文

件。这个输出将放在用spool命令指定的文件中。请注意,因为sales表列是用99999999

格式化的,因此显示结果中没有小数。
为停止假脱机(spooling),可用命令spool off 或spool out。后者关闭输出文件并打印

输出。
5、 格式化输出表列
  大多数情况下,用户需要格式化实际的表列数据, Column 命令可完成这项工作。下

面先执行两条格式化命令,然后再查询customer表。
  命令column last_name format a8 wrap heading 'Last|Name'告诉SQL*Plus在

last_name表列只显示8个字符。8代表last_name的显示宽度,a表示每个位置只能是字符

。其中wrap部分说明如果last_name多于8个字符,多余的字符显示在下一行的对应位置

。Heading部分告诉SQL*Plus把“Last Name”分两行打印在报告的头上。
  命令column state_cd format a8 heading 'State|Code' 让SQL*Plus以8个字符位置

显示state_cd,并且在state_cd表列的顶部放一个两行的列标题“ State Code”。同样

的S Q L语句select * from customer; 的输出结果如图所示。
Last     State           YTD
Name     Code          Sales
-------- -------- ----------
Teplow   MA         23445.67
Abbev    GA          6969.96
Alloex   MA          9898.78
Nicholso CA          6868.99
n

Martin               2345.45
Laursen                34.34
Bambi                1234.55
McGraw   NJ           123.89


现在我们来格式化数值型域。format子句可规定用于显示每个数值的位数,并指明在何

处插入逗号。语句column sales format 999,999,999,999.00 heading 'Sales'使

SQL*Plus显示12位数字,两位小数,用逗号作分隔符。

1. 断开逻辑(Break Logic)
  现在增加断开逻辑。在SQL*Plus中,增加断开逻辑的方法很简单。只要执行break命令

,SQL*Plus就会管理所有的断开逻辑。我们来看看执行表列格式化命令col sales

format 999999.00 和S Q L查询语句select state_cd,last_name, sales from

customer order by state_cd,last_name;,未用断开逻辑时,其输出如图7 - 4所示。
STAT LAST_NAME                                                         SALES
---- ------------------------------------------------------------ ----------
CA   Bambi                                                           1234.55
CA   Laursen                                                           34.34
CA   Martin                                                          2345.45
CA   Nicholson                                                       6868.99
GA   Abbev                                                           6969.96
MA   Alloex                                                          9898.78
MA   Teplow                                                         23445.67
NJ   McGraw                                                           123.89
执行断开命令break on state_cd,上述查询语句的输出如图7 - 5所示。
STAT LAST_NAME                                                         SALES
---- ------------------------------------------------------------ ----------
CA   Bambi                                                           1234.55
     Laursen                                                           34.34
     Martin                                                          2345.45
     Nicholson                                                       6868.99
GA   Abbev                                                           6969.96
MA   Alloex                                                          9898.78
     Teplow                                                         23445.67
NJ   McGraw                                                           123.89
注意,在图7 - 5中,state_cd为C A的在第1行显示后,第2行至第5行都不显示(因为从

第一行后state_cd没有改变),然后第6行和第7行的值不同,又再显示。图7-5 使用断开

逻辑的输出
提示:为在SQL*Plus中实现断开逻辑,必须在断开命令指定的表列上进行查询排序。
为说明此点,执行查询select state_cd,last_name, sales from customer order by

last_name;再执行命令break on state_cd,输出如图7 - 6所示。
STAT LAST_NAME                                                         SALES
---- ------------------------------------------------------------ ----------
GA   Abbev                                                           6969.96
MA   Alloex                                                          9898.78
CA   Bambi                                                           1234.55
     Laursen                                                           34.34
     Martin                                                          2345.45
NJ   McGraw                                                           123.89
CA   Nicholson                                                       6868.99
MA   Teplow                                                         23445.67
图7-6 在state_cd上断开以last_name列排序的输出在图7 - 6中,先打印四个CA,后跟

一个NJ,再是一个CA,可见last_name排序的查询结果已与图7 - 5中用state_cd排序的

大不相同了。

2. 断开和跳过(Break and Skip)
  通常,实现断开逻辑后,我们希望在出现新的断开列值前空几行,这时就要用到s k i

p命令。用命令col sales format $999,999,999.99 heading 'YTD|Sales'重新格式化sa

les表列,再执行断开命令break on state_cd skip 1。现在,语句select state_cd,

last_name, sales from customer order by state_cd, last_name;产生如图7 - 7所

示的输出。
STAT LAST_NAME
---- ------------
             YTD
           Sales
----------------
CA   Bambi
       $1,234.55

     Laursen
          $34.34

     Martin
       $2,345.45

     Nicholson
       $6,868.99

GA   Abbev
       $6,969.96

MA   Alloex
       $9,898.78

     Teplow
      $23,445.67

NJ   McGraw
         $123.89
图7-7 断开后后空一行的输出报告.请注意Oracle是怎样控制打印state_cd表列的。利用

这一点可以很容易地通知Oracle计算每个断开部分的总销售(sales)值。

3. 在断开点计算表列值
  用compute sum 命令,用户可以让SQL*Plus计算所需的和。现在讨论完成断开格式化

和计算Y T D合计值所需的命令。
命令compute sum of sales on report是在报表结尾处,计算报表的合计值。r e p o r

t在此处用于触发数值域求和,并显示在报表的结尾处。而命令“ compute sum of

sales on state_cd” 使在打印新的state_cd时打印合计。
为同时打印报表合计和断开点合计,需要用命令break on report skip 1 on state_cd

skip 1重置断开条件。修改SQL 语句以便用 state_cd排序数据。对于断开报表,必须用

break 语句中同样的表列排序数据。
注意为使本节的输出能打印在一页中,必须增加页尺寸。为此输入命令set pagesize 28


现在,所需的S Q L语句为select state_cd, last_name, sales from customer order

by
state_cd, last_name;。用语句col sales format $999,999,999.00 heading

'YTD|Sales'重新格式化
s a l e s表列后,执行上述s e l e c t语句,其断开输出如图7 - 8所示
4. 基于双表的断开逻辑与求和
  最后,利用本章学到的知识给出一个最后的报表。表连接:在多个表中,通过匹配表

列值选择数据。下面我们显示州名(state_name)而非州名代码(state_cd)。图7-8 结尾

处带总计的state_cd断开报表,我们需要state表中的state_name表列的值,可以通过

state_cd连接state和customer两个表。选择语句select state_name, last_name,

sales from state a,customer b where a.state_cd =b.state_cd order by

state_name, last_name;。因为计算时使用state_name表列,所以必须用break on

report skip 1 on state_name skip 1重新向SQL*Plus描述断开条件。我们也需要用

compute sum of sales on state_name和compute sum of sales on report语句重新定

义断开点合计和报表合计。现在执行连接两个表的查询,输出结果如图7 - 9所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值