版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle数据库技术与实验指导
2011.08
第0章实用Oracle数据库技术
Oracle的官方网站为www.oraclo.com;
其次http://metalink.oracle,com/这里有很多权威的解决方案和补丁;
然后就是一些著名网站如:>www.orafaq.net>,这
里有很多经验之谈。
遇到问题了还可以第一时间找,这里会给你最详细的解释。
Oracle10g/llg数据库都分为标准版(StandardEdition)>标准版1(Standard
EditionOne)以及企业版(EnterpriseEdition)。可从如下网址下载、学习或试用Oracle:
http://www.oracle,com/technology/global/cn/software/products/database/orac
lelOg/index.html
http://www.oracle,com/technology/global/cn/software/products/database/inde
x.html
http://www.oracle,com/technology/software/index.html
/technology/software/products/database/index.html
SQLDeveloper也可以蝉独免费下载安爨的。下载地Ik址为:
/technology/global/cn/software/products/sql/index.html
SQL*PlusInstantClient(SQL*Plus即时客户端)
SQL*PlusInstantClient下
载:http://www.oracle,com/technology/global/cn/software/tech/oci/instantclient/
index,html。
实验1数据库系统基础操作
OracleDatabase11g第2版(.0)的下载地址:
/technology/global/cn/software/products/database/index.html
适用于MicrosoftWindows(32位)的OracleDatabase11g第2版(.0)的下载地
址:
/technology/global/cn/software/products/database/oraclellg/_win32s
oft.html
实验2数据库基础操作
手工建库
手工建库须要经过几个步骤,每一个步骤都非常关键。它包括:
1、创建相关目录(数据文件和跟踪文件)(假设要创建KCGL数据库,Oracle已安装
于小:\app\qxz”目录)
在c:\app\qxz\admin这个目录之下创建KCGL文件夹;
在C:\app\qxz\admin\KCGL这个目录之下创建adump文件夹;
在C:\app\qxz\admin\KCGL这个目录之下创建dpdump文件夹;
在C:\app\qxz\admin\KCGL这个目录之下创建pfile文件夹;
在C:\app\qxz\oradata这个目录之下创建KCGL文件夹;
2、创建初始化参数文件
通过复制现有的初始化参数文件C:\app\qxz\admin\orc1\pfi1e这个目录下的参数文
件“3nit.ora.*"(*为数字扩展名)到C:\app\qxz\product\ll.2.O\dbhome_l\database
这个目录,修改名为initKCGL.ora,最后用记事本打开这个参数文件,修改如下几个参数
的值:
audit_file_dest=C:\app\qxz\admin\KCGL\adump
db_name=KCGL
control_files=("C:\app\qxz\oradata\KCGL\control01.ctl","C:\app\qxz\oradata
\KCGL\control02.ctl")
3、打开DOS窗口,设置环境变量:Setoracle_sid=KCGL
4、创建服务:Oradim-new-sidKCGL
5、创建口令文件
Orapwdfile=C:\app\qxz\product\ll.2.0\dbhome_l\database\pwdKCGL.ora
Password=12345
6^启动服务器:Sqlplus/nolog
Conn/assysdba
Startupnomount
7、执行建库脚本:
CREATEDATABASEKCGL
datafile*c:\app\qxz\oradata\KCGL\system01.dbf*size300m
autoextendonnext10mextentmanagementlocal
SysauxdatafileJc:\app\qxz\oradata\KCGL\sysaux01.dbf,size120m
undotablespaceundotbsl
datafile?c:\app\qxz\oradata\KCGL\undotbs01.dbfJsize100m
defaulttemporarytablespacetemptbsl
tempfile*c:\app\qxz\oradata\KCGL\temp01,dbf*size50m
logfilegroup1(Jc:\app\qxz\oradata\KCGL\redo01.log*)size50m,
group2(,c:\app\qxz\oradata\KCGL\redo02.log,)size50m,
group3(Jc:\app\qxz\oradata\KCGL\redo03.log,)size50m;
用记事本编辑以上内容,假定保存为C:\CREATEKCGL.sql文件,然后执行这个脚本。
StartC:\CREATEKCGL.sql
不管出现哪种错误,都要删除C:\app\qxz\oradata\KCGL目录下创建的所有文件,改
正错误后,重新启动实例,再执行建库脚本。
8、创建数据字典和包
StartC:\app\qxz\product\ll.2.0\dbhomel\RDBMS\ADMIN\catalog
StartC:\app\qxz\product\ll.2.0\dbhome_l\RDBMS\ADMIN\catproc
9^执行pupbld.sql脚本文件
切换成system用户执行如下命令:Connsystem/manager
StartC:\app\qxz\product\l1.2.O\dbhome_l\sqlplus\admin\pupbld
10、执行scott脚本创建scott方案
StartC:\app\qxz\product\l1.2.0\dbhome_l\RDBMS\ADMIN\scott.sql
这时需要修改密码:Conn/assysdba
Alteruserscottidentifiedbytiger;
再连接scott:Connscott/tiger
11、select*fromdept;
能显示出dept表的结果,表示新数据库KCGL已安装成功了。
2.2查看数据库
1、查看表空间的名称及大小
selecttab1espace_name,min_extents,max_extents,pctincrease,statusfrom
dbatablespaces;
selecttablespacename,initialextent,nextextent,contents,logging,
extent_management,allocationtypefromdbatablespacesorderbytablespacename;
selectt.tablespacename,round(sum(bytes/(1024*1024)),0)tssizefrom
dbci_tablespacest,dba_data_fil.esdwheret.tablespace_ncime=d.tablespace_name
groupbyt.tablespace_name;
2、查看表空间物理文件的名称及大小
columndb_block_sizenew_valueblksznoprint
selectvaluedb_block_sizefromv$parameterwherename='db_block_size';
columntablespace_nameformatal6;
columnfile_nameformata60;
setlinesize160;--为sqlplus命令
selectfile_name,round(bytes/(1024*1024),0)
total_space,autoextensible,increment_by*&blksz/(1024*1024)as
incement,maxbytes/(1024*1024)asmaxsizefromdbadatafilesorderby
tablespace_name;-blksz一般为8192
selecttablespacename,fileid,filename,round(bytes/(1024*1024),0)
total_space
fromdba_data_filesorderbytablespace_name;
3、查看回滚段名称及大小
selecta.owner||'.||a.segmentnameroll_name,a.tablespace_name
tablespace,to_char(a.initial_extent)||'/'||to_char(a.next_extent)
in_extents,to_char(a.min_extents)I|'/'||to_char(a.max_extents)m_extents,
a.statusstatus,b.bytesbytes,b.extentsextents,d.shrinksshrinks,d.wraps
wraps,d.optsizeoptfromdbarollback_segsa,dbasegmentsb,v$rollnamec,
v$rollstatdwherea.segmentname=b.segment_nameanda.segmentname=c.name(+)
andc.usn=d.usn(+)orderbya.segment_name;
selectsegment_name,tablespace_name,r.status,(initial_extent/1024)
InitialExtent,(next_extent/1024)NextExtent,max_extents,v.curext
CurExtentFromdba_rollback_segsr,v$rollstatvWherer.segment_id=v.usn(+)order
bysegment_name;
4、查看控制文件
selectnamefromv$controlfile;
5、查看日志文件
selectmemberfromv$logfile;
6、查看表空间的使用情况
select*from(selectsum(bytes)/(1024*1024)as
^freespace(m)tablespacenamefromdbafreespacegroupbytablespacename)
orderby〃free_space(m)〃;
SELECTA.TABLESPACE_NAME,A.BYTESTOTAL,B.BYTESUSED,C.BYTES
FREE,(B.BYTES*100)/A.BYTES〃%USED",(C.BYTES*100)/A.BYTESFREE〃FROM
SYS.SM$TS_AVAILA,SYS.SM$TS_USEDB,SYS.SM$TS_FREE
CWHEREA.TABLESPACE_NAME=B.TABLESPACE_NAMEAND
A.TABLESPACE_NAME=C.TABLESPACE_NAME;
7、查看数据库库对象
selectowner,object_type,status,count(*)count#fromallobjectsgroupby
owner,object_type,status;
8、查看数据库的版本
select*fromv$version;
SelectversionFROMProduct_component_versionWhere
SUBSTR(PRODUCT,1,6)=Oracle,;
9、查看数据库的创建日期和归档方式
selectcreated,logmode,log_modefromv$database;
10、查看临时数据库文件
selectstatus,enabled,namefromv$tempfile;
常用数据库信息查看命令
(1)oracle中怎样查看总共有哪些用户
select*fromallusers;
(2)查看oracle当前连接数
怎样查看oracle当前的连接数呢?只需要用下面的SQL语句查询一下就可以了。
select*fromv$sessionwhereusernameisnotnullselect
username,count(username)fromv$sessionwhereusernameisnotnullgroupby
username并查看不同用户的连接数
selectcount(*)fromv$session#连接数
Selectcount(*)fromv$sessionwherestatus='ACTIVE'#并发连接数
(3)列出当前数据库建立的会话情况
selectsid,serial#,username,program,machine,statusfromv$session;
实验3表与视图的基础操作
3.1创建基本表
例3-1创建学生、课程、选课三个表,在SQLPLUS的启动界面输入以下代码:
SQL>CreateTableS(SnoVarchar2(10)PrimaryKey,SnameVarchar2(10)Not
Null,SsexChar(2),SageNumber,SdeptVarchar2(40));
SQL>CreateTableCourse(CnoVarchar2(10),CnameVarchar2(50),Ccredit
Number,ConstraintPk_CPrimaryKey(Cno));
SQL>CreateTableSC(SnoVarchar2(10),CnoVarchar2(10),ScoreNumber
Default0Check(ScoreBetween0And100),ConstraintPk_SPrimaryKey
(Sno,Cno))TABLESPACE"Testspace”;一使用Testspace表空间
3.2修改表
i、修改表空间的相关操作
1)增加表空间中的数据文件
AlterTablespaceTestspaceAddDatafile'c:\app\qxz\file_3.dbf'size
100m;
2)删除表空间中的数据文件
AlterTablespaceTestspaceDropDatafile'c:\app\qxz\file_3.dbf';
3)修改表空间文件的数据文件大小
AlterDatabaseDatafile'c:\app\qxz\file_2.dbf'Resize50m;
4)修改表空间数据文件的自动增长属性。
AlterDatabaseDatafile,c:\app\qxz\file_l.dbf1AutoextendOff;--Off不能自
动增长
2、修改表结构的相关操作:
1)插入属性
例3-2在S表插入新属性地址。
SQL>AlterTableSAdd(AddressVarchar(100));
2)修改属性
例3-3对上述性别属性的数据类型进行修改,并且默认值为男”。
SQL>AlterTableSModify(SsexVarchar2(2)Default'男');
3)删除表属性
例3-4删除上述表中的地址属性。命令为:SQL>AlterTableSDrop(Address);
注意:通常在系统不忙的时候删除不使用的字段,可以先设置字段为unused;
AlterTableSSetUnusedColumnAddress;
系统不忙时再执行删除:AlterTableSDropUnusedColumn;
4)表重命名
例3-5把表SC改名为Learn。命令为:SQL>RenameScToLearn;
5)清空表中的数据
例3-6清空学生表的信息。命令为:SQL>TruncateTableS;
6)给表增加注释
例3-7对表S添加注释为'thisIsATestTable'
SQL>CommentOnTableSIs'ThisIsATestTable,;
7)给列添加注释
例3-8对表S的Sno属性添加'学号’的注释。
SQL>CommentOnColumnS.SnoIs'学号';
3.3删除表
例3-9删除Course表。命令为:SQL>DropTableCourse;
3.5创建和管理视图
1、创建视图
例3T0在S表中创建以学号、姓名、系别的新视图。
SQL>CreateOrReplaceViewV_S(Num,Name,Sdept)AsSelectSno,Sname,
SdeptFromS;
例3-11在SC上定义新视图,当用update修改数据时,必须满足视图score>60的条
件,不满足则不能被改变。
SQL>CreateOrReplaceViewVSCAsSelect*FromSCWhereScore>60WithCheck
Option;
例3T2创建新视图,按照学号分组显示学生的最高、最低分和平均成绩。
SQL>CreateViewV_S_SC(Num,Smin,Smax,Savg)AsSelect
D.Sno,Min(E.Score),Max(E.Score),Avg(E.Score)FromSCE,SDWhereE.Sno=D.Sno
GroupByD.Sno;
2、查询视图
例3-13查询上述建立的视图。命令为:SQDSelect*FromV_S_SC;
3、更新视图
例3-14把所有学号为08开头的学生的相关系别信息改为管理系。
SQL>UpdateVSSetSdept=,Management'WhereNum1ike'08%";
3.6表或视图的导入与导出操作
1、Oracle数据间的导入导出imp/exp
下面是导入导出的实例,导入导出的其它例子或方法请参阅实验13。(1)数据导出
1)将数据库orcl完全导出,用户名system密码orcl,导出到c:\orcl.dmp中。exp
system/orcl@orcl2file=c:\orcl.dmpfull=y
2)将数据库吨jxgl用户与scott用户的表导出。expsystem/orcl@orcl2
file=c:\orcl_jxglscott.dmpowner=(jxgl,scott)
3)将数据库和jxgl用胪的表student,sc导出。expjxgl/jxgl@orcl2
file=c:\orcl_jxgl_studentsc.dmptables=(student,sc)
4)将数据库中jxgl用户的表student中年龄大于等于19的学生记录导出。exp
jxgl/jxgl@orcl2file=c:\orcl_jxgl_student_agegel9.dmptables=(student)
query='〃wheresage>=19\,/
上面是常用的导出,对于压缩导出,只要在上面命令后面加上compress=y就可以了。
(2)数据的导入
1)将c:\orcl.dmp中的獭(据导入orcl数据中。imp
system/orcl@orcl2file=c:\orcl.dmp
上面可能有点问题,因为有的表己经存在,然后它就报错,对该表就不进行导入。在
后面加上ignore=y就可以了。
2)将c:\orcl_jxgl_studentsc.dmp中的表sc导入。impjxgl/jxgl@orcl2file=
c:\orcl_jxgl_studentsc.dmptables=(sc)ignore=y
实验4SQL语言——SELECT查询操作
创建Student、SC^Course三表及添加表记录命令如下:
CreateTableStudent
(SnoCHAR(5)NOTNULL,
SnameVARCHAR(20),
SageSMALLINTCHECK(Sage>=15ANDSage<=45),
SsexCHAR(2)DEFAULT'男'CHECK(Ssex='男'ORSsex='女'),
SdeptCHAR(2),constraintprsnoprimarykey(sno));
CreateTableCourse(CnoCHAR(2)NOTNULL,CnameVARCHAR(20),Cpno
CHAR(2),CcreditSMALLINT,constraintprCnoprimarykey(Cno));
CreateTableSC(SnoCHAR(5)NOTNULL,CnoCHAR(2)NOTNULL,GradeSMALLINT
CHECK((GradeISNULL)OR(GradeBETWEEN0AND100)),PRIMARY
KEY(Sno,Cno),CONSTRAINTCFFOREIGNKEY(Cno)REFERENCESCourse(Cno),CONSTRAINT
S_FFOREIGNKEY(Sno)REFERENCESStudent(Sno));
INSERTINTOStudentVALUES98001','钱横',18,'男','CS,)
INSERTINTOStudentVALUESC98002','王林',19,'女','CS')
INSERTINTOStudentVALUES('98003','李民',20,'男','IS')
INSERTINTOStudentVALUES('98004','赵三',16,'女','MA')
INSERTINTOCourseVALUESCT,'数据库系统‘,'5',4);
INSERTINTOCourseVALUES('2','数学分析',null,2);
INSERTINTOCourseVALUES('3','信息系统导论‘,'1',3);
INSERTINTOCourseVALUESC4','操作系统原理‘,'6',3);
INSERTINTOCourseVALUES('5',‘数据结构‘,’7',4);
INSERTINTOCourseVALUESC6','数据处理基础',null,4);
INSERTINTOCourseVALUES('7','C语言‘,’6',3);
INSERTINTOSCVALUESC98001'.'l',87);INSERTINTOSC
VALUES('98001,,,2,,67);INSERTINTOSCVALUES('98001','3',90);INSERTINTOSC
VALUES('98002','2',95);INSERTINTOSCVALUES('98002,,'3',88);
例4-1
SELECTDISTINCTSno
FROMSC
WHEREGrade>=90;
例4-2
SELECTSname,Ssex
FROMStudent
WHERESage>18ANDSdeptNOTIN('IS','MA');
例4-3
SELECT*FROMCourseWHERECnameLIKE导,ESCAPE,#,;
例4-4
SELECTCOUNT(DISTINCTSno)/*加DISTINCT去掉重复值后计数*/
FROMSC;
例4-5
SELECTStudent.SnoFROMStudent,SC
WHERESdept=,CS,ANDStudent.Sno=SC.Sno
GROUPBYStudent.SnoHAVINGCOUNT(*)>=2;
例4-6
SelectStudent.*,SC.*FromStudent,SC;
或SelectStudent.*,SC.*FromStudentCrossJoinSC;
例4-7
Select*FromStudent,SCWHEREStudent.Sno=SC.Sno;
例4-8
SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROMStudent,SCWIIEREStudent.Sno=SC.Sno;
或SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROMStudentINNERJOINSCONStudent.Sno=SC.Sno;
例4-9
SELECTFIRST.Cno,SECOND.cpnoFKOMCourseFIRST,CourseSECOND
WHEREFIRST.cpno=SEC0ND.Cno;
我们为Course表取两个别名FIRST与SECOND,这样就可以在SELECT子句和WHERE子
句中的属性名前分别用这两个别名加以区分。
例4-10
SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROMStudentLeftOuterJOINSCONStudent.Sno=SC.Sno;
例4-11
SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,
Course.Cno,Grade,cname,cpno,ccredit
FROMStudentLeftOuterJOINSCONStudent.Sno=SC.SnoFullOuterjoinCourse
onSC.eno=Course,eno;
例4-12
SELECTStudent.*,Cno,GradeFROMSTUDENTINNERJOINSCONStudent.Sno=SC.Sno
WHERESSEX='男'ANDGRADE>=60
例4-13
SELECT*FROMStudent
WHERESdeptIN(SELECTSdeptFROMStudentWHERESname='钱横');
或SELECT*FROMStudent
WHERESdept=(SELECTSdeptFROMStudent
WHERESname='钱横');一当子查询为单列单行值时可以用“二”
或SELECTSL*FROMStudentSI,StudentS2
WHERESl.Sdept=S2.SdeptANDS2.Sname='钱横';
一般来说,连接查询可以替换大多数的嵌套子查询。
SQL-92支持“多列成员”的属于(IN)条件表达,例:
例4-14
Select*fromStudentT
Where(T.sdept,T.sage,T.ssex)IN(Selectsdept,sage,ssexFromstudentS
WhereS.snoOT.sno);-Oracle支持的
它等价于逐个成员IN的方式表达,如下:
Select*fromStudentTWhereT.sdeptIN
(SelectsdeptFromstudentS
WhereS.snoOT.snoandT.sageIN
(SelectsageFromstudentXWhereS.sno=X.snoandX.snoOT.sno
andT.ssexIN
(SelectssexFromstudentYWhereX.sno=Y.snoandY.snoOT.sno)));
例4-15
SELECTSno,Sname,SdeptFROMStudent--IN嵌套查询方法
WHERESnoIN
(SELECTSnoFROMSC
WHERECnoIN(SELECTCnoFROMCourseWHERECname='数据库系统'));
或SELECTSno,Sname,SdeptFROMStudent-IN、=嵌套查询方法
WHERESnoIN
(SELECTSnoFROMSC
WHERECno=(SELECTCnoFROMCourseWHERECname='数据库系统'));
或SELECTStudent.Sno,Sname,Sdept一连接查询方法
FROMStudent,SC,Course
WHEREStudent.Sno=SC.SnoANDSC.Cno=Course.CnoANDCourse.Cname='数据库系统
或SelectSno,Sname,SdeptFromStudent-Exists嵌套查询方法
WhereExists(Select*FromSCWhereSC.Sno=Student.SnoAnd
Exists(Select*FromCourse
WhereSC.Cno=Course.CnoAndCname=,数据库系统'));
或SelectSno,Sname,SdeptFromStudent-Exists嵌套查询方法
WhereExists(Select*FromcourseWhereCname='数据库系统'and
Exists(Select*FromSCWheresc.sno=student.snoandSC.Cno=
Course.Cno));
例4-16
SELECTSno,SnameFROMStudent
WHERESnoNOTIN(SELECTSnoFROMSCWHERECnoIN('2','4'));
例4-17
SELECTSnameFROMStudent
WHERESage>A11(SELECTSageFROMStudent
WHERESdept='IS')ANDSdept<>'IS'
ORDERBYSname;
本查询实际上也可以用集函数实现:
SELECTSnameFROMStudent
WHERESage>(SELECTMAX(Sage)FROMStudent
WHERESdept=TS')ANDSdeptO'IS"
ORDERBYSname;
例4-18
SELECTDISTINCTCNAMEFROMCOURSEC
WHERE'女'=ALL(SELECTSSEXFROMSC,STUDENT
WHERESC.SNO=STUDENT.SNOANDSC.CNO=C.CNO);
或SELECTDISTINCTCNAMEFROMCOURSEC
WHERENOTEXISTS
(SELECT*FROMSC,STUDENT
WHERESC.SNO=STUDENT.SNOANDSC.CNO=C.CNOANDSTUDENT.SSEX='男');
例4T9
SELECTSnameFROMStudent
WHERENOTEXISTS
(SELECT*FROMSCWHERESno=Student.SnoANDCno=T');
或SELECTSnameFROMStudent
WHERESnoNOTIN(SELECTSnoFROMSCWHERECno='T);
但如下是错的:
SELECTSnameFROMStudent,SCWHERESC.Sno=Student.SnoANDCnoO'l’;
例4-20
SELECTSnameFROMStudent
WHERENOTEXISTS
(SELECT*FROMCourseWHERENOTEXISTS
(SELECT*FR0MSCWHERESno=SC.SnoANDCno=Course.Cno));
由于没有全称量词,我们将题目的意思转换成等价的存在量词的形式:查询这样的学
生姓名没有一门课程是他不选的。
本题的另一操作方法是:
SELECTSnameFROMStudent,SCWHEREStudent.Sno=SC.Sno
GroupbyStudent.Sno,Snamehavingcount(*)>=(SELECTcount(*)FROMCourse);
例4-21
SELECTSnoFROMStudentSX
WHERENOTEXISTS
(SELECT*FROMSCSCY
WHERESCY.Sno=98001'ANDNOTEXISTS
(SELECT*FROMSCSCZWHERESCZ.Sno=SX.SnoAND
SCZ.Cno=SCY.Cno));
例4-22
SELECTSnoFROMSCWHERECno=T'
UNION
SELECTSnoFROMSCWHERECno='2';
SELECTSnoFROMSCWHERECno=T'
INTERSECT
SELECTSnoFROMSCWHERECno='2';"查询既选课程1又选课程2的学生学号集
例4-23
SELECT*FROMStudentWHERESdept=CS,
INTERSECT
SELECT*FROMStudentWHERESage<=19;
本查询等价于“鳖询计算机科学系中年龄不大于19岁的学生J,为此变通法为:
SELECT*FROMStudentWHERESdept=CS,ANDSage<=19;
例4-24
SELECTSnoFROMSCWHERECno='2'
MINUS
SELECTSnoFROMSCWHERECno=T;
本例实际上是查询选修了课程2但没有选修课程1的学生。为此变通法为:
SELECTSnoFROMSC
WHERECno=’2'ANDSnoNOTIN(SELECTSnoFROMSCWHERECno=f;
例4-25
Selectstuno,sname,avgr
FromStudent,(Selectsnostuno,avg(grade)avgrFromSCGroupBysno)SG
WhereStudent.sno=SG.stu_noAndavgr>85;
SQL-92允许在From中使用看询表达式,并必须为查询表达式取名。它等价于如下未
使用查询表达式的形式:
SelectStudent.Sno,Sname,AVG(Grade)
FromStudent,SCWhereStudent.Sno=SC.Sno
GroupByStudent.Sno,SnameHAVINGAVG(Grade)>85;
例4-26
SELECTSNAME,CNAME,GRADE
FROM(SELECTSNAME,CNAME,GRADEFROMSTUDENT,SC,COURSE
WHERESSEX='女'ANDSTUDENT.SNO=SC.SNOANDSC.CNO=COURSE.CNO)
TEMPWHEREGRADE>90;一特意用查询表达式实现,完全可用其它方式实现
但如下使用查询表达式的查询,则不易改写为其它形式。
例4-27
Selectavgr,COUNT(*)
From(Selectsno,avg(grade)avgrFromSCGroupBysno)SG
GroupByavgr;
例4-28
GRANTCREATEVIEWTOJXGL—赋予用户JXGLCREATEVIEW的权力
CREATEVIEWIS_Student
ASSELECTSno,Sname,Sage,Ssex
FROMStudentWHERESdept='IS'WITHCHECKOPTION
GO
SELECT*FROMIS_StudentWHERESage>=18ANDSsex=女';
实验5SQL语言一一数据更新操作
5.1INSERT命令
例5-1
InsertIntoStudentValues('98011'张静',27,'女CS');Commit;
Insert语句后可跟returning子句来获取插入记录的某字段值。程序代码如下:
Setserveroutputon
Declare
bndlstudent.sno%TYPE;
bnd2student.sname%TYPE;
Begin
InsertIntoStudent(sno,sname,sage,ssex,sdept)Values('98011'张静
',27,‘女','CS')RETURNINGsno,Student,snameINTObndl,bnd2;
dbmsoutput.put_line(bndl||’||bnd2);
End;
例5-2
InsertIntoStudent(Sno,Sname,Sage)Values98012,,'李四16);Commit;
例5-3
CreateSequencettincrementby1minvalue101maxvaluecycle;
Createtabletestable(idint,rqdate);
InsertintotestableValues(tt.nextval,sysdate);
若要删除序列命令为:DropSequencett;若删除测试表testable命令为:Droptable
testable;
例5-4
InsertIntoSC
Selectsno,eno,nullFromStudent,CourseWhereSdept='CS'andeno='5’;
Commit;
例5-5
InsertIntoStudent
Selectcast(cast(snoasinteger)+1as
char(5)),CONCAT(sname,*2*),sage,ssex,sdeptFromStudentWhereSname=,赵三';
Commit;
SELECT*FROMStudent;一查看结果(执行结果略)
5.2UPDATE命令
例5-6
UPDATEStudentSETSage=23WHERESno='98003,;
例5-7
UPDATEStudentSETStudent,Sage=Student.Sage+1
wheresnoin
(SELECTsnoFROM(SELECT*FROMStudentORDERBYsno)
WHEREROWNUM<=3);
例5-8
UpdateSC
SetGrade=(SelectAVG(Grade)FromSCWhereCno=,3?)WhereSno='98001'and
Cno=,3';
Update语句后也可跟上Returning子句来获取更新后记录的字段值。程序代码如下:
Setserveroutputon
Declare
bndlsc.sno%TYPE;bnd2sc.grade%TYPE;
Begin
UpdateSCSetGrade13(SelectAVG(Grade)FromSCWhereCno=,3')WhereSno
二'98001'andCn。='3'RETURNINGsc.sno,sc.gradeINTObndl,bnd2;
dbmsoutput.putline(bndl||J|tochar(bnd2));
End;
例5-9
UPDATESCSETGRADE=0
WHERECN0='2'AND
‘王林'=(SELECTSNAMEFROMSTUDENTWHERESTUDENT.SNO=SC.SNO);
例5-10
Updatestudent
Setsage=(selectavg(sage)fromstudentwheresdept='CS'),
(ssex,sdept)=(selectssex,sdeptfromstudentwheresno='98003')
Wheresno='98002'
5.3DELETE命令
先备份选修表SC到TSC中,命令为:
CreateTableTSCasSelect*FromSC一备份到表TSC中
例5-11
SELECT*FROMSC一删除前
DELETEFROMSC一删除中
WHERE'CS'=(SELECTSdeptFROMStudent
WHEREStudent.Sno=SC.Sno)
SELECT*FROMSC一删除后
DELETE语句后也可跟上Returning子句来获取刚删除记录相应的字段值。程序代码如
下:
Setserveroutputon
Declare
bndlsc.sno%TYPE;bnd2sc.grade%TYPE;
Begin
DELETEFROMSC—删除中
WHERESNO=,98001'ANDcno='2'RETURNINGsc.sno,sc.gradeINTObndl,bnd2;
dbmsoutput.putline(bndl|,|;tochar(bnd2));
End;
例5-12
DELETEFROMjxgl.SC@remoteWHERESNO="980011;
例5-13DELETEFR0MSC;
如TRUNCATETABLESC,清空SC表。
从表TSC恢复数据到表SC,命令为:
INSERTINTOSCSELECT*FROMTSC―这是一种方便、简易地恢复数据的方法。
实验6嵌入式SQL应用
Pro*C程序举例
例如:“example.pc”程序能完成输入雇员号、雇员名、职务名和薪金等信息,并插
入到雇员表emp(Oracle缺省安装后SCOTT用户连接能存取到该表)中的功能。
#defineUSERNAME"SCOTT"〃连接Oracle的用户名
#definePASSWORD〃scott〃〃连接Oracle的用户口令
#defineSERVER'localhost:1521/orcl"〃连接Oracle的用户口令
tfinclude<stdio.h>
ttinclude<string.h>
#include<stdlib.h>
#include<sqlda.h>
^include<sqlcpr.h>
EXECSQLINCLUDEsqlca;
EXECSQLBEGINDECLARESECTION;
char*username=USERNAME;char*password=PASSWORD;
char*server=SERVER;varcharsqlstmt[80];
intempnum;varcharemp_name[15];
varcharjob[50];floatsalary;
EXECSQLENDDECLARESECTION;
voidsqlerror();
main()
{EXECSQLWHENEVERSQLERRORDOsqlerror();〃错误处理
EXECSQLCONNECT:usernameIDENTIFIEDBY:passwordUSING:server;〃连接
oracle
sqlstmt.len=sprintf(sqlstmt.arr,“INSERTINTOEMP(EMPNO,ENAME,JOB,SAL)
VALUES(:VI,:V2,:V3,:V4)");
EXECSQLPREPARESFROM:sqlstmt;//SQL命令区S动态准备
for(;;)
{printf(^Xnenteremployeenumber:");scanf(〃%d〃,&empnum);
if(empnum二二0)break;
printf(z/\nenteremployeename:");scanf(〃%s〃,emp_name.arr);
emp_name.1en=str1en(emp_name.arr);
printf(,z\nenteremployeejob:");scanf(〃%s〃,job.arr);
job.len=strlen(job.arr);
printf(^Xnenteremployeesalary:,z);scanf&salary);
printf(,,%d--%s--%s--%f〃,empnum,emp_name.arr,job.arr,salary);
//以下通过命令区S参数化动态执行SQL命令
EXECSQLEXECUTESUSING:empnum,:empname,:job,:salary;
}
EXECSQLCOMMITWORKRELEASE;
exit(0);
)
voidsqlerror(){〃错误处理程序
EXECSQLWHENEVERSQLERRORCONTINUE;
printfCAnOracleerrordetected:\n,z);
printf(,z\n%.70s\n〃,sqlca.sqlerrm.sqlerrmc);
EXECSQLROLLBACKWORKRELEASE;//出错回滚,取消操作。
exit(1);
)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 灯具灯饰出售合同范例
- 书面终止合同范例
- 整体产权买断合同范例
- 2025广州市房屋买卖中介服务合同
- 高中历史之历史百科古希腊与民主制度素材
- 2024-2025学年高中历史第一单元政治制度4中国历代变法和改革课时分层作业含解析新人教版选择性必修第一册
- 2025茶叶供货合同范本,供货合同范本
- 2024-2025学年高中历史专题三近代中国思想解放的潮流3.1“顺乎世界之潮流”课时作业含解析人民版必修3
- 2025农作物种子购销合同 标准版模板全
- 2025年贵州货车从业资格考试题库
- 土地增值税税源明细表(从事房地产开发的纳税人清算适用、从事房地产开发的纳税人按核定征收方式清算适用、纳税人整体转让在建工程适用)
- hsk5-成语学习知识
- 河道清理工程环境影响评价报告书
- GB/T 2831-2009光学零件的面形偏差
- GB/T 10433-2002电弧螺柱焊用圆柱头焊钉
- 收款账户变更通知函(4篇)
- 小学生金融与理财课程-课件
- 人教版小学数学三年级 上册 期末总复习-解决问题专项
- 稻虾种养技术及生态效应(20161201)课件
- (国开电大)可编程控制器应用 课程实验
- 重庆大学介绍课件
评论
0/150
提交评论