SQL大全

Oracle PL/SQL 编程手册(SQL大全)- -
                                      
一、SQL�WPLUS�W
1�W引言�W
SQL命令�W
以下17个是作为语句开头的关键字:�W
alter�Wdrop�Wrevoke�W
audit�Wgrant�Wrollback*�W
commit*�Winsert�Wselect�W
comment�Wlock�Wupdate�W
create�Wnoaudit�Wvalidate�W
delete�Wrename�W
这些命令必须以“;”结尾�W
带*命令句尾不必加分号,并且不存入SQL缓存区。�W
SQL中没有的SQL*PLUS命令�W
这些命令不存入SQL缓存区�W
@�Wdefine�Wpause�W
#�Wdel�Wquit�W
$�Wdescribe�Wremark�W
/�Wdisconnect�Wrun�W
accept�Wdocument�Wsave�W
append�Wedit�Wset�W
break�Wexit�Wshow�W
btitle�Wget�Wspool�W
change�Whelp�Wsqlplus�W
clear�Whost�Wstart�W
column�Winput�Wtiming�W
compute�Wlist�Wttitle�W
connect�Wnewpage�Wundefine�W
copy�W
---------�W
2�W数据库查询�W
数据字典�W
TAB�W用户创建的所有基表、视图和同义词清单�W
DTAB�W构成数据字典的所有表�W
COL�W用户创建的基表的所有列定义的清单�W
CATALOG�W用户可存取的所有基表清单�W
select�W*�Wfrom�Wtab;�W
describe命令�W描述基表的结构信息�W
describe�Wdept�W
select�W*�W
from�Wemp;�W
select�Wempno,ename,job�W
from�Wemp;�W
select�W*�Wfrom�Wdept�W
order�Wby�Wdeptno�Wdesc;�W
逻辑运算符�W
=�W!=或<>�W>�W>=�W<�W<=�W
in�W
between�Wvalue1�Wand�Wvalue2�W
like�W
%�W
_�W
in�Wnull�W
not�W
no�Win,is�Wnot�Wnull�W
谓词in和not�Win�W
有哪些职员和分析员�W
select�Wename,job�W
from�Wemp�W
where�Wjob�Win�W('clerk','analyst');�W
select�Wename,job�W
from�Wemp�W
where�Wjob�Wnot�Win�W('clerk','analyst');�W
谓词between和not�Wbetween�W
哪些雇员的工资在2000和3000之间�W
select�Wename,job,sal�Wfrom�Wemp�W
where�Wsal�Wbetween�W2000�Wand�W3000;�W
select�Wename,job,sal�Wfrom�Wemp�W
where�Wsal�Wnot�Wbetween�W2000�Wand�W3000;�W
谓词like,not�Wlike�W
select�Wename,deptno�Wfrom�Wemp�W
where�Wename�Wlike�W'S%';�W
(以字母S开头)�W
select�Wename,deptno�Wfrom�Wemp�W
where�Wename�Wlike�W'%K';�W
(以K结尾)�W
select�Wename,deptno�Wfrom�Wemp�W
where�Wename�Wlike�W'W___';�W
(以W开头,后面仅有三个字母)�W
select�Wename,job�Wfrom�Wemp�W
where�Wjob�Wnot�Wlike�W'sales%';�W
(哪些雇员的工种名不以sales开头)�W
谓词is�Wnull,is�Wnot�Wnull�W
没有奖金的雇员(即commision为null)�W
select�Wename,job�Wfrom�Wemp�W
where�Wcomm�Wis�Wnull;�W
select�Wename,job�Wfrom�Wemp�W
where�Wcomm�Wis�Wnot�Wnull;�W
多条件查询�W
select�Wename,job�W
from�Wemp�W
where�Wdeptno=20�W
and�Wjob!='clerk';�W
表达式�W
+�W-�W*�W/�W
算术表达式�W
选择奖金高于其工资的5%的雇员�W
select�Wename,sal,comm,comm/sal�Wfrom�Wemp�W
where�Wcomm>.05*sal�W
order�Wby�Wcomm/sal�Wdesc;�W
日期型数据的运算�W
add�Wtwo�Wdays�Wto�W6-Mar-87�W
6-Mar-87�W+�W2�W=�W8-Mar-87�W
add�Wtwo�Whours�Wto�W6-Mar-87�W
6-Mar-87�W+�W2/24�W=�W6-Mar-87�Wand�W2hrs�W
add�W15�Wseconds�Wto�W6-Mar-87�W
6-Mar-87�W+�W15/(24*60*60)�W=�W6-Mar-87�Wand�W15�Wsecs�W
列名的别名�W
select�Wename�Wemployee�Wfrom�Wemp�W
where�Wdeptno=10;�W
(别名:employee)�W
select�Wename,sal,comm,comm/sal�W"C/S�WRATIO"�Wfrom�Wemp�W
where�Wcomm>.05*sal�W
order�Wby�Wcomm/sal�Wdesc;�W
SQL命令的编辑�W
list�Wor�Wl�W显示缓冲区的内容�W
list�W4�W显示当前SQL命令的第4行,并把第4行作为当前行,在该行号后面有个*。�W
change�Wor�Wc�W用新的内容替换原来在一行中第一次出现内容�W
SQL>c/(...)/('analyst')/�W
input�Wor�Wi�W增加一行或多行�W
append�Wor�Wa�W在一行后追加内容�W
del�W删除当前行�W删除SQL缓冲区中的当前行�W
run�W显示并运行SQL缓冲区中的命令�W
/�W运行SQL缓冲区中的命令�W
edit�W把SQL缓冲区中的命令写到操作系统下的文本文件,�W
并调用操作系统提供的编辑器执行修改。�W
-------------�W
3�W数据操纵�W
数据的插入�W
insert�Winto�Wdept�W
values�W(10,'accounting','new�Wyork');�W
insert�Winto�Wdept�W(dname,deptno)�W
values�W('accounting',10);�W
从其它表中选择插入数据�W
insert�Winto�Wemp�W(empno,ename,deptno)�W
select�Wid,name,department�W
from�Wold_emp�W
where�Wdepartment�Win(10,20,30,40);�W
使用参数�W
insert�Winto�Wdept�W
values(&deptno,&dname,&loc);�W
执行时,SQL/PLUS对每个参数将有提示用户输入�W
参数对应日期型或字符型数据时,可在参数上加引号,输入时就可不用引号�W
insert�Winto�Wdept�W
values(&deptno,'&dname','&loc');�W
插入空值(NULL)�W
insert�Winto�Wdept�W
values(50,'education',null);�W
插入日期型数据�W
日期型数据缺省格式:DD-MON-YY�W
insert�Winto�Wemp�W
(empno,ename,hiredate)�W
values(7963,'stone','07-APR-87');�W
系统时间:SYSDATE�W
insert�Winto�Wemp�W
(empno,ename,hiredate)�W
values(7600,'kohn',SYSDATE);�W
数据更新�W
update�Wemp�W
set�Wjob='manager'�W
where�Wename='martin';�W
update�Wemp�W
set�Wjob='market�Wrep'�W
where�Wename='salesman';�W
update�Wemp�W
set�Wdeptno=40,job='market�Wrep'�W
where�Wjob='salesman';�W
数据删除�W
delete�Wemp�W
where�Wempno=765;�W
更新的提交�W
commit�W
自动提交方式�W
set�Wautocommit�Won�W
如果状态设为开,则使用inesrt,update,delete会立即提交。�W
更新取消�W
rollback�W
两次连续成功的commit之间的操作,称为一个事务�W
---------------�W
4�W创建基表、视图�W
创建基表�W
create�Wtable�Wdept�W
(deptno�Wnumber(2),�W
dname�Wchar(14),�W
loc�Wchar(13));�W
数据字典会自动更新。�W
一个基表最多254列。�W
表名列名命名规则:�W
限制�W
第一个字符必须是字母,后面可任意(包括�W$�W#�W_�W但不能是逗号)。�W
名字不得超过30个字符。�W
唯一�W
某一用户的基表名必须唯一,不能是ORACLE的保留字,同一基表的列名互不相同。�W
使用双引号�W
如果表名用双引号括起来,则可不满足上述规则;�W
只有使用双引号,才能区别大、小写;�W
命名时使用了双引号,在以后的操作也必须使用双引号。�W
数据类型:�W
char(n)�W(不得超过240字符)�W
number(n,d)�W
date�W
long�W(最多65536字符)�W
raw�W(二进制原始数据)�W
空值处理�W
有时要求列值不能为空�W
create�Wtable�Wdept�W
(deptno�Wnumber(2)�Wnot�Wnull,�W
dname�Wchar(14),�W
loc�Wchar(13));�W
在基表中增加一列�W
alter�Wtable�Wdept�W
add�W(headcnt�Wnumber(3));�W
修改已有列属性�W
alter�Wtable�Wdept�W
modify�Wdname�Wchar(20);�W
注:只有当某列所有值都为空时,才能减小其列值宽度。�W
只有当某列所有值都为空时,才能改变其列值类型。�W
只有当某列所有值都为不空时,才能定义该列为not�Wnull。�W
例:�W
alter�Wtable�Wdept�Wmodify�W(loc�Wchar(12));�W
alter�Wtable�Wdept�Wmodify�Wloc�Wchar(12);�W
alter�Wtable�Wdept�Wmodify�W(dname�Wchar(13),loc�Wchar(12));�W
创建视图�W
create�Wview�Wmanagers�Was�W
select�Wename,job,sal�W
from�Wemp�W
where�Wjob='manager';�W
为视图列名取别名�W
create�Wview�Wmydept�W
(person,title,salary)�W
as�Wselect�Wename,job,sal�W
from�Wemp�W
where�Wdeptno=10;�W
with�Wcheck�Woption选项�W
使用with�Wcheck�Woption,保证当对视图插入或更新数据时,�W
该数据必须满足视图定义中select命令所指定的条件。�W
create�Wview�Wdept20�Was�W
select�Wename,job,sal,deptno�W
from�Wemp�W
where�Wdeptno=20�W
with�Wcheck�Woption;�W
在做下述操作时,会发生错误�W
update�Wdept20�W
set�Wdeptno=30�W
where�Wename='ward';�W
基表、视图的拷贝�W
create�Wtable�Wemp2�W
as�Wselect�W*�Wfrom�Wemp;�W
基表、视图的删除�W
drop�Wtable�W表名�W
drop�Wview�W视图名�W
------------�W
5�WSQL*PLUS报表功能�W
SQL*PLUS的一些基本格式命令�W
column�Wdeptno�Wheading�Wdepartment�W
column�Wename�Wheading�Wname�W
column�Wsal�Wheading�Wsalary�W
column�Wsal�Wformat�W$99,999.00�W
ttitle�Wsample�Wreport�Wfor|hitech�Wcorp�W
btitle�Wstrictly�Wconfidential�W
break�Won�Wdeptno�W
compute�Wsum�Wof�Wsal�Won�Wdeptno�W
run�W
表头和表尾�W
ttitle�Wsample�Wreport�Wfor|hitech�Wcorp�W
btitle�Wright�Wstrictly�Wconfidential�W
“|”表示换行,结尾不必加分号�W
选项有三种:left�Wright�Wcenter�W
使用TTITLE,系统将自动地在每页的顶部显示日期和页号。�W
TTITLET和BTITLE命令有效,直至重新设置表头或表尾,或退出SQL*PLUS。�W
下面命令使标题语句失效�W
TTITLE�WOFF�W
BTITLE�WOFF�W
列名�W
column命令定义用于显示列名�W
若名字为一个单词,不必加引号�W
column�Wename�Wheading�Wemployee�W
column�Wename�Wheading�W'employee|name'�W
(|为换行)�W
取消栏定义�W
column�Wename�Wclear�W
列的格式�W
column�Wename�Wformat�WA15�W
column�Wsal�Wformat�W$9,999.99�W
column�Wcomm�Wlike�Wsal�W
like子句,使得某一列的格式参照另一列格式,它拷贝列名及其格式�W
控制记录显示分组顺序�W
break�Won�Wdeptno�W
(不显示重复值)�W
select�Wdeptno,ename�W
from�Wemp�W
order�Wby�Wdeptno;�W
(ORDER�WBY子句用于控制BREAK)�W
显示为�W
10�Wclark�W
niller�W
20�Wsmith�W
scott�W
30�Wallen�W
blake�W
每次只有一个BREAK命令起作用,但一次可以在多个列上使用BREAK命令�W
break�Won�W列名1�Won�W列名2�W
记录分组�W
break�Won�Wdeptno�Wskip�W2�W
select�Wdeptno,ename�W
from�Wemp�W
order�Wby�Wdeptno;�W
每个deptno之间空两行�W
clear�Wbreak(取消BREAK命令)�W
break�Won�Wpage(每次从一新页开始)�W
break�Won�Wreport(每次从一新报表开始)�W
break�Won�Wpage�Won�Wreport(联合使用)�W
分组计算�W
break�Won�Wdeptno�Wskip�W2�W
compute�Wsum�Wof�Wsal�Won�Wdeptno�W
计算每个部门的工资总和�W
skip子句使部门之间的信息分隔开�W
其他计算命令�W
compute�Wavg�Wof�Wsal�Won�Wdeptno(平均值)�W
count�W非空值的总数�W
MAX�W最大值�W
MIN�W最小值�W
STD�W标准偏差�W
VAR�W协方差�W
NUMBER�W行数�W
使compute命令失效�W
一旦定义了COMPUTE,则一直有效,直到�W
关闭COMPUTE(clear�Wcompute)�W
SQL/PLUS环境命令�W
show�W选项�W
(显示当前参数设置情况)�W
show�Wall(显示全部参数)�W
设置参数�W
set�W选项�W值或开关�W
set�Wautocommit�Won�W
SET命令包括�W
set�Wautocommit�W{off|on|immediate}�W
(自动提交,OFF缺省)�W
set�Wecho�W{off|on}�W
(命令文件执行,是否在终端上显示命令本身,OFF缺省)�W
set�Wfeedback�W{off|on}�W
(ON:查询结束时,给出结果,记录数的信息,缺省;�W
OFF:无查询结果,记录数的信息)�W
set�Wheading�W{off|on}�W
(ON:列的头标在报表上显示,缺省;OFF:不在报表上显示)�W
set�Wlinesize�W{n}�W
一行显示的最大字符数,缺省为80�W
set�Wpagesize�W{n}�W
每页的行数,缺省是14�W
set�Wpause�W{off|on|text}�W
(ON:当报表超过一页时,每显示一屏就暂停显示,等待用户打回车键,再接着显示;�W
OFF:页与页不停顿,缺省;text:页与页停顿,并向用户提示信息)�W
SET�WBUFFER�Wbuffer�W
设置当头的命令缓冲区,通常情况下,SQL命令缓冲区已为当前缓冲区。�W
由于SQL命令缓冲区只能存放一条SQL命令,�W
所以可用其它缓冲区来存放SQL命令和SQL*PLUS命令。�W
经常用到的设置可放在login.sql文件中。�W
SET�WNULL�W
set�Wnull�W'no�Wdata'�W
select�Wename,comm�W
from�Wemp�W
where�Wdeptno=30;�W
把部门30中无佣金雇员的佣金显示为“NO�WDATA”。�W
set�Wnull是SQL*PLUS命令,用它来标识空值(NULL),可以设置为任意字符串。�W
存盘命令SAVE�W
save�W文件名�W
input�W
1�Wselect�Wempno,ename,job�W
2�Wfrom�Wemp�W
3�Wwhere�Wjob='analyst'�W
save�Wresearch�W
目录中会增加一个research.sql文件。�W
编辑命令EDIT�W
edit�W
EDIT编辑当前缓冲区中的内容。�W
编辑一个文件�W
edit�Wresearch�W
调入命令GET�W
get�Wresearch�W
把磁盘上的文件内容调入缓冲区,并显示在屏幕上,文件名尾不必加.sql。�W
START命令�W
运行指定的文件�W
start�Wresearch�W
输出命令SPOOL�W
spool�Wtryfile�W
不仅可以使查询结果在屏幕上显示,还可以使结果存入文件�W
停止向文件输出�W
spool�Woff�W
把查询结果在打印机上输出,先把它们存入一个文件中,�W
然后不必使用SPOOL�WOFF,而用:�W
spool�Wout�W
SPOOL�WOUT关闭该文件并在系统缺省的打印机上输出�W
制作报表举例�W
edit�Wtryfile�W
set�Wecho�Woff�W
set�Wautocommit�Won�W
set�Wpagesize�W25�W
insert�Winto�Wemp�W(empno,ename,hiredate)�W
values(9999,'geiger',sysdate);�W
insert�Winto�Wemp�W(empno,ename,deptno)�W
values(3333,'samson',20);�W
spool�Wnew_emp�W
select�W*�Wfrom�Wemp�W
where�Wdeptno=20�W
or�Wdeptno�Wis�Wnull�W
/�W
spool�Woff�W
set�Wautocommit�Woff�W
用start命令执行这个文件�W
--------�W
6�W函数�W
字符型函数�W
initcap(ename);将ename中每个词的第一个字母改为大写。�W
如:jack�Wsmith--Jack�WSmith�W
length(ename);计算字符串的长度。�W
substr(job,1,4);�W
其它�W
lower�W
upper�W
least�W取出字符串列表中按字母排序排在最前面的一个串�W
greatest�W取出字符串列表中按字母排序排在最后的一个串�W
日期函数�W
add_month(hiredate,5)�W在雇佣时间上加5个月�W
month_between(sysdate,hiredate)�W计算雇佣时间与系统时间之间相差的月数�W
next_day(hiredate,'FRIDAY')�W计算受雇日期之后的第一个星期五的日期�W
例�W
select�Wename,sal,next_day(sysdate,'FRIDAY')�Was_of�W
from�Wemp�W
where�Wdeptno=20;�W
(as_of是别名)�W
如果不用to_char函数,日期在ORACLE中的缺省格式是'DD_MON_YY'�W
to_char(date,date�Wpicture)�W
select�Wename,to_char(hiredate,'Dy�WMon�Wdd,yyyy')�Whired�W
from�Wemp�W
where�Wdeptno=10;�W
to_date(字符串,格式)�W
insert�Winto�Wemp(empno,ename,hiredate)�W
values(7999,'asms',to_date('070387083000','MMDDYYHHMISS'));�W
日期型数据的格式�W
dd�W12�W
dy�Wfri�W
day�Wfriday�W
ddspth�Wtwelfth�W
mm�W03�W
mon�Wmar�W
month�Wmarch�W
yy�W87�W
yyyy�W1987�W
例�W
Mar�W12,1987�W'Mon�Wdd,yyyy'�W
MAR�W12,1987�W'MON�Wdd,yyyy'�W
Thursday�WMARCH�W12�W'Day�WMONTH�Wdd'�W
Mar�W12�W11:00am�W'Mon�Wdd�Whh:miam'�W
Thu,the�Wtwelfth�W'Dy,"the"ddspth'�W
算术函数�W
least(v1,v2)�W
select�Wename,empno,mgr,least(empno,mgr)�Wlownum�W
from�Wemp�W
where�Wempno0�W
trunc(sal,0)�W
取sal的近似值(截断)�W
空值函数�W
nvl(v1,v2)�W
v1为列名,如果v1不是空值,nvl返回其列值。�W
v1为空值,返回v2的值。�W
聚组函数�W
select�Wsum(comm)�W
from�Wemp;�W
(返回一个汇总信息)�W
不能把sum用在select语句里除非用group�Wby�W
字符型、日期型、数字型的聚组函数�W
min�Wmax�Wcount可用于任何数据类型�W
select�Wmin(ename)�W
from�Wemp;�W
select�Wmin(hiredate)�W
from�Wemp;�W
select�Wmin(sal)�W
from�Wemp;�W
有多少人有工作?�W
select�Wcount(job)�W
from�Wemp;�W
有多少种不同的工种?�W
select�Wcount(distinct�Wjob)�W
from�Wemp;�W
count�Wdistinct�W计算某一字段中不同的值的个数�W
其它聚组函数(只用于数字型数据)�W
avg�W计算平均工资�W
select�Wavg(sal)�W
from�Wemp;�W
stddev�W计算工资的平均差�W
select�Wstddev(sal)�W
from�Wemp;�W
sum�W计算总工资�W
select�Wsum(sal)�W
from�Wemp;�W
group�Wby子句�W
select�Wdeptno,sum(sal),avg(sal)�W
from�Wemp�W
group�Wby�Wdeptno;�W
按多个条件分组�W
每个部门的雇员数�W
select�Wdeptno,count(*)�W
from�Wemp�W
group�Wby�Wdeptno;�W
每个部门的每个工种的雇员数�W
select�Wdeptno,job,count(*)�W
from�Wemp�W
group�Wby�Wdeptno,job;�W
满足条件的分组�W
(where是针对select的,having是针对group�Wby的)�W
哪些部门的工资总和超过了9000�W
select�Wdeptno,sum(sal)�W
from�Wemp�W
group�Wby�Wdeptno�W
having�Wsum(sal)>9000;�W
select小结�W
除去职员,哪些部门的工资总和超过了8000�W
select�Wdeptno,sum(sal)�W
from�Wemp�W
where�Wjob!='clerk'�W
group�Wby�Wdeptno�W
having�Wsum(sal)>8000�W
order�Wby�Wsum(sal);�W
---------�W
7�W高级查询�W
等值联接�W
select�Wempno,ename,job,emp.deptno,dname�W
from�Wemp,dept�W
where�Wemp.deptno=dept.deptno;�W
外联接�W
select�Wename,dept.deptno,loc�W
from�Wemp,dept�W
where�Wemp.deptno(+)=dept.deptno;�W
如果在dept.deptno中有的数值,在emp.deptno中没有(如deptno=40),�W
则作外联接时,结果中会产生一个空值�W
自联接:同一基表的不同行要做联接,可使用自联接�W
指出每个雇员的经理名字�W
select�Wworker.ename,manager.ename�Wmanager�W
from�Wemp�Wworker,emp�Wmanager�W
where�Wworker.mgr=manager.empno;�W
非等值联接�W
哪些雇员的工资属于第三级别�W
select�Wename,sal�W
from�Wemp,salgrade�W
where�Wgrade=3�W
and�Wsal�Wbetween�Wlosal�Wand�Whisal;�W
(基表salgrade:grade�Wlosal�Whisal)�W
集合运算�W
行的连接�W
集合运算把2个或多个查询结果合并为一个�W
union-set�Wunion�W
Rows�Wof�Wfirst�Wquery�Wplus�Wof�Wsecond�Wquery,�Wless�Wduplicate�Wrows�W
intersect-set�Wintersection�W
Rows�Wboth�Wqueries�Whave�Win�Wcommon�W
minus-set�Wdifference�W
rows�Wunique�Wto�Wthe�Wfirst�Wquery�W
介绍几个视图�W
account�Wview�W
ename�Wsal�Wjob�W
sales�Wview�W
ename�Wsal�Wjob�W
research�Wview�W
ename�Wsal�Wjob�W
union运算�W
返回一个查询结果中有但又不重要的行,它将基表或视图中的记录合并在一起�W
所有部门中有哪些雇员工资超过2000�W
对应列的数据类型必须相同�W
select�Wename,sal�W
from�Waccount�W
where�Wsal>2000�W
union�W
select�Wename,sal�W
from�Wresearch�W
where�Wsal>2000�W
union�W
select�Wename,sal�W
from�Wsales�W
where�Wsal>2000;�W
intersect运算�W
返回查询结果中相同的部分�W
各个部门中有哪些相同的工种�W
select�Wjob�W
from�Waccount�W
intersect�W
select�Wjob�W
from�Wresearch�W
intersect�W
select�Wjob�W
from�Wsales;�W
minus运算�W
返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。�W
有哪些工种在财会部中有,而在销售部中没有?�W
select�Wjob�Wfrom�Waccount�W
minus�W
select�Wjob�Wfrom�Wsales;�W
子查询�W
slect�Wename,deptno�W
from�Wemp�W
where�Wdeptno=�W
(select�Wdeptno�W
from�Wemp�W
where�Wename='smith');�W
多级子查询�W
select�Wename,job,sal�W
from�Wemp�W
where�Wjob=�W
(select�Wjob�W
from�Wemp�W
where�Wename='clark')�W
or�Wsal>�W
(select�Wsal�W
from�Wemp�W
where�Wename='clark');�W
多个基表与子查询�W
select�Wename,job,sal�W
from�Wemp,dept�W
where�Wloc='new�Wyork'�W
and�Wemp.deptno=dept.deptno�W
and�Wsal>�W
(select�Wsal�W
from�Wemp�W
where�Wename='scott');�W
子查询中使用聚组函数�W
select�Wename,hiredate�W
from�Wemp�W
where�Whiredate=�W
(select�Wmin(hiredate)�W
from�Wemp);�W
------------�W
8�W授权�W
系统权限�W
DBA�W所有权限�W
RESOURCE�W注册,创建新的基表�W
CONNECT,注册,查询�W
只有DBA才有权创建新的用户�W
grant�Wconnect�Wto�Wscott�W
identified�Wby�Wtiger;�W
DBA或用户自己可以改变用户口令�W
grant�Wconnect�Wto�Wscott�W
identified�Wby�Wleopard;�W
基表权限1�W
有两种方法获得对基表操作的权限�W
创建自己的基表�W
获得基表创建用户的许可�W
grant�Wselect,insert�W
on�Wemp�W
to�Wscott;�W
这些权限有�W
select�Winsert�Wupdate�Wdelete�Walter�Windex�W
把所有权限授于他人�W
grant�Wall�Won�Wemp�Wto�Wscott;�W
同义词�W
select�W*�W
from�Wscott.emp�W
创建同义词�W
为用户allen的EMP基表创建同义词employee�W
create�Wsynonym�Wemployee�W
for�Wallen.emp�W
基表权限2�W
你可以使其他用户有这样的权力,即其他用户可以把你的基表权限授予他人�W
grant�Wall�W
on�Wemp�W
to�Wscott�W
with�Wgrant�Woption;�W
收回权限�W
系统权限�W只有被DBA收回�W
基表权限�W随时都可以收回�W
revoke�Winsert�W
on�Wemp�W
from�Wscott;�W
---------�W
9�W索引�W
建立索引�W
create�Windex�Wemp_ename�W
on�Wemp(ename);�W
删除索引�W
drop�Windex�Wemp_ename;�W
关于索引�W
只对较大的基表建立索引(至少50条记录)�W
建立索引之前插入数据�W
对一个基表可建立任意多个索引�W
一般是在作为主键的列上建立索引�W
建立索引之后,不影响SQL命令的执行�W
建立索引之后,ORACLE自动维护和使用索引�W
保证数据唯一性�W
提高执行速度的同时,索引还可以保证每个记录中的每个列值是不重复的。�W
create�Wunique�Windex�Wemp_empno�W
on�Wemp(empno);�W
--------�W
练习和答案�W
有没有工资比奖金多的雇员?如果有,按工资的降序排列。�W
如果有两个以上的雇员工资相同,按他们的名字排序。�W
select�Wename�Wemployee,sal�Wsalary,comm�Wcommision�W
from�Wemp�W
where�Wsal>comm�W
order�Wby�Wsal�Wdesc,ename;�W
列出有关雇员姓名、奖金占收百分比的信息。�W
要求显示时列名意义明确,按雇员姓名排序,不包括奖金未知的雇员。�W
select�Wename�Wemployee,(comm/(comm+sal))*100�Wincentive�W
from�Wemp�W
where�Wcomm�Wis�Wnot�Wnull�W
order�Wby�Wename;�W
在chicago(部门30)工作的所有雇员的工资上涨10%。�W
update�Wemp�W
set�Wsal=1.1*sal�W
where�Wdeptno=30;�W
update�Wemp�W
set�Wsal=1.1*sal�W
where�Wdeptno=(select�Wdeptno�W
from�Wdept�W
where�Wloc='chicago');�W
为hitech公司新建一个部门,编号为50,其它信息均不可知。�W
insert�Winto�Wdept(dname,deptno)�W
values('faclities',50);�W
创建视图,三个列名,其中不包括职员信息�W
create�Wview�Wemployee("employee�Wname",�W
"employee�Wnumber",�W
"employee�Wjob")�W
as�Wselect�Wename,empno,job�W
from�Wemp�W
where�Wjob!='clerk';�W
制作工资报表,包括雇员姓名、受雇时间(按星期计算),工资和部门编号,�W
一页显示一个部门的信息,每页尾,显示该页的工资之和以及受雇时间之和,�W
报表结尾处,显示所有雇员的工资总和以及受雇时间总和,�W
工资按美元计算,受雇时间按星期计算,每页的上方应有标题。�W
ttitle�W'service'�W
break�Won�Wdeptno�Won�Wpage�Won�Wreport�W
compute�Wsum�Wof�Wsal�Won�Wdeptno�W
compute�Wsum�Wof�Wsal�Won�Wreport�W
compute�Wsum�Wof�Wservice_length�Won�Wdeptno�W
compute�Wsum�Wof�Wservice_length�Won�Wreport�W
column�Wsal�Wformat�W$99,999.00�W
column�Wservice_length�Wformat�W9999�W
select�Wdeptno,ename�Wemployee,(sysdate-hiredate)/7�Wservice_length,sal�W
from�Wemp�W
order�Wby�Wdeptno;�W
制作报表,包括雇员姓名、总收入和受佣日期,�W
且:姓名的第一个字母必须大写,雇佣日期格式为MM/DD/YYYY,�W
总收入包括没有奖金的雇员的总收入,姓名按字母顺序排列。�W
col�W"hire�Wdate"format�WA12�W
col�W"employee"�Wformat�WA10�W
col�W"compensation"�Wformat�W$99,999.00�W
select�Winitcap(ename)�W"employee",�W
(sal+nvl(comm,0))�W"compensation",�W
to_char(hiredate,'MM/DD/YYYY')�W"hire�Wdate"�W
from�Wemp�W
order�Wby�Wename;�W
列出有超过7个周边国家的国家名字和面积。�W
select�Wnation,area�W
from�Wnation�W
where�Wcode�Win�W
(select�Wnation_code�W
from�Wborder�W
group�Wby�Wnation_code�W
having�Wcount(*)>7);�W
列出所有面积大于等于日本的岛国的国名和人口。�W
select�Wnation,population�W
from�Wnation,border�W
where�Wcode=nation_code(+)�W
and�Wnation_code�Wis�Wnull�W
and�Warea>=�W
(select�Warea�W
from�Wnation�W
where�Wupper(nation)='JAPAN');�W
列出所有边界在其它国家中的国名,并且显示其边界国家名字。�W
break�Won�Wnation�W
select�Wnation1.nation,�W
nation2.nation�Wborderin_country�W
from�Wnation�Wnation1,border,nation�Wnation2�W
where�Wnation1.code=border.nation_code�W
and�Wborder.border_code=nation2.code�W
order�Wby�Wnation1.nation;�W
-----------�W
-----------�W
PL/SQL�W
2�WPL/SQL的块结构和数据类型�W
块结构的特点�W
嵌套�W
begin�W
......�W
begin�W
......�W
exception�W
......�W
end;�W
exception�W
......�W
end;�W
标识符:�W
不能超过30个字符�W
第一个字符必须为字母�W
其余字符可以是字母,数字,$,_,或#�W
不区分大小写形式�W
如果用双引号括起来,则字符顺序可以任意排列,并区分大小写形式�W
无SQL保留字�W
数据类型�W
数字型:�W
整数,实数,以及指数�W
字符串:�W
用单引号括起来�W
若在字符串表示单引号,则使用两个单引号�W
字符串长度为零(两个单引号之间没有字符),则表示NULL�W
字符:�W
长度为1的字符串�W
数据定义�W
语法�W
标识符[常数>�W数据类型[NOT�WNULL>[:=PL/SQL表达式>;�W
':='表示给变量赋值�W
数据类型包括�W
数字型�Wnumber(7,2)�W
字符型�Wchar(120)�W
日期型�Wdate�W
布尔型�Wboolean(取值为true,false或null,不存贮在数据库中)�W
日期型�W
anniversary�Wdate:='05-JUL-95';�W
project_completion�Wdate;�W
布尔型�W
over_budget�Wboolean�Wnot�Wnull:=false;�W
available�Wboolean;�W
(初始值为NULL)�W
%type类型匹配�W
books_printed�Wnumber(6);�W
books_sold�Wbook_printed%type;�W
manager_name�Wemp.ename%type;�W
变量赋值�W
变量名:=PL/SQL表达式�W
numvar:=5;�W
boolvar:=true;�W
datevar:='11-JUN-87';�W
字符型、数字型表达式中的空值�W
null+<数字>=null(空值加数字仍是空值)�W
null><数字>=null(空值与数字进行比较,结果仍是空值)�W
null||'字符串'='字符串'(null即'')�W
(空值与字符串进行连接运算,结果为原字符串)�W
变量作用范围�W
标识符在宣言它的块中有效�W
标识符如果不在子块中重新定义,则在PL/SQL块的所有子块中同样有效�W
重新定义后的标识符,作用范围仅在本子块中有效�W
例�W
declare�W
e_mess�Wchar(80);�W
begin�W
/*子块1*/�W
declare�W
v1�Wnumber(4);�W
begin�W
select�Wempno�Winto�Wv1�Wfrom�Wemp�W
where�Wjob='president';�W
exception�W
when�Wtoo_many_rows�Wthen�W
insert�Winto�Wjob_errors�W
values('more�Wthan�Wone�Wpresident');�W
end;�W
/*子块2*/�W
declare�W
v1�Wnumber(4);�W
begin�W
select�Wempno�Winto�Wv1�Wfrom�Wemp�W
where�Wjob='manager';�W
exception�W
when�Wtoo_many_rows�Wthen�W
insert�Winto�Wjob_errors�W
values('more�Wthan�Wone�Wmanager');�W
end;�W
exception�W
when�Wothers�Wthen�W
e_mess:=substr(sqlerrm,1,80);�W
insert�Winto�Wgeneral�Werrors�Wvalues(e_mess);�W
end;�W
---------�W
3�WSQL和PL/SQL�W
插入�W
declare�W
my_sal�Wnumber(7,2):=3040.55;�W
my_ename�Wchar(25):='wanda';�W
my_hiredate�Wdate:='08-SEP-88';�W
begin�W
insert�Winto�Wemp�W
(empno,enmae,job,hiredate,sal,deptno)�W
values(2741,my_ename,'cab�Wdriver',my_hiredate,my_sal,20);�W
end;�W
删除�W
declare�W
bad_child_type�Wchar(20):='naughty';�W
begin�W
delete�Wfrom�Wsantas_gift_list�Wwhere�W
kid_rating=bad_child_type;�W
end;�W
事务处理�W
commit[WORK>;�W
rollback[WORK>;�W
(关键字WORK可选,但对命令执行无任何影响)�W
savepoint�W标记名;(保存当前点)�W
在事务中标记当前点�W
rollback�W[WORK>�Wto�W[SAVEPOINT>�W标记名;(回退到当前保存点)�W
取消savepoint命令之后的所有对数据库的修改�W
关键字WORK和SAVEPOINT为可选项,对命令执行无任何影响�W
函数�W
PL/SQL块中可以使用SQL命令的所有函数�W
insert�Winto�Wphonebook(lastname)�Wvalue(upper(my_lastname));�W
select�Wavg(sal)�Winto�Wavg_sal�Wfrom�Wemp;�W
对于非SQL命令,可使用大多数个体函数�W
不能使用聚组函数和参数个数不定的函数,如�W
x:=sqrt(y);�W
lastname:=upper(lastname);�W
age_diff:=months_between(birthday1,birthday2)/12;�W
赋值时的数据类型转换�W
4种赋值形式:�W
变量名:=表达式�W
insert�Winto�W基表名�Wvalues(表达式1,表达式2,...);�W
update�W基表名�Wset�W列名=表达式;�W
select�W列名�Winto�W变量名�Wfrom�W...;�W
数据类型间能进行转换的有:�W
char转成number�W
number转成char�W
char转成date�W
date转成char�W
例�W
char_var:=nm_var;�W
数字型转换成字符型�W
date_var:='25-DEC-88';�W
字符型转换成日期型�W
insert�Winto�W表名(num_col)�Wvalues('604badnumber');�W
错误,无法成功地转换数据类型�W
---------�W
4�W条件控制�W
例�W
declare�W
num_jobs�Wnumber(4);�W
begin�W
select�Wcount(*)�Winto�Wnum_jobs�Wfrom�Wauditions�W
where�Wactorid=&&actor_id�Wand�Wcalled_back='yes';�W
if�Wnum_jobs>100�Wthen�W
update�Wactor�Wset�Wactor_rating='word�Wclass'�W
where�Wactorid=&&actor_id;�W
elsif�Wnum_job=75�Wthen�W
update�Wactor�Wset�Wactor_rating='daytime�Wsoaps'�W
where�Wactorid=&&actor_id;�W
else�W
update�Wactor�Wset�Wactor_rating='waiter'�W
where�Wactorid=&&actor_id;�W
end�Wif;�W
end�Wif;�W
commit;�W
end;�W
--------�W
5�W循环�W
语法�W
loop�W
......�W
end�Wloop;�W
exit;(退出循环)�W
exit�W[when>;(退出循环,当满足WHEN时)�W
例1�W
declare�W
ctr�Wnumber(3):=0;�W
begin�W
loop�W
insert�Winto�Wtable1�Wvalues('tastes�Wgreat');�W
insert�Winto�Wtable2�Wvalues('less�Wfilling');�W
ctr:=ctr+1;�W
exit�Wwhen�Wctr=100;�W
end�Wloop;�W
end;�W
(注:如果ctr取为NULL,循环无法结束)�W
例2�W
FOR语法�W
for�W变量<范围>�Wloop�W
......�W
end�Wloop;�W
declare�W
my_index�Wchar(20):='fettucini�Walfredo';�W
bowl�Wchar(20);�W
begin�W
for�Wmy_index�Win�Wreverse�W21..30�Wloop�W
insert�Winto�Wtemp(coll)�Wvalues(my_index);�W
/*循环次数从30到21*/�W
end�Wloop;�W
bowl:=my_index;�W
end;�W
跟在in�Wreverse后面的数字必须是从小到大的顺序,必须是整数,不能是变量或表达式�W
----------�W
6�W游标�W
显式游标�W
打开游标�W
open�W<游标名>�W
例�W
open�Wcolor_cur;�W
游标属性�W
%notfound�W
%found�W
%rowcount�W
%isopen�W
例�W
fetch�Wmy_cur�Winto�Wmy_var;�W
while�Wmy_cur�W%found�Wloop�W
(处理数据)�W
fetch�Wmy_cur�Winto�Wmy_var;�W
exit�Wwhen�Wmy_cur�W%rowcount=10;�W
end�Wloop;�W
%notfound属性�W
取值情况如下:�W
fetch操作没有返回记录,则取值为true�W
fetch操作返回一条记录,则取值为false�W
对游标无fetch操作时,取值为null�W
<游标名>�W%notfound�W
例�W
if�Wcolor_cur�W%notfound�Wthen...�W
注:如果没有fetch操作,则<游标名>�W%notfound将导致出错,�W
因为%notfound的初始值为NULL。�W
关闭游标�W
close�W<游标名>�W
例�W
close�Wcolor_cur;�W
游标的FOR循环�W
语法�W
for�W<记录名>�Win�W<游标名>�Wloop�W
<一组命令>�W
end�Wloop;�W
其中:�W
索引是建立在每条记录的值之上的�W
记录名不必声明�W
每个值对应的是记录名,列名�W
初始化游标指打开游标�W
活动集合中的记录自动完成FETCH操作�W
退出循环,关闭游标�W
隐式游标�W
隐式游标是指SQL命令中用到的,没有明确定义的游标�W
insert,update,delete,select语句中不必明确定义游标�W
调用格式为SQL%�W
存贮有关最新一条SQL命令的处理信息�W
隐式游标的属性�W
隐式游标有四个属性�W
SQL%NOTFOUND�W
SQL%FOUND�W
SQL%ROWCOUNT:隐式游标包括的记录数�W
例:�W
delete�Wfrom�Wbaseball_team�Wwhere�Wbatting_avg<100;�W
if�Wsql%rowcount>5�Wthn�W
insert�Winto�Wtemp�W
values('your�Wteam�Wneeds�Whelp');�W
end�Wif;�W
SQL%ISOPEN:取值总为FALSE。SQL命令执行完毕,PL/SQL立即关闭隐式游标。�W
---------�W
7�W标号�W
GOTO语句�W
用法:�W
goto�Wyou_are_here;�W
其中you_are_here是要跳转的语句标号�W
标号必须在同一组命令,或是同一块中使用�W
正确的使用�W
<>(标号)�W
x:=x+1�W
if�Wa>b�Wthen�W
b:=b+c;�W
goto�Wdinner;�W
end�Wif;�W
错误的使用�W
goto�Wjail;�W
if�Wa>b�Wthen�W
b:=b+c;�W
<>(标号)�W
x:=x+1;�W
end�Wif;�W
标号:解决意义模糊�W
标号可用于定义列值的变量�W
<>�W
declare�W
deptno�Wnumber:=20;�W
begin�W
update�Wemp�Wset�Wsal=sal*1.1�W
where�Wdeptno=sample.deptno;�W
commit;�W
end�Wsample;�W
如果不用标号和标号限制符,这条命令将修改每条记录。�W
----------�W
8�W异常处理�W
预定义的异常情况�W
任何ORACLE错误都将自动产生一个异常信息�W
一些异常情况已命名,如:�W
no_data_found�W当SELECT语句无返回记录时产生�W
too_many_rows�W没有定义游标,而SELECT语句返回多条记录时产生�W
whenever�Wnotfound�W无对应的记录�W
用户定义的异常情况�W
由用户自己获取�W
在DECLARE部分定义:�W
declare�W
x�Wnumber;�W
something_isnt_right�Wexception;�W
用户定义的异常情况遵循一般的作用范围规则�W
条件满足时,获取异常情况:raise�Wsomething_isnt_right�W
注意:同样可以获取预定义的异常情况�W
exception_init语句�W
允许为ORACLE错误命名�W
调用格式:�W
pragma�Wexception_init(<表达式>,);�W
例�W
declare�W
deadlock_detected�Wexception;�W
pragma�Wexception_init(deadlock_detected,-60);�W
raise语句�W
单独使用RAISE命令,可再一次获取当前的异常情况(就象异常情况被重复处理了一样)。�W
在异常处理中,此语句只能单独使用。�W
异常处理标识符�W
一组用于处理异常情况的语句:�W
exception�W
when�W<表达式>�Wor�W[表达式...>�Wthen�W
<一组语句>�W
...�W
when�Wothers�Wthen--最后一个处理�W
<一组语句>�W
end;既结束PL/SQL块部分,也结束异常处理部分�W
--------�W
练习与答案�W
1:�W
接收contract_no和item_no值,在inventory表中查找,如果产品:�W
已发货,在arrival_date中赋值为今天后的7天�W
已订货,在arrival_date中赋值为今天后的一个月�W
既无订货又无发货,则在arrival_date中赋值为今天后的两个月,�W
并在order表中增加一条新的订单记录。�W
product_status的列值为'shipped'和'ordered'�W
inventory:�W
product_id�Wnumber(6)�W
product_description�Wchar(30)�W
product_status�Wchar(20)�W
std_shipping_qty�Wnumber(3)�W
contract_item:�W
contract_no�Wnumber(12)�W
item_no�Wnumber(6)�W
arrival_date�Wdate�W
order:�W
order_id�Wnumber(6)�W
product_id�Wnumber(6)�W
qty�Wnumber(3)�W
答案:�W
declare�W
i_product_id�Winventory.product_id%type;�W
i_product_description�Winventory.product_description%type;�W
i_product_status�Winventory.product_status%type;�W
i_std_shipping_qty�Winventory.std_shipping_qty%type;�W
begin�W
select�Wproduct_id,product_description,product_status,std_shipping_qty�W
into�Wi_product_id,i_product_description,�W
i_product_status,i_std_shipping_qty�W
from�Winventory�W
where�Wproduct_id=(�W
select�Wproduct_id�W
from�Wcontract_item�W
where�Wcontract_no=&&contractno�Wand�Witem_no=&&itemno);�W
if�Wi_product_status='shipped'�Wthen�W
update�Wcontract_item�W
set�Warrival_date=sysdate+7�W
where�Witem_no=&&itemno�Wand�Wcontract_no=&&contractno;�W
elsif�Wi_product_status='ordered'�Wthen�W
update�Wcontract_item�W
set�Warrival_date=add_months(sysdate,1)�W
where�Witem_no=&&itemno�Wand�Wcontract_no=&&contractno;�W
else�W
update�Wcontract_item�W
set�Warrival_date=add_months(sysdate,2)�W
where�Witem_no=&&itemno�Wand�Wcontract_no=&&contractno;�W
insert�Winto�Worders�W
values(100,i_product_id,i_std_shipping_qty);�W
end�Wif;�W
end�Wif;�W
commit;�W
end;�W

2:�W
1.找出指定部门中的所有雇员�W
2.用带'&'的变量提示用户输入部门编号�W
3.把雇员姓名及工资存入prnttable表中,基结构为:�W
create�Wtable�Wprnttable�W
(seq�Wnumber(7),line�Wchar(80));�W
4.异常情况为,部门中奖金不为空值的雇员信息才能存入prnttable表中。�W
答案:�W
declare�W
cursor�Wemp_cur�Wis�W
select�Wename,sal,comm�W
from�Wemp�Wwhere�Wdeptno=&dno;�W
emp_rec�Wemp_cur%rowtype;�W
null_commission�Wexception;�W
begin�W
open�Wemp_cur;�W
fetch�Wemp_cur�Winto�Wemp_rec;�W
while�W(emp_cur%found)�Wloop�W
if�Wemp_rec.comm�Wis�Wnull�Wthen�W
begin�W
close�Wemp_cur;�W
raise�Wnull_commission;�W
end;�W
end�Wif;�W
fetch�Wemp_cur�Winto�Wemp_rec;�W
end�Wloop;�W
close�Wemp_sur;�W
exception�W
when�Wnull_commission�Wthen�W
open�Wemp_cur;�W
fetch�Wemp_cur�Winto�Wemp_rec;�W
while�W(emp_cur%found)�Wloop�W
if�Wemp_rec.comm�Wis�Wnot�Wnull�Wthen�W
insert�Winto�Wtemp�Wvalues(emp_rec.sal,emp_rec.ename);�W
end�Wif;�W
fetch�Wemp_cur�Winto�Wemp_rec;�W
end�Wloop;�W
close�Wemp_cur;�W
commit;�W
end;�W
�W
�W
Java研究组织�W�W�W-�W�W版权所有�W2002-2002�W�W
 
RE:ORACLE数据库对象与用户管理(转)
作者:UB时间:2003-08-14 21:06:59[修改][回复][删除]
ORACLE数据库对象与用户管理
一、ORACLE数据库的模式对象的管理与维护
本节的主要内容是关于ORACLE数据库的模式对象的管理与维护,这些模式对象包括:表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以基于SQL语言的实例说明如何对它们进行管理于维护。
1.1�W表空间
由于表空间是包含这些模式对象的逻辑空间,有必要先对它进行维护。
创建表空间�W
SQL>CREATE�WTABLESPACE�Wjxzy
>DATAFILE�W‘/usr/oracle/dbs/jxzy.dbf’
>ONLINE;
修改表空间�W
SQL>ALTER�WTABLESPACE�Wjxzy�WOFFLINE�WNORMAL;
SQL>ALTER�WTABLESPACE�Wjxzy
>RENAME�WDATAFILE�W‘/usr/oracle/dbs/jxzy.dbf’
>TO�W‘/usr/oracle/dbs/jxzynew.dbf’
>ONLINE
SQL>CREATE�WTABLESPACE�Wjxzy�WONLINE
删除表空间�W
SQL>DROP�WTABLESPACE�Wjxzy
>INCLUDING�WCONTENTS
1.�W2�W表维护
表是数据库中数据存储的基本单位,一个表包含若干列,每列具有列名、类型、长度等。
表的建立�W
SQL>CREATE�WTABLE�Wjxzy.switch(
>OFFICE_NUM�WNUMBER(3,0)�WNOT�WNULL,
>SWITCH_CODE�WNUMBER(8,0)�WNOT�WNULL,
>SWITCH_NAME�WVARCHAR2(20)�WNOT�WNULL);
表的修改�W
SQL>ALTER�WTABLE�Wjxzy.switch
>ADD�W(DESC�WVARCHAR2(30));
表的删除�W
SQL>DROP�WTABLE�Wjxzy.switch
>CASCADE�WCONSTRAINTS
//删除引用该表的其它表的完整性约束
1.�W3�W视图维护
视图是由一个或若干基表产生的数据集合,但视图不占存储空间。建立视图可以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性。
视图的建立�W
SQL>CREATE�WVIEW�Wjxzy.pole_well_view�WAS
>(SELECT�Wpole_path_num�WAS�Wpath,
pole�WAS�Wdevice_num�WFROM�Wpole
>UNION
>SELECT�Wpipe_path_num�WAS�Wpath,
>�Wwell�WAS�Wdevice_num�WFROM�Wwell);
视图的替换�W
SQL>REPLACE�WVIEW�Wjxzy.pole_well_view�WAS
>(SELECT�Wpole_path_num�WAS�Wpath,
pole�WAS�Wsupport_device�WFROM�Wpole�W
>UNION
>SELECT�Wpipe_path_num�WAS�Wpath,
well�WAS�Wsupport_device�WFROM�Wwell);�W
视图的删除�W
SQL>DROP�WVIEW�Wjxzy.pole_well_view;
1.4�W序列维护
序列是由序列发生器生成的唯一的整数。
序列的建立�W
SQL>CREATE�WSEQUENCE�Wjxzy.sequence_cable
>START�WWITH�W1
>INCREMENT�WBY�W1
>NO_MAXVALUE;
建立了一个序列,jxzy.sequence_cable.currval返回当前值,jxzy.sequence_cable.nextval�W返回当前值加1后的新值
序列的修改�W
SQL>ALTER�WSEQUENCE�Wjxzy.sequence_cable
>START�WWITH�W1�W//起点不能修改,若修改,应先删除,然后重新定义
>INCTEMENT�WBY�W2
>MAXVALUE�W1000;
序列的删除�W
SQL>DROP�WSEQUENCE�Wjxzy.sequence_cable
1.�W5�W索引维护
索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。
对查询型的表,建立多个索引会大大提高查询速度,对更新型的表,如果索引过多,会增大开销。
索引分唯一索引和非唯一索引
索引的建立�W
SQL>CREATE�WINDEX�Wjxzy.idx_switch
>ON�Wswitch(switch_name)
>TABLESPACE�Wjxzy;
索引的修改�W
SQL>ALTER�WINDEX�Wjxzy.idx_switch
>ON�Wswitch(office_num,switch_name)
>TABLESPACE�Wjxzy;
索引的删除�W
SQL>DROP�WINDEX�Wjxzy.idx_switch;
1.�W6�W完整性约束管理
数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。
完整性约束是对表的列定义一组规则说明方法。ORACLE提供如下的完整性约束.
a.�WNOT�WNULL�W非空
b.�WUNIQUE�W唯一关键字
c.�WPRIMATY�WKEY�W主键一个表只能有一个,非空
d.�WFOREIGA�WKEY�W外键
e.CHECK�W表的每一行对指定条件必须是true或未知(对于空值)
例如:
某列定义非空约束�W
SQL>ALTER�WTABLE�Woffice_organization
>MODIFY(desc�WVARCHAR2(20)
>CONSTRAINT�Wnn_desc�WNOT�WNULL)
某列定义唯一关键字�W
SQL>ALTER�WTABLE�Woffice_organization
>MODIFY(office_name�WVATCHAR2(20)
>CONSTRAINT�Wuq_officename�WUNIQUE)
定义主键约束,主键要求非空�W
SQL>CREATE�WTABLE�Wswitch(switch_code�WNUMBER(8)
>CONSTRAINT�Wpk_switchcode�WPRIMARY�WKEY,)
使主键约束无效�W
SQL>ALTER�WTABLE�Wswitch�WDISABLE�WPRIMARY�WKEY
定义外键�W
SQL>CREATE�WTABLE�WPOLE(pole_code�WNUMBER(8),
>office_num�Wnumber(3)
>CONSTRAINT�Wfk_officenum
>REFERENCES�Woffice_organization(office_num)
>ON�WDELETE�WCASCADE);
定义检查�W
SQL>CREATE�WTABLE�Woffice_organization(
>office_num�WNUMBER(3),
>CONSTRAINT�Wcheck_officenum
>CHECK�W(office_num�WBETWEEN�W10�WAND�W99);
二、ORACLE数据库用户与权限管理
ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。
2.�W1�WORACLE数据库安全策略
建立系统级的安全保证�W
系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE系统特权有80多种。
建立对象级的安全保证�W
对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。
建立用户级的安全保证�W
用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。
2.2�W用户管理
ORACLE用户管理的内容主要包括用户的建立、修改和删除
用户的建立�W
SQL>CREATE�WUSER�Wjxzy
>IDENTIFIED�WBY�Wjxzy_password
>DEFAULT�WTABLESPACE�Wsystem
>QUATA�W5M�WON�Wsystem;�W//供用户使用的最大空间限额
用户的修改�W
SQL>CREATE�WUSER�Wjxzy
>IDENTIFIED�WBY�Wjxzy_pw
>QUATA�W10M�WON�Wsystem;
删除用户及其所建对象�W
SQL>DROP�WUSER�Wjxzy�WCASCADE;�W//同时删除其建立的实体
2.3系统特权管理与控制
ORACLE�W提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。
授予系统特权�W
SQL>GRANT�WCREATE�WUSER,ALTER�WUSER,DROP�WUSER
>TO�Wjxzy_new
>WITH�WADMIN�WOPTION;
回收系统特权�W
SQL>REVOKE�WCREATE�WUSER,ALTER�WUSER,DROP�WUSER
>FROM�Wjxzy_new
//但没有级联回收功能
显示已被授予的系统特权(某用户的系统级特权)�W
SQL>SELECT*FROM�Wsys.dba_sys_privs
2.4�W对象特权管理与控制
ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。
授予对象特权�W
SQL>GRANT�WSELECT,INSERT(office_num,office_name),
>UPDATE(desc)ON�Woffice_organization
>TO�Wnew_adminidtrator
>WITH�WGRANT�WOPTION;
//级联授权
SQL>GRANT�WALL�WON�Woffice_organization
>TO�Wnew_administrator
回收对象特权�W
SQL>REVOKE�WUPDATE�WON�Woffice_orgaization
>FROM�Wnew_administrator
//有级联回收功能
SQL>REVOKE�WALL�WON�Woffice_organization
>FROM�Wnew_administrator
显示已被授予的全部对象特权�W
SQL>SELECT*FROM�Wsys.dba_tab_privs
2.5�W角色的管理
ORACLE的角色是命名的相关特权组(包括系统特权与对象特权),ORACLE用它来简化特权管理,可把它授予用户或其它角色。
ORACLE数据库系统预先定义了CONNECT�W、RESOURCE、�WDBA、�WEXP_FULL_DATABASE、�WIMP_FULL_DATABASE五个角色。CONNECT具有创建表、视图、序列等特权;RESOURCE具有创建过程、触发器、表、序列等特权、DBA具有全部系统特权; EXP_FULL_DATABASE、�WIMP_FULL_DATABASE具有卸出与装入数据库的特权。
通过查询sys.dba_sys_privs可以了解每种角色拥有的权利。
授予用户角色�W
SQL>GRANT�WDBA�WTO�Wnew_administractor
>WITH�WGRANT�WOPTION;
作者:UB时间:2003-08-14 21:06:59[修改][回复][删除]
ORACLE数据库对象与用户管理
一、ORACLE数据库的模式对象的管理与维护
本节的主要内容是关于ORACLE数据库的模式对象的管理与维护,这些模式对象包括:表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以基于SQL语言的实例说明如何对它们进行管理于维护。
1.1�W表空间
由于表空间是包含这些模式对象的逻辑空间,有必要先对它进行维护。
创建表空间�W
SQL>CREATE�WTABLESPACE�Wjxzy
>DATAFILE�W‘/usr/oracle/dbs/jxzy.dbf’
>ONLINE;
修改表空间�W
SQL>ALTER�WTABLESPACE�Wjxzy�WOFFLINE�WNORMAL;
SQL>ALTER�WTABLESPACE�Wjxzy
>RENAME�WDATAFILE�W‘/usr/oracle/dbs/jxzy.dbf’
>TO�W‘/usr/oracle/dbs/jxzynew.dbf’
>ONLINE
SQL>CREATE�WTABLESPACE�Wjxzy�WONLINE
删除表空间�W
SQL>DROP�WTABLESPACE�Wjxzy
>INCLUDING�WCONTENTS
1.�W2�W表维护
表是数据库中数据存储的基本单位,一个表包含若干列,每列具有列名、类型、长度等。
表的建立�W
SQL>CREATE�WTABLE�Wjxzy.switch(
>OFFICE_NUM�WNUMBER(3,0)�WNOT�WNULL,
>SWITCH_CODE�WNUMBER(8,0)�WNOT�WNULL,
>SWITCH_NAME�WVARCHAR2(20)�WNOT�WNULL);
表的修改�W
SQL>ALTER�WTABLE�Wjxzy.switch
>ADD�W(DESC�WVARCHAR2(30));
表的删除�W
SQL>DROP�WTABLE�Wjxzy.switch
>CASCADE�WCONSTRAINTS
//删除引用该表的其它表的完整性约束
1.�W3�W视图维护
视图是由一个或若干基表产生的数据集合,但视图不占存储空间。建立视图可以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性。
视图的建立�W
SQL>CREATE�WVIEW�Wjxzy.pole_well_view�WAS
>(SELECT�Wpole_path_num�WAS�Wpath,
pole�WAS�Wdevice_num�WFROM�Wpole
>UNION
>SELECT�Wpipe_path_num�WAS�Wpath,
>�Wwell�WAS�Wdevice_num�WFROM�Wwell);
视图的替换�W
SQL>REPLACE�WVIEW�Wjxzy.pole_well_view�WAS
>(SELECT�Wpole_path_num�WAS�Wpath,
pole�WAS�Wsupport_device�WFROM�Wpole�W
>UNION
>SELECT�Wpipe_path_num�WAS�Wpath,
well�WAS�Wsupport_device�WFROM�Wwell);�W
视图的删除�W
SQL>DROP�WVIEW�Wjxzy.pole_well_view;
1.4�W序列维护
序列是由序列发生器生成的唯一的整数。
序列的建立�W
SQL>CREATE�WSEQUENCE�Wjxzy.sequence_cable
>START�WWITH�W1
>INCREMENT�WBY�W1
>NO_MAXVALUE;
建立了一个序列,jxzy.sequence_cable.currval返回当前值,jxzy.sequence_cable.nextval�W返回当前值加1后的新值
序列的修改�W
SQL>ALTER�WSEQUENCE�Wjxzy.sequence_cable
>START�WWITH�W1�W//起点不能修改,若修改,应先删除,然后重新定义
>INCTEMENT�WBY�W2
>MAXVALUE�W1000;
序列的删除�W
SQL>DROP�WSEQUENCE�Wjxzy.sequence_cable
1.�W5�W索引维护
索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。
对查询型的表,建立多个索引会大大提高查询速度,对更新型的表,如果索引过多,会增大开销。
索引分唯一索引和非唯一索引
索引的建立�W
SQL>CREATE�WINDEX�Wjxzy.idx_switch
>ON�Wswitch(switch_name)
>TABLESPACE�Wjxzy;
索引的修改�W
SQL>ALTER�WINDEX�Wjxzy.idx_switch
>ON�Wswitch(office_num,switch_name)
>TABLESPACE�Wjxzy;
索引的删除�W
SQL>DROP�WINDEX�Wjxzy.idx_switch;
1.�W6�W完整性约束管理
数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。
完整性约束是对表的列定义一组规则说明方法。ORACLE提供如下的完整性约束.
a.�WNOT�WNULL�W非空
b.�WUNIQUE�W唯一关键字
c.�WPRIMATY�WKEY�W主键一个表只能有一个,非空
d.�WFOREIGA�WKEY�W外键
e.CHECK�W表的每一行对指定条件必须是true或未知(对于空值)
例如:
某列定义非空约束�W
SQL>ALTER�WTABLE�Woffice_organization
>MODIFY(desc�WVARCHAR2(20)
>CONSTRAINT�Wnn_desc�WNOT�WNULL)
某列定义唯一关键字�W
SQL>ALTER�WTABLE�Woffice_organization
>MODIFY(office_name�WVATCHAR2(20)
>CONSTRAINT�Wuq_officename�WUNIQUE)
定义主键约束,主键要求非空�W
SQL>CREATE�WTABLE�Wswitch(switch_code�WNUMBER(8)
>CONSTRAINT�Wpk_switchcode�WPRIMARY�WKEY,)
使主键约束无效�W
SQL>ALTER�WTABLE�Wswitch�WDISABLE�WPRIMARY�WKEY
定义外键�W
SQL>CREATE�WTABLE�WPOLE(pole_code�WNUMBER(8),
>office_num�Wnumber(3)
>CONSTRAINT�Wfk_officenum
>REFERENCES�Woffice_organization(office_num)
>ON�WDELETE�WCASCADE);
定义检查�W
SQL>CREATE�WTABLE�Woffice_organization(
>office_num�WNUMBER(3),
>CONSTRAINT�Wcheck_officenum
>CHECK�W(office_num�WBETWEEN�W10�WAND�W99);
二、ORACLE数据库用户与权限管理
ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。
2.�W1�WORACLE数据库安全策略
建立系统级的安全保证�W
系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE系统特权有80多种。
建立对象级的安全保证�W
对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。
建立用户级的安全保证�W
用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。
2.2�W用户管理
ORACLE用户管理的内容主要包括用户的建立、修改和删除
用户的建立�W
SQL>CREATE�WUSER�Wjxzy
>IDENTIFIED�WBY�Wjxzy_password
>DEFAULT�WTABLESPACE�Wsystem
>QUATA�W5M�WON�Wsystem;�W//供用户使用的最大空间限额
用户的修改�W
SQL>CREATE�WUSER�Wjxzy
>IDENTIFIED�WBY�Wjxzy_pw
>QUATA�W10M�WON�Wsystem;
删除用户及其所建对象�W
SQL>DROP�WUSER�Wjxzy�WCASCADE;�W//同时删除其建立的实体
2.3系统特权管理与控制
ORACLE�W提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。
授予系统特权�W
SQL>GRANT�WCREATE�WUSER,ALTER�WUSER,DROP�WUSER
>TO�Wjxzy_new
>WITH�WADMIN�WOPTION;
回收系统特权�W
SQL>REVOKE�WCREATE�WUSER,ALTER�WUSER,DROP�WUSER
>FROM�Wjxzy_new
//但没有级联回收功能
显示已被授予的系统特权(某用户的系统级特权)�W
SQL>SELECT*FROM�Wsys.dba_sys_privs
2.4�W对象特权管理与控制
ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。
授予对象特权�W
SQL>GRANT�WSELECT,INSERT(office_num,office_name),
>UPDATE(desc)ON�Woffice_organization
>TO�Wnew_adminidtrator
>WITH�WGRANT�WOPTION;
//级联授权
SQL>GRANT�WALL�WON�Woffice_organization
>TO�Wnew_administrator
回收对象特权�W
SQL>REVOKE�WUPDATE�WON�Woffice_orgaization
>FROM�Wnew_administrator
//有级联回收功能
SQL>REVOKE�WALL�WON�Woffice_organization
>FROM�Wnew_administrator
显示已被授予的全部对象特权�W
SQL>SELECT*FROM�Wsys.dba_tab_privs
2.5�W角色的管理
ORACLE的角色是命名的相关特权组(包括系统特权与对象特权),ORACLE用它来简化特权管理,可把它授予用户或其它角色。
ORACLE数据库系统预先定义了CONNECT�W、RESOURCE、�WDBA、�WEXP_FULL_DATABASE、�WIMP_FULL_DATABASE五个角色。CONNECT具有创建表、视图、序列等特权;RESOURCE具有创建过程、触发器、表、序列等特权、DBA具有全部系统特权; EXP_FULL_DATABASE、�WIMP_FULL_DATABASE具有卸出与装入数据库的特权。
通过查询sys.dba_sys_privs可以了解每种角色拥有的权利。
授予用户角色�W
SQL>GRANT�WDBA�WTO�Wnew_administractor
>WITH�WGRANT�WOPTION;
 

你可能感兴趣的:(sql,编程,数据库,职场,休闲)