第一篇:Oracle数据库学习中的六条经验总结
Oracle数据库学习中的六条经验总结
以下的文章主要是介绍在Oracle数据库学习中的六条经验总结,其实想学好Oracle数据库并不是一件很困难的事情,很多人都认为Oracle数据库的体系过于庞大,在学习的过程中摸不到头绪,以下的文章就会给你提供相关的解答方法。
1、如果有一定的数据库基础知道SQL是怎么回事,即使写不出来简单的SQL,但可以看动它们,你就可以跳到2。否则请先看一下数据库基础和SQL语言,不需要很深,更不需要去记忆那些复杂的SQL命令,这些可以留在以后边应用边学习、记忆。
2、要想学好Oracle数据库,首先要学习ORACLE的体系结构,现在你不需要深入理解它们,但要分清几个关键的概念:instance&database, memory structure,process&those files,such as data file, control file,init parameter file etc以及database ,tablespace,data file和tablespace,segmnet,extent & block它们之间的关系。
当然还要分清undo tablespace & redo log file等,对于很多初学者来说,能够对这些概念有个较为清晰的认识并不是一件容易的事,而这些并非Oracle的全部。
3、是有关ORACLE的一些基本概念,下面要学习的是一些简单的的实际操作,就是如何去管理ORACLE数据库,当然不是管理全部的ORACLE。在此过程中你将对SQL和ORACLE体系结构有个更深入的了解。
4、到了这一步你基本上算是初步掌握了ORACLE,下面将要根据你的方向来具体学习其它的ORACLE知识了。如果你是开发人员,则需要更多地去学习PL/SQL以及DEVELOPER,而这将是一门新的课程。如果你是一名DBA,请继续。
5、现在你可以根据自己的实际情况,进行有选择的学习,也就是说下面的内容没有特别顺序要求。可以选择深入学习ORACLE数据库的管理、备份与恢复、性能调整、网络等。当然在学习这些知识的过程中,如果有实际的工作更好,这样你可以在实际中成长,学会TROUBLE SHOOTING。
6、当然在学习的过程中,你可以在网站或论坛中与他人进行交流,可以看别人的一些经验文章,也可以自己写一些心得体会。技术进步的本身就是经验的积累和提炼过程,希望大家共同成长,欢迎大家相互交流。
第二篇:ORACLE数据库开发经验总结
ORACLE数据库开发经验总结
----ORACLE数据库作为大型数据库管理系统,近年来一直占有世界上高端数据库的最大 份额,其强大而完善的数据库管理功能,以及ORACLE公司推陈出新的不断努力,一直成 为IT业界瞩目的焦点。岭澳核电站的数据库平台采用了ORACLE7.3作为后端平台,前端选 择了ORACLE公司的DEVELOPER 2000 及DESIGNER 2000作为开发工具,采用了目前流行的
CLIENT/SERVER模式。本人在ORACLE系统的开发中,就ORACLE的整套开发工具提出一些自
己的体会,供同行参考。
----一.ORACLE SQL PLUS 使用技巧:----①查找重复记录:
SELECT DRAWING,DSNO FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID)FROM EM5 _PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO);----执行上述SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录。----删除重复记录:
DELETE FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID)FROM EM5 _PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO);----执行上述SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录。----② 快速编译所有视图
----当在把数据库倒入到新的服务器上后(数据库重建),需要将视图重新编译一遍,因 为该表空间视图到其它表空间的表的连接会出现问题,可以利用PL/SQL的语言特性,快 速编译。
SQL >SPOOL ON.SQL SQL >SELECT ‘ALTER VIEW ‘||TNAME||’
COMPILE;’ FROM TAB;SQL >SPOOL OFF 然后执行ON.SQL即可。
SQL >@ON.SQL 当然,授权和创建同义词也可以快速进行,如:
SQL >SELECT ‘GRANT SELECT ON ’ ||TNAME||’ TO USERNAME;’ FROM TAB;SQL >SELECT ‘CREATE SYNONYM
‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB;③ 用外联接提高表连接的查询速度
在作表连接(常用于视图)时,常使用以下方法来查询数据: SELECT PAY_NO, PROJECT_NAME FROM A WHERE A.PAY_NO NOT IN(SELECT PAY_ NO FROM B WHERE VALUE >=120000);----但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,主要因 为NOT IN要进行一条一条的比较,共需要10000*10000次比较后,才能得到结果。该用外
联接后,可以缩短到1分左右的时间: SELECT PAY_NO,PROJECT_NAME FROM A,B WHERE A.PAY_NO=B.PAY_NO(+)AND B.PAY_NO IS NULL AND B.VALUE >=12000;----④ 怎样读写文本型操作系统文件
----在PL/SQL 3.3以上的版本中,UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下: DECALRE FILE_HANDLE UTL_FILE.FILE_TYPE;BEGIN
FILE_HANDLE:=UTL_FILE.FOPEN(‘C:’,’TEST.TXT’,’A’);
UTL_FILE.PUT_LINE(FILE_HANDLE,’ HELLO,IT’S A TEST TXT FILE’);UTL_FILE.FCLOSE(FILE_HANDLE);END;----相关UTL_FILE数据库包详细信息可以参见相关资料。----⑤ 怎样在数据库触发器中使用列的新值与旧值
----在数据库触发器中几乎总是要使用触发器基表的列值,如果某条语句需要某列修改 前的值,使用:OLD就可以了,使用某列修改后的新值,用:NEW就可以了。如:OLD.DEPT_ NO,:NEW.DEPT_NO。
----二.ORACLE DEVELOPER 2000使用技巧:
----① 改变FORM(FMX模块)运行时的Runform4.5的题头:
----DEVELOPER2000中FMX默认题头为:Developer/2000 Forms Runtime for Windows
/ NT 你可以改为自己定义的标题,----1.在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE----2.在此触发器中写如下代码:
set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT SYSTEM 欢迎使用');----② 如何隐藏菜单中的window选项:
----在创建自己的菜单时,最后选项总有window项,下面介绍如何去掉它,----1.创建一个Menu
----2.在Menu中建立一个Item,命名为WINDOW。----3.设置该Item属性如下:----
Menu Item Type:Magic Command Type:Null Magic Item:Window Lable:为空
----③ 怎样创建动态下拉列表List
----Developer 2000 中的列表是通过设置相关属性而完成数据项的列表设置的,但那
只是静态的,有时你想让某项成为动态的列表,随输入数据的改变而改变,就需要动手 去编个小程序。下面详细介绍怎样去做:----有块EBOP_CABLE_ACCOUNT,下有SPECIFICATION数据项,当一进入该模块时,就将
SPECIFICATION项在数据库中存储的值动态显示出来,先在Form4.5中建立一个PRCEDURE,命名为DYN_LIST: PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)FROM EBOP_CABLE_ACCOUNT;CNT NUMBER;i NUMBER;TNAME EBOP_CABLE_ ACCOUNT.SPECIFICATION%TYPE;BEGIN
CLEAR_LIST('EBOP_CABLE_ ACCOUNT.SPECIFICATION');SELECT COUNT(DISTINCT
(SPECIFICATION))INTO CNT FROM EBOP _CABLE_ACCOUNT;open C1;FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;EXIT WHEN C1%NOTFOUND OR C1%NOTFOUND IS NULL;ADD_LIST_ELEMENT('EBOP_CABLE_ACCOUNT.SPECIFICATION',i,TNAME,TNAME);END LOOP;DELETE_LIST_ELEMENT('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);CLOSE C1;END;然后在FORM的WHEN-NEW
-FORM-INSTANCE触发子中加入一行: DYN_LIST;----这样一进入该FMX,就会动态刷新该列表。除此之外,SPECIFICATION数据项改为列 表项。
----④ 当显示多条记录且数据项特别多时,如何组织录入及显示界面:----如上图所示,PRN代码及设备代码在画布1(CONTENT型)上,其它数据项在画布2(ST ACK型)上,所有数据项为一个表的列或一个块的数据项。在拉动水平滚动条时或用TAB或 敲回车键时,将看到全部数据项。这种排布方法适用于数据项特别多又想显示多条记录 时用。主要制作顺序为:先建立两个画布,画布1(CONTENT型),画布2(STACK型),然后
建立块,选画布时用画布1,这样所有项都显示在画布1上,然后选中除PRN代码及设备代 码之外的所有数据项,选TOOLS菜单下的PROPERTIES选项,将这些数据项的CANVAS属性选
为画布2(STACK型),然后调整整体位置就可以了。----⑤ 如何在FORM的受限触发子中提交保存数据
----在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDA
TE,DELETE等操作并想立即存盘时,就需要COMMIT WORK语句了。首先在服务器端建立D B_SQL_COMMIT这个过程(采用ORACLE7.3数据库),PROCEDURE DB_SQL_COMMIT IS source_cursor integer;ignore integer;V7 NUMBER :=2;BEGIN
source_cursor:=dbms_sql.open_cursor;dbms_sql.parse(source_cursor,'COMMIT WORK',V7);ignore:=dbms_sql.execute(source_cursor);DBMS_SQL.CLOSE_CURSOR(source_cursor);END;----然后在FORM中该触发子中调用过程DB_SQL_COMMIT;就可以了,当然你可以根据自己
需要将该过程加入参数,这样通过参数可以得到执行DML语句的权限。----⑥ 如何在FORM中实现某数据项自动按记录序号加一操作
----设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE-REC
ORD,加入如下代码:
:VO_ID:=:System.Trigger_Record;----这样每当生成新记录时VO_ID就会自动加一了。
----⑦ 如何在一个FORM中调用另一个FORM,或在一个块中调用另一个块时显示特定的 记录有时用户会要求在调用另一个FORM时,只显示相关的记录,举例如下,在一个FORM 的块中有一个按钮,在按钮触发子中加入如下代码: DECLARE PM PARAMLIST;BEGIN
PM:=GET_PARAMETER_LIST('PM');IF NOT ID_NULL(PM)THEN
DESTROY_PARAMETER_LIST('PM');END IF;PM:=CREATE_PARAMETER_LIST('PM');......................ADD_PARAMETER(PM,'THE_WHERE', TEXT_PARAMETER,'EM_NAME=''EM4'' AND EM_PROJECT_NAME=''支架预制''');OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);END;
----其中EM_NAME,EM_PROJECT_NAME为本FORM某块的数据项,PAYMENT为要调用的FORM 模块。这样通过传递参数列表就可以得到想要的结果。在FORM PAYMENT.FMB中,建立一 参数THE_WHERE,CHAR型,长1000,然后在PAYMENT.FMB中建立FORM级触发子WHEN-NEW-F ORM-INSTANCE,在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN SET_BLOCK_PROPERTY('PAYMENT', DEFAULT_WHERE,:PARAMETER.THE_WHERE);END IF;----其中PAYMENT为要显示的块,这样通过参数传递就得到想要的某些特定条件的数据 了。
----⑧ 在FORM中当有主从块时,连续输入记录如何避免被不断的提示保存:
----每输入一条主记录和若干条该主记录的从记录后,此时再导航到主块输下一条记录,FORM就会提示你是否要保存记录,而你并不希望FORM提示,让它自动保存,此时你可 以到Program Units中找到过程PROCEDURE Clear_All_Master_Details,然后在这个过程 中找到语句
Clear_Block(ASK_COMMIT);----将其改为Clear_Block(DO_COMMIT);就可以了。----⑨ 在Report开始时选择排序项:
----在报表开始的Parameter Form中选择报表按哪个数据项排序,----1.先在USER PARAMETER 中创建SORT参数,为字符型,长20。
----2.初始值选’责任方’,然后将这四个值输入到DATA SELECTION中,形成列表。----3.然后处理QUERY中的SQL语句: select CHARGER,FCO_NO,EM_NAME,FCO _NO,DESCRIPTION, FCR_POINT from FCR_MAIN ORDER BY DECODE(:SORT,'责任方',CHARGER,'FCO号', FCO_NO,'FCR号',FCR_NO,'FCR号',EM_NAME)----⑩ 在Developer 2000中如何读写操作系统文件
----在用Developer 2000的开发工具开发应用程序时,经常碰到需要读写外部文件的问
题,可以用ORACLE 带的包TEXT_IO来完成这项需求。例如: DECLARE
IN_FILE TEXT_IO.FILE_TYPE;OUT_FILE TEXT_IO.FILE_TYPE;LINE_BUFER VARCHAR2(80);/*若不用IN_FILE,可以将各字段联接在一起赋值给此变量*/
BEGIN
IN_FILE:=TEXT_IO.FOPEN(‘C:TEMPTEST1.TXT’,’r’);OUT_FILE:=TEXT_IO.FOPEN(‘C:TEMPTEST2.TXT’,’w+’);
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);TEXT_IO.PUT(LINE_BUFER);TEXT_IO.NEW_LINE;TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);END LOOP;EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....’);TEXT_IO.FCLOSE(IN_FILE);TEXT_IO.FCLOSE(OUT_FILE);END;----三.数据库管理
----① 在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TAB
LE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次DR OP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。----② 数据库文件的移动方法
----当想将数据库文件移动到另外一个目录下时,可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强):
----1.使用SERVER MANAGER关闭实例.SVRMGR > connect internal;SVRMGR > shutdown;SVRMGR >exit;----2.使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6).在UNIX中用 mv命令可以把文件移动到新的位置,#mv /ora13/orarun/document.dbf /ora12/orarun----3.装载数据库并用alter database命令来改变数据库中的文件名.SVRMGR > connect internal;SVRMGR > startup mount RUN73;SVRMGR > alter database rename file
> ‘/ ora13/orarun/document.dbf’
> ‘/ ora12/orarun/document.dbf’;----4.启动实例.SVRMGR > alter database open;----ORACLE数据库开发经验总结
第三篇:Oracle数据库学习总结
Oracle数据库学习总结
1.set linesize xx;设置行间距,常用数值有100,200,300
2.set pagesize xx;设置每页显示行数
3.ed x;表示新建一个x.sql文件,通过文件编辑SQL语句,然后用@x命令可以调用刚才的命令
4.CONN username/password;命令可以建立用户的连接,需要注意的是sys用户是超级管理员,连接是时需要在末尾加上AS SYSDBA 以系统管理员的身份进行连接
5.如果表是归某个用户特有的,在查询的时候需要加上用户名 即以 用户名.表名 的格式查询
6.SHOW USER;命令可以显示当前连接的用户名
7.SELECT * FROM tab;可以显示当前用户下的所有数据表
8.“ / ”表示重复执行上一次的SQL命令操作
9.SELECT xx别名,xx 别名 FROM xx;搜索指定列名,并指定别名,方便显示
10.关键字DISTINCT 可以消除重复值 如 SELECT DISTINCT xx FROM xx;
11.Oracle中提供的字符串连接操作,使用“||”表示,相当于Java的“+”普通字符用“ ' ” 括起来
如: SELECT'员工姓名是'||ename||'员工卡号是'||empnoFROM emp;
12.查询语句 BETWEEN xx AND xx 是包括边界的13.查询日期的时候要加上''把日期引起来
例如:SELECT * FROM emp WHERE hiredate BETWEEN '1-1月-81' AND '08-9月-81';
14.模糊查询中“%”可以匹配任意长度的内容,“_”可以匹配一个长度的内容,如果没输入模糊查询关键字,那么默认查询全部数据,like关键字可以用在任何地方,可以匹配数字、字符、日期等。
15.SQL中不等于可以用“<>”或者“!=”表示
16.ORDER BY语句中 ASC表示升序,DESC表示降序,在没指定的时候默认按照升序排序
17.Oracle中的单行函数有如下,默认的所有的函数都要到表中执行,加上关键字DUAL只会产生一个临时表
UPPER('xxx')将小写转换为大写
LOWER('xxx')将大写转换为小写
INITCAP('xxx')将首字母大写
CONCAT('','')字符串连接
SUBSTR('xxx',x,x)字符串截取,从0或1开始截取效果是一样的,因为Oracle比较智能,要是输入的参数为负数,则表示倒着截取
LENGTH('xxx')字符串长度
REPLACE('xxx','x','x')字符串替换
ROUND(xxx,xx)四舍五入 xxx需要四舍五入的数值,xx保留的小数位,可以加负数 TRUNC(xxx)截断操作,默认小数点后的全部截断,也可以指定小数点保留位数如TRUNC(789.536,2)得到的结果是789.53,也可以加负数如TRUNC(789.536,-2)结果是700
18.SELECT sysdate FROM DUAL;可以求出当前的日期
19.Oracle 中提供了以下日期函数支持:
MONTHS_BETWEEN()求出给定日期范围的月数
ADD_MONTHS(xxx,xxx)在指定日期加上指定的月数
NEXT_DATE(xxx,'')求出下一个给定日期数
TO_CHAR()可以将年、月、日进行分割
例如
TO_CHAR(hirdate,'yyyy')year,TO_CHAR(hirdate,'mm')months,TO_CHAR(hirdate,'dd')day 还可以对时间进行格式化输出 如TO_CHAR(hirdate,'yyyy-mm-dd')
TO_CHAR(hirdate,'fmyyyy-mm-dd')可以去掉前导0
TO_CHAR()还可以对数字进行格式化 如
SELECT ename,TO_CHAR(SAL,'99,999')FROM emp;
注意:一定要用9来表示
$表示美元符号,L表示Local的缩写,以本地语言进行金额显示
TO_NUMBER()将字符串变为数字
TO_DATE()将字符串变为Date类型 例如 SELECT TO_DATE('2009-12-8','yyyy-mm-dd')FROM dual;
TO_NVL()可以将NULL的内容变为指定的内容
DECODE()相当于Java的if else else语句
例如SELECT DECODE(1,1,'内容是1',2,'内容是2',3,'内容是3')FROM dual;将输入 内容是1
20.左右连接
SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE
e.deptno(+)=d.deptno;此例中是右连接,以deptno表为准。
21.SQL1999语法
CROSS JOIN 交叉连接 会产生笛卡尔积
NATURAL JOIN 自然连接 自动进行关联字段匹配 可以消除笛卡尔积
USING 子句:直接关联操作列 如 SELECT * FROM emp e JOIN dept USING(deptno)WHERE deptno=30;
ON 子句 用户自己编写连接条件
LETF JOIN/RIGHT JOIN 左右连接
SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e right OUTER JOIN dept d ON(e.deptno=d.deptno);
22.分组查询GROUP BY 放在where之后
常见的组函数有
COUNT();
MAX();
MIN();
AVG();
SUM();
用法如下:SELECT deptno,count(empno)FROM emp GROUP BY deptno;
语法:SELECT deptno,empno,count(empno)FROM emp GROUP BY deptno;是错误的,原因是使用分组函数的时候,不能出现分组函数和分组条件以外的字段。
语法:SELECT deptno,count(empno)FROM emp;是错误的,原因是不使用分组的时候,则只能单独使用分组函数
分组函数只能在分组中使用,不允许子啊where语句中个使用,要使用个分组条件可以加上HAVING
例如:SELECT deptno,avg(sal)FROM emp GROUP BY deptno having avg(sal)>2000;注意:分组函数可以嵌套使用,但是在组函数嵌套使用的时候不能再出现分组条件的查询语句
如下语法是错误的:SELECT deptno,max(avg(sal))FROM emp GROUP BY deptno;不能出现deptno
如下语法是正确的:SELECT max(avg(sal))FROM emp GROUP BY deptno;
23.子查询中
>ANY 比里面的最小值大
=ANY 与IN用法相同 >ALL 比里面的最大值大 24.表复制 CREATE TABLE myemp AS SELECT * FROM emp;既复制表结构,又复制表内容 CREATE TABLE myemp AS SELECT * FROM emp where 1=2;后面的条件不可能成立,只复制表结构 25.Oracle 中常用的数据类型 VARCHAR、VARCHAR2 代表一个字符串,有长度限制,为255 NUMBER 分为两种 1)NUMBER(n)代表一个整数,数字的长度是n,可以使用INT 2)NUMBER(m,n)代表一个小数,小数长度为n,整数长度为m-n,可以使用FLOAT DATE 代表日期的类型,日期要按照标准的日期格式进行存放 CLOB 大对象,表示大文本数据,一般可以存放4G的文本 BLOB 大对象,表示二进制数据最大可以存放4G,例如存放歌曲、电影、图片 26.表的创建 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 27.插入数据 INSERT INTO person(pid,name,birthdate,age)VALUES('222','里斯 ',TO_DATE('1989-02-09','yyyy-mm-dd'),45); 28.更改表中数据 增加表结构:ALTER TABLE person ADD(address VARCHAR2(50)DEFAULT '暂无地址'); 修改已存在的列:ALTER TABLE person MODIFY(name VARCHAR2(40)DEFAULT '无名氏'); 29.表的重命名(只能在Oracle中使用) RENAME XXX TO XXX; 30.约束(主要分为5类) 1)主键约束 主键表示是一个唯一的标识。本身不能为空 2)唯一约束 在一个表中只允许建立一个主键约束,而其他列如果不希望重复值的话,则可以使用唯一约束 3)检查约束 检出一个列的内容是否合法 4)非空约束 5)外键约束 在两张表中进行约束的操作 删除时应该先删除子表,再删除父表 创建主键: 语法1 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 语法2: CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男',CONSTRAINT p_id PRIMARY KEY(pid)); 创建非空约束 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 创建唯一约束 语法一 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)UNIQUE NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 语法二 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男',CONSTRAINT p_name UNIQUE(name),); 创建检查约束 语法一 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL CHECK(age BETWEEN 0 AND 150),sex VARCHAR2(2)DEFAULT '男' CHECK(sex IN('男','女','中')),); 语法二 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男' ,CONSTRAINT p_age CHECK(age BETWEEN 0 AND 150),CONSTRAINT p_sex CHECK(sex IN('男','女','中'))); 创建外键约束 --person表 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); --book表 CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT b_pid_fk FOREIGN KEY(pid)REFERENCES person(pid)); 对于删除,应该先删除book表再删除person表 也可以使用级联删除,强制删除某张表 DROP TABLE person CASCADE CONSTRAINT; 设置外键约束级联删除 --person表 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); --book表 CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT b_pid_fk FOREIGN KEY(pid)REFERENCES person(pid)ON DELETE CASCADE); 31.修改约束 如果一张表已经建立完成之后,则可以为其添加约束 ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段); 关于约束名称的命名最好要统一: PRIMARY KEY :主键字段_PK UNIQUE:字段_UK CHECK:字段_CK FOREIGH KEY:父字段_子字段_FK 例如: DROP TABLE person; CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); ALTER TABLE person ADD CONSTRAINT pid_PK PRIMARY KEY(pid); ALTER TABLE person ADD CONSTRAINT name_UK UNIQUE(name); ALTER TABLE person ADD CONSTRAINT age_CK CHECK(age BETWEEN 1 AND 150);CREATE TABLE book(bid NUMBER ,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18)); ALTER TABLE book ADD CONSTRAINT book_PK PRIMARY KEY(bid); ALTER TABLE book ADD CONSTRAINT pid_FK FOREIGN KEY(pid)REFERENCES person(pid);删除约束 ALTER TABLE person DROP CONSTRAINT name_UK; ALTER TABLE person DROP CONSTRAINT age_CK; 数据库学习总结-Marlon 目录一、二、三、四、五、六、七、八、ORACLE_简介.............................................................................................................................................................1 ORACLE_简单查询.....................................................................................................................................................3 ORACLE标量函数和算数运算..................................................................................................................................5 ORACLE_多表查询.....................................................................................................................................................9 ORACLE_列函数和分组...........................................................................................................................................10 ORACLE_子查询.......................................................................................................................................................12 ORACLE_表的更新操作...........................................................................................................................................13 ORACLE_表与视图的管理.......................................................................................................................................15 一、ORACLE_简介 Oralce数据库发展 Oracle 8 Oracle 8i:i表示internet,标识着Oracle公司正式进军互联网。Oracle9i Oracle10g:g表示grid,即网络技术。Oracle11g Oracle体系结构一 物理结构: 文件系统 控制文件 数据文件 日志文件 参数文件(不是数据库的组成成分) Oracel体系结构三 逻辑结构: block 快 extent 盘区 segment 段 tablespace 表空间 datafile 数据文件 SQL * Plus下的常用命令 连接到SQL*PLUS sqlplus user/password[as sysdaba|sysoper] sqlplus/nolog 启动数据库 startup mount 启动实例,打开控制文件,但不打开数据文件 startup nomount 只启动实例 关闭数据库 shutdown immediate 迫使每个用户执行为当前的SQL语句,立即断开连接 shutdown transactional 迫使用户执行完当前事务时,断开连接 shutdown abort 强制关闭数据库 常用SQL命令 show user:查看当前连接的用户 connect scott/tiger: 采用scott的用户名/tiger的密码连接数据库 desc table_name:查看tableName表结构 quit|exit:退出 disconnect:断开连接 clear screen:清屏,相当于Windows下的cls命令 select * from tab:列出当前用户下的所有表 @pata 执行pata制定的脚本文件 Oracle常用基本数据类型 varchar2/varchar:变成字符串 char:定长字符串 Integer:整型 number(m,n):数字型 smallint:短整型 float:浮点数 decimal:十进制数字(小数)date:日期型 二、ORACLE_简单查询 SQL结构化查询语言(Structured Query Language) SQL分类 1.数据定义语言(Data Definition Language,DDL):create、alter、drop。 create table 表名;alter table add 新列名 数据类型;drop table 表名;2.数据操纵语言(Data Manipulation Language,DML):insert、update、delete、select。Insert into 表名(字段1,字段2…)values(值1,值2…);update student set sage=22 where sno='200215';(将学生200215的年龄改为22岁)select distinct job from emp;去除重复行 3.数据控制语言(Data Control Language,DCL):commit work、rollback work。 查询雇员的所有信息 select * from emp; *表示所有列 查询语句的格式 select *|列名 from 表名 查询雇员的编号,姓名,工资 select * from empno,ename,sal from emp; 查询所有职位 select job from emp;select distinct job from emp;distinct: 有区别的(去除重复行) 查询工资大于1500的雇员信息,列出编号,用户名,工资 select empno,ename,sal from emp where sal>1500; 带有where条件查询语句的基本格式 select *|列名 from 表名 where 条件; 比较运算符 大于:> 小于:< 等于:= 大于等于:>= 小于等于:<= 不等于:!=或者<> 限定查询 is null 和 is not null 的使用 查询每月可以得到奖金的雇员 select empno,ename,comm from emp where comm is not null; select empno,ename,comm from emp where comm is not null and comm>0; 查询谁没有奖金 select empno,ename from emp where comm is null; 限定查询 and 的使用 查询工资大于1500,并且可以领取奖金的雇员 SQL> select empno,ename,sal,comm from emp where comm is not null and sal>1500; 限定查询 or 的使用 查询工资大于1500和可以领取奖金的雇员 select empno,ename,sal,comm from emp where sal>1500 or comm is not null; 查询没有奖金的雇员 select empno,ename,comm from emp where comm=0 or comm is null; 限定查询 使用not对条件整体取反 查询工资不大于1500并且不能领取奖金的雇员 select empno,ename,sal,comm from emp where sal<=1500 and(comm is null or comm=0);select empno,ename,sal,comm from emp where not(sal>1500 or comm is not null); 限定查询 between...and...的使用 查询基本工资大于等于1500并且小于等于3000的雇员 select empno,ename,sal from emp where sal>=1500 and sal<=3000;select empno,ename,sal from emp where sal between 1500 and 3000; 查询1981年雇佣的所有员工 select empno,ename,hiredate from emp where hiredate between'1-1月 1981' and '31-12月 1981';注:日期格式 日-月 年,要匹配上 限定查询 字符串的比较 查询姓名是'SMITH'员工的所有信息 select * from emp where ename='SMITH';select * from emp where ename='smith';注:列值区分大小写 限定查询 in的使用 查询出编号7369,7499,7521的雇员的具体信息 select * from emp where empno=7369 or empno=7499 or empno=7521;select * from emp where empno in(7369,7499,7521); 限定查询 not in的使用 查询出雇员编号不是369,7499,7521的雇员的具体信息 select * from emp where empno not in(7369,7499,7521); 限定查询 like的使用 查询雇员的名字第二个字符是M的雇员信息 select * from emp where ename like'_M%';注:_匹配一个字符,%匹配0个多个字母(前缀或后缀的代表) 查询1982年入职的所有雇员的信息 select * from emp where hiredate like'%82'; 查询工资中包含5的雇员信息 select * from emp sal where like'%5%'; 对结果排序-Oracle By 查询员工工资大于1500员工的信息,按工资排序 select * from emp where sal>1500 order by sal; 查询工资大于1500员工的信息,按工资降序,按雇佣日期升序排序 select * from emp where sal>1500 order by sal desc,hiredate asc;注:ASC升序,DESC降序,默认ASC。 ascending [ə'sendiŋ]上升的,降序排列(descend [di'send] 的缩写); 三、ORACLE标量函数和算数运算 字符函数的使用 转换为大写字母 select upper('smith')from dual;注:dual是公共表。upper ['?p?] 上面的,上部的 转换为小写字母 select lower('SMITH')from dual;注:lower 放下 每个单词的字母变成大写,其余字母小写 select initcap('hello world')from dual 串连接(concat):可以使用“||”进行串连接 select concat('HELLO','WORLD')from dual;select 'HELLO'||'WORLD' from dual; 求子串(SUBSTR)select substr(ename,1,3)from emp;注:含义为截取ename字段从第一个字符开始,总共三个字符 求长度(LENGTH)select length(ename)from emp; 串替换(REPLACE)select replace('HELLO WORLD','WOR','WEL')from dual;结果: REPLACE('HE-----------HELLO WELLD 注:第一个逗号是原字符,第二个逗号是原字符的一部分,第三部分是替换原字符那个部分。 要求显示所有雇员的姓名和姓名的后三个字符 select ename,substr(ename,length(ename)-2)from emp;select ename,substr(ename,-3)from emp; 四舍五入(Round)select round(789.536)from dual;ROUND(789.536)-------------- 790 四舍五入(Round):指定保留小数位数 select round(789.536,2)from dual;---------------- 789.54 四舍五入(Round):对整数四舍五入 select round(789.536,-2)from dual;ROUND(789.536,-2)----------------- 800 截断小数位(TRUNC)select trunc(789.536)from dual;TRUNC(789.536)-------------- 789 截断小数位(TRUNC):指定保留小数位 select trunc(789.536,2)from dual;TRUNC(789.536,2)---------------- 789.53 截断小数位(TRUNC):对整数截断 select trunc(789.536,-2)from dual;TRUNC(789.536,-2)----------------- 700 除空格(TRIM) SQL> SELECT TRIM(55)FROM DUAL;TRIM(55)--------55 取余数(MOD)select mod(10,3)from dual; 日期函数 运算规律: 日期+数字=日期 日期-数字=日期 日期-日期=数字(天数) 查询当前日期 select sysdate from dual;SYSDATE-------------10-3月-12 显示10部门员工进入公司的星期数 select empno,ename,round((sysdate-hiredate)/7)from emp where deptno=10; 在指定日期上加入指定的月数之后的日期(ADD_MONTHS)select add_months(sysdate,4)from dual;ADD_MONTHS(SYS--------------10-7月-12 求出给定日期范围的月数(months_between)select empno,ename,months_between(sysdate,hiredate)from emp; 下一个给定的星期是那个日期(next_day)select next_day(sysdate,'星期一')from dual;注:表示在当前时间的前提下,下个礼拜一的具体日期 求出给定日期所在月份的最后一天日期(last_day)select last_day(sysdate)from dual; 转换成字符串(to_char)查询雇员号,姓名,以及入职的年份 select empno,ename,to_char(hiredate,'yyyy')from emp;注:yyyy匹配年份,mm匹配月份,dd匹配日 使用to_char设置日期的显示格式 select empno,ename,to_char(hiredate,'yyyy-mm-dd')from emp; 使用fm去掉前导0 select empno,ename,to_char(hiredate,'fmyyyy-mm-dd')from emp;EMPNO ENAME TO_CHAR(HI-------------------------- 7369 SMITH 1980-12-17 7499 ALLEN 1981-2-20 注:正常的值是1981-02-20,02前面的0去掉,变成了1981-2-20. 通过to_char设置数值的格式 select empno,ename,to_char(sal,'99,999')from emp;说明:9代表1位数字 EMPNO ENAME TO_CHAR--------------------------- 7369 SMITH 800 7499 ALLEN 1,600 7521 WARD 1,250 注:把sal的值分成两个部分,后三位为一个部分,前两位为一个部分,用逗号隔开。 显示余额 select empno,ename,to_char(sal,'$99,999')from emp;说明:$代表美元 转换成数字(to_number)select to_number('123')+to_number('123')from dual;TO_NUMBER('123')+TO_NUMBER('123')-- 246 转换成日期(to_date)select to_date('2009-07-31','yyyy-mm-dd')from dual;TO_DATE('2009---------------31-7月-09 算数运算 查询每个员工的年收入 select empno,ename,(sal+comm)*12 from emp;年收入=工资+奖金 查询每个员工的年收入 select empno,ename,(sal+comm)*12 income from emp; 查询每个员工的年收入 select empno,ename,(sal+NVL(comm,0))*12 income from emp;注:NVL(comm,0),当comm的值为null时,用0替换 ORACLE_多表查询 格式: select 列名1 别名1,......from 表名1,表名2,......where 条件 order by 列名 查询员工的编号,姓名,部门编号,部门名称 select empno,ename,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno; 关联查询-为表命别名 查询员工的编号,姓名,部门编号,部门名称 select empno,ename,e.deptno,dname from emp e,dept d where d.deptno=e.deptno;注:这里的e是emp的别名,d是dept的别名 关联查询-自连接 查询出每个雇员的姓名、工作、雇员的直接上级领导的姓名 select e.empno,e.ename,e.job,m.ename mname from emp e,emp m where e.mgr=m.empno;注:mname是m.ename的别名 关联查询-多表关联 四、 查询出每个雇员的姓名,工作,雇员的直接上级领导,以及部门名称 select e.ename,e.job,m.ename,d.dname from emp e,dept d,emp m where e.mgr=m.empno and e.deptno=d.deptno;注:当查询的字段间的关系涉及到n个表时,则n个表之间关联。 左、右外连接 查询员工编号,姓名,所在部门号,部门名称,将没有员工的部门也显示出来 select e.ename,d.deptno,d.dname from emp e,dept d where e.deptno(+)=d.deptno;注:(+)在左边,表示右连接,会列出所有右表中出现但是没有在左表中出现的行。 查询雇员的编号,姓名及其领导的编号,将没有领导的员工也列出来 select e.empno,e.ename,m.empno,m.ename from emp e,emp m where e.mgr=m.empno(+);注:(+)在右边表示左连接,会列出左表中出现但没有在右表中出现的行。 交叉连接(cross join):用来长生笛卡尔积 select * from emp cross join dept; 自然连接(nutural join):自动进行关联字段的匹配 select * from emp natural join dept; using子句:直接指定操作关联列 select * from emp join dept using(deptno) on子句:用户自己编写连接条件 select * from emp join dept on emp.deptno=dept.deptno; left join:左外连接 right join:右外连接 五、ORACLE_列函数和分组 常用的列函数 sum(expression)求和 max(expression)求最大值 min(expression)求最小值 avg(expression)求平均数 count(expression)统计记录数 count(distinct colname)统计去除重复行记录数 nvl(comm,0)当comm为null时,用0替换 列函数的使用 查询员工的记录数,员工工资的总和,平均工资,最高工资,最低工资 select count(*)count_emp,sum(sal)sum_sal, max(sal)max_sal,min(sal)min_sal, avg(sal)avg_sal from emp; 列函数的使用-对null的处理 查询所有员工的年收入 select sum(sal+comm)from emp;SUM(SAL+COMM)------------- 7800 注:当comm为null时,sal+comm是没有结果值的 select sum(sal)+sum(comm)from emp;SUM(SAL)+SUM(COMM)------------------ 31225 select sum(sal+nvl(comm,0))from emp;SUM(SAL+NVL(COMM,0))-------------------- 31225 分组查询 语法格式 select 列名...,列函数 from 表名...where 条件...group by 列名...order by 列名... 查询每个部门的人数 select deptno,count(*)from emp group by deptno;规则:如果在select字句中,有不在列函数中的列,则该列一定要出现在group by之后。 分组查询having字句的使用 显示出平均工资大于2000的部门编号和平均工资 select deptno,avg(sal)from emp group by deptno having avg(sal)>2000; SQL语句的书写顺序 select 列名,列函数 from 表名 where 条件 group by列名 having 条件 order by 列名 SQL语句的执行顺序 from where group by having select order by 查询20,30部门的平均工资,并将平均工资大于2000的输出,输出结果按平均工资排序 select deptno,avg(sal)from emp where deptno in(20,30)group by deptno having avg(sal)>2000 order by avg(sal); 六、ORACLE_子查询 在where子句中使用子查询 查询工资比7654雇员工资高的全部雇员信息 select * from emp where sal>(select sal from emp where empno=7654);子查询-in的使用 查询和smith或jones在同一部门,同一职位工作的员工 select ename from emp where(deptno,job)in(select deptno,job from emp where ename in('SMITH','JONES')); 子查询-any的使用 =any:与in操作符的效果一致 查询和smith或jones在同一部门,同一职位工作的员工 select ename from emp where(deptno,job)=any(select deptno,job from emp where ename in('SMITH','JONES')); >any:只要大于子查询中的任何一个值即可 select * from emp where sal>any(select min(sal)from emp group by deptno); select empno from emp where sal 子查询all的使用 >all:比最大的值大 select * from emp where sal>all (select min(sal)from emp group by deptno);注:select min(sal)from emp group by deptno结果为 MIN(SAL)---------- 950 800 1300 是每个部门当中的最少工资。 七、ORACLE_表的更新操作 创建表副本 create table myemp as select * from emp; 插入 到表中 insert的语法 insert into 表名(字段名1,字段名2,......)values(值1,值2......) 为myemp中增加一条记录 insert into myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values(7899,'张三','清洁工','7369','14-2月-2005',9000,300,40);注:给定的值要和指定的字段数一致。 1.如果全部字段都插入值的话,那字段名可以省略。即: insert into 表名 values(值1,值2,.......);2.如果只是部分字段插入值的话,字段名又想省略的话,那么,其余没有数据插入的字段用null填补。 to_date:字符型转换成日期型 批量插入记录 格式: insert into 表名 select 字段列表 from 表名 where 条件 注:insert表和select表列数等都一致 例如: create table test as select * from emp;insert into test select * from emp; 修改记录 update表名set要修改的字段=新值,要修改的字段=新值,...where条件 将雇员号为7896的雇员的奖金修改为100 update myemp set comm=100 where empno=7896;注:执行修改操作时,一定要使用where来指定修改的条件,否则会改变表中的所有记录。 删除记录 delete from 表名 where 条件 删除雇员编号为7896的雇员信息 delete from myemp where empno=7896;注:执行delete操作时,一定要使用where来指定修改的条件,否则会删除表中所有的记录。 Oralce的事务处理 commit:提交事务 rollback:回滚操作 注:操作一旦执行了commit操作,就再也不能回滚操作了。 八、ORACLE_表与视图的管理 oracle中的常见数据类型 varchar、varchar2:表示一个字符串,有长度限制,为255 number: number(n):表示一个整数,数字的长度是n,可以使用int number(n,m):表示一个小数,数字的长度为n,整数长度m-n,可以使用float date:表示日期类型,日期要按照标准格式日期存放。clob:大对象,表示大文本数据类型,可存放4G。 blob:大对象,表示二进制数据,最大可以存放4G,如电影,图片、歌曲 创建表 语法: create table 表名(字段名称1 字段类型[default 默认值], 字段名称1 字段类型[default 默认值],............字段名称1 字段类型[default 默认值],); 复制表 create table 表名 as(子查询);注:当子查询不成立时,如果1=2,则只复制表的结果,不复制表的数据。 删除表 语法: drop table 表名; 修改表结构 增加一列 alter table 表名 add(列名称 列数据类型 default 默认值) 删除列 alter table 表名 drop column 列名称; 修改列的数据类型 alter table 表名称 modify(列的名称 列的类型 default 默认值);注:1.如果是更改数据的长度,则要求更改时,长度不能小于当前表中数据所具有的最大长度。 2.如果是更改数据类型,则要求更改时,该列的所有记录值都为空。 修改表结构 为表重命名 rename 旧表名 to 新表名;注:这是oracle特有的操作 将myemp表改名为iemp SQL> rename myemp to iemp;表已重命名。 截断表 truncate table 表名;意义:清空表中的所有数据,并且立即释放资源,该操作是不可回滚。 约束-约束的分类 主键约束:表示一个唯一的标识,本身不能为空 唯一约束:列值不允许重复 检查约束:检查一个列的内容是否合法 非空约束:不能为空值,如用户不能为空(no null)外键约束:在两张表中进行约束的操作 主键约束(primary key)主键约束一般在id上使用,而且本身已经默认了不能为空,主键约束可以在建表的时候指定 create table person(pid varchar2(18)primary key, name varchar(30), age number(3), sex varchar2(2)default'男'); 使用constraint指定 constraint [kən'streint] 约束;强制 create table person(pid varchar2(18), name varchar(30), age number(3), sex varchar2(2)default'男' constraint person_pid_pk primary key(pid);); 非空约束(not null)create table person(pid varchar2(18)primary key, name varchar(30)not null, age number(3), sex varchar2(2)default'男'); 唯一约束(unique)create table person(pid varchar2(18)primary key, name varchar(30)unique not null, age number(3), sex varchar2(2)default'男'); 视图 概念:一个视图实质是封装了一条复杂的SQL语句 创建视图 语法: create view 视图名称 as 子查询 创建部门20员工的雇员信息 create view empv20 as select * from emp where deptno=20;注:当创建视图以后,可以像操作表一样操作视图。注:视图的操作会影响到表的操作。 with check option 不能更新创建视图的条件 with read only 创建只读视图 删除视图 语法: drop view 视图名称 注:当删除视图所在的表时,则视图也不能被使用 序列 创建序列语法:sequence ['si:kwəns] create sequence 序列名称;create sequence myseq;序列的操作: nextval:取得序列的下一个内容 currval:取得当前序列的内容 创建表验证序列的操作 create table testseq(next number,curr number);insert into testseq values(myseq.currval,myseq.nextval); 创建序列指定每次增长的增量 create sequence myseq increment by 2;注:每次增长2 创建序列指定开始的序列,默认的序列从1开始。create sequence myseq increment by 2 start with 10;注:序列从10开始,每次增长2 创建一个序列1,3,5,7,9.create sequence myseq maxvalue 9 increment by 2 start with 1 cache 2 cycle;注:序列从1开始,每次增长2,最大值为9,循环两次。 中南林业科技大学 实验报告 课程名称: Oracle数据库 专业班级: 姓名: 学号: ****年**月**日 实验一 安装和使用Oracle数据库 【实验目的】 1.掌握Oracle软件安装过程,选择安装组件 2.掌握建立Oracle数据库,配置网络连接 3.掌握Oracle企业管理器的基本操作 4.使用SQL*Plus,登录到实例和数据库 5.掌握命令方式的关闭和启动实例及数据库 【实验内容】 1.查看已安装的Oracle组件 2.查看服务,记录下和数据库有关的服务名,将他们设为手动方式,启动相关服务。 3.配置监听器,查看是否在服务中有LISTENER,是否能启动。4.配置本地net服务,提示:设置正确的服务器地址和端口号。5.打开SQL*Plus,用SYS和SYSTEM用户名和密码登录。6.思考题:有几种打开SQL*Plus的方法?分别是什么? 7.用命令关闭实例和数据库,记录命令 8.用命令以NOMOUNT的方式启动实例,再加载数据库,打开数据库。 【实验结论】 1.查看已安装的Oracle组件 2.查看服务,记录下和数据库有关的服务名,将他们设为手动方式,启动相关服务。 3.配置监听器,查看是否在服务中有LISTENER,是否能启动。 4.配置本地net服务,提示:设置正确的服务器地址和端口号。 5.打开SQL*Plus,用SYS和SYSTEM用户名和密码登录。 6.思考题:有几种打开SQL*Plus的方法?分别是什么?(1)直接打开 sql plus 即窗口方式(2)cmd 命令行方式 (3)WEB 页面中 iSQL*Plus 方式 7.用命令关闭实例和数据库,记录命令 SQL>shutdown immediate 8.用命令以NOMOUNT的方式启动实例,再加载数据库,打开数据库。 sql>startup nomount sql>alter database mount;sql>alter database open;sql>startup (1).用SQLplus 命令:show parameters参数名 (2).用select [列名] from 表名 2.初始化文件有几种?默认的保存位置在哪里? 初始化文件有三种:数据文件,日志文件,控制文件; 默认的保存位置E:oracleproduct10.2.0oradataorcl 4.打开OEM,查看三类物理文件信息 三类物理文件:数据文件、控制文件、日志文件 数据文件:.DBF存储表、索引及数据结构信息 日志文件:.LOG记录对数据库的所有修改信息,用于恢复 控制文件:.CTL二进制文件,记录数据库名、文件标识、检查点 5.分别用select命令查询V$parameter动态性能视图,用show命令查看全局数据库名、实例名、是否启动自动归档、标准数据块大小这四个参数的值,记录命令和结果。用select命令查询V$parameter动态性能视图 用show命令查看全局数据库名、实例名 用show命令查看是否启动自动归档、标准数据块大小 6.如何用命令查看数据文件、控制文件的文件名、存储位置和状态信息? (1).查看数据文件的文件名、存储位置和状态信息 (2).查看控制文件的文件名、存储位置和状态信息 0 和服务器型文件都要找到),查看各类默认位置并记录下来(包括物理文件所在目录,该数据库相关的各个目录等),登录到mydb数据库。 2.用命令方式手工创建数据库testorcl (1)创建批处理文件,建立必需的各级目录,参考第一题MYDB数据库的默认目录。 (4)运行数据库建立脚本,更改相关服务为手动启动方式 (5)运行数据字典等创建脚本 3.在DBCA中删除MYDB数据库。 Enter valuefor 4:runner Specify log path as parameter 5: Enter valuefor 5: D:oracleproduct10.2.0db_2RDBMSlog 二、完成下面的查询,记录查询命令和结果。1.查询HR方案种有哪些表,列出表名 2.设置行宽为160,每页行数为40 3.查询employees表中所有薪水在3000到6000元之间的员工编号、姓、名、受聘日期、工作代号、薪水、经理代号、部门号,按部门号升序排列,同一部门按员工编号降序排列 4.查询每个部门的人数、平均薪水、最高薪水、最低薪水,按部门编号升序排列 5.查询first_name的第三个字母是t的员工编号,first_name,电话号码,部门编号,部门名称 6.在job_history表中查询任职时间超过1年的员工编号,任职历时月份(保留整数),工作代号,部门代号。 7.查询每个部门经理的员工编号、姓名、薪水、部门号。 【实验结论】 一、需要访问HR示例方案中的表,如果机器上没有该示例方案,则运行相关包和相应配置装入HR方案。 1.将hr.rar解压到D:oracleproduct10.2.0db_2demoschema human_resources目录下,然后在SQL*PLUS 中执行 hr_main.sql 二、完成下面的查询,记录查询命令和结果。1.查询HR方案种有哪些表,列出表名 5.查询first_name的第三个字母是t的员工编号,first_name,电话号码,部门编号,部门名称 738 实验五 PL/SQL编程 【实验目的】 1.熟悉PL/SQL的数据类型和书写规则 2.熟悉控制结构和游标的使用 3.编写和运行函数、过程和触发器 【实验内容】 编写脚本文件,调试运行脚本文件,并记录结果。 1.在SQL*Plus中编写一个PL/SQL块,功能用于打印学生信息 在DECLARE部分完成: (2)建立学生信息记录类型stu_record_type,包括学号,姓名,性别,籍贯,学习成绩和活动成绩。均为可变长字符类型(3)编写本地子过程:学生信息打印过程PrintStuRecord,把(1)中定义的记录类型作为参数(4)定义学生信息记录变量stu_record 在BEGIN…END部分完成: (1)为stu_record变量的各个元素赋值如下: 学号:‘2001001’ 姓名:’李新’ 性别:‘m’ 籍贯:‘黑龙江省哈尔滨市’ 学习成绩:‘Excellent’ 0 (1)建立学生信息记录类型stu_record_type,包括学号,姓名,性别,籍贯,学习成绩和活动成绩。均为可变长字符类型 set serveroutput on declare type stu_record_type is record (s_no varchar2(8), s_name varchar2(10), s_sex varchar2(2), s_address varchar2(20), s_studyscore varchar2(10), s_activescore varchar2(10));(2)编写本地子过程:学生信息打印过程PrintStuRecord,把中定义的记录类型作为参数 procedure PrintStuRecord as begin dbms_output.put_line('学号:'|| stu_record.s_no);dbms_output.put_line('姓名 :'|| stu_record.s_name);dbms_output.put_line('性别:'|| stu_record.s_sex);dbms_output.put_line('籍贯:'|| stu_record.s_address);dbms_output.put_line('学习成绩:'|| stu_record.s_studyscore);dbms_output.put_line('活动成绩:'|| stu_record.s_activescore);end PrintStuRecord;(3)定义学生信息记录变量stu_record stu_record stu_record_type;在BEGIN…END部分完成: (4)为stu_record变量的各个元素赋值如下: 学号:‘2001001’ 姓名:’李新’ 性别:‘m’ 籍贯:‘黑龙江省哈尔滨市’ 2.建立对bookinfo表的DML触发器,一旦bookinfo表发生了任何变化,立即触发,对bookinfo表的数据进行统计,结果存储在数据统计表中 (1)如果没有则建立bookinfo表,选择建立在scott用户下,表结构为(bookno varchar2(36)Primary key, bookname varchar2(40)not null, authorname varchar2(10)not null, publishtime date, bookprice float) create table bookinfo(bookno varchar2(36)Primary key,4 Selectcount(bookno),count(distinct authorname)from bookinfo;end;/ (4)在bookinfo表中插入、删除和更新信息,再查看major_stats表中数据的变化 <1>插入 647 实验六 模式对象管理与安全管理 【实验目的】 1.了解模式对象的类型 2.掌握在OEM中操作模式对象的方法 3.掌握命令方式建立表、视图、索引等常见对象的方法 4.熟悉Oracle中权限分类和设置,理解系统提供用户的角色和权限 5.熟练使用建立用户、角色,为用户授权、授予角色的命令 【实验内容】 1.创建一个TESTUSET用户,密码为test,默认表空间为user表空间 2.创建用户后为其授予登录数据库和创建数据库对象的权限 3.用TESTUSER用户登录数据库 4.创建学生信息表(学号,姓名,性别,入学成绩),定义主键和输入数据(至少5条数据),提交添加的数据。并完成下面的题目: (1)再继续添加2条数据,设置一个保存点savepoint,再添加1条数据,执行回退到保存点的回退命令。查看此时表中数据(2)查询入学成绩大于480的学生信息(3)建立男生信息视图 (4)在“成绩”字段上建立B-树索引 5.创建一个表簇,名为empl_dep,容纳empl表和dep表,有公第四篇:ORACLE数据库学习总结
第五篇:Oracle数据库实验报告