55
Oracle8i Oracle8i 培培培培 培培培培

Oracle8i 培训课程

Embed Size (px)

DESCRIPTION

Oracle8i 培训课程. 自我介绍. 姓名:郭福仁 电话: 7378980. ORACLE 介绍. - PowerPoint PPT Presentation

Citation preview

Page 1: Oracle8i 培训课程

Oracle8iOracle8i 培训课程培训课程

Page 2: Oracle8i 培训课程

自我介绍自我介绍 姓名:郭福仁姓名:郭福仁 电话:电话: 73789807378980

Page 3: Oracle8i 培训课程

ORACLEORACLE 介绍介绍 ORACLEORACLE 公司自公司自 8686 年推出版本年推出版本 55 开始开始 ,, 系统具有分布数系统具有分布数

据库处理功能据库处理功能 .88.88 年推出版本年推出版本 6,ORACLE RDBMS(V6.0)6,ORACLE RDBMS(V6.0)可带事务处理选项可带事务处理选项 (TPO),(TPO), 提高了事务处理的速度提高了事务处理的速度 .1992.1992年推出了版本年推出了版本 7,7, 在在 ORACLE RDBMSORACLE RDBMS 中可带过程数据库中可带过程数据库选项选项 (procedural database option)(procedural database option) 和并行服务器选项和并行服务器选项(( parallel server optionparallel server option )) ,1996,1996 年推出年推出 ORACLE8.0.ORACLE8.0.66 增加了表分区的功能,增加了表分区的功能, 19981998 年推出了年推出了 ORACLE8IORACLE8I ,增,增加了对数据库的增强性管理、一起在数据库中存储对象等,加了对数据库的增强性管理、一起在数据库中存储对象等,20002000 年,推出了年,推出了 ORACLE9IORACLE9I ,使数据库的操作更加的简,使数据库的操作更加的简便,而且取消的便,而且取消的 SVRMGRLSVRMGRL 、、 INTERNALINTERNAL 的,增强的的,增强的数据的安全,同时,能够对数据库的权限细分到数据的安全,同时,能够对数据库的权限细分到 ROWROW 的的级别,对数据库有着更好的控制,而且起主要面向级别,对数据库有着更好的控制,而且起主要面向 WWWWWW 的应用,数据库功能得到非常强大的更新。的应用,数据库功能得到非常强大的更新。

Page 4: Oracle8i 培训课程

ORACLEORACLE 的物理结构的物理结构 ORACLEORACLE 的物理结构主要是有以下的数据文的物理结构主要是有以下的数据文

件组成:件组成:

数据文件组成

参数文件Init.ora

控制文件Control01.ctlControl02.ctlControl03.ctl

日志文件Redo01.logRedo02.logRedo03.log

系统文件System01.dbfTemp01.dbfRbs01.dbf

数据文件Users01.dbfIndx01.dbf

Page 5: Oracle8i 培训课程

ORACLEORACLE 的物理结构介绍的物理结构介绍 Init.oraInit.ora 参数文件:存放数据库名称及内存参数设置的初参数文件:存放数据库名称及内存参数设置的初

始化文件、数据块的大小;始化文件、数据块的大小; 控制文件:存放数据库状态的文件,例如:数据文件当前控制文件:存放数据库状态的文件,例如:数据文件当前

是否是否 onlineonline 或者或者 offlineoffline ,参数和数据文件的的存放的,参数和数据文件的的存放的地方等;地方等;

系统文件:系统文件: system01.dbfsystem01.dbf 主要存放数据字典;主要存放数据字典; rbs01.drbs01.dbfbf 数据库的回滚段文件;数据库的回滚段文件; temp01.dbftemp01.dbf 数据库的临时段文数据库的临时段文件件

数据文件:数据文件: user01.dbfuser01.dbf 、、 indx01.dbfindx01.dbf 多是数据文件,多是数据文件,主要存放用户的数据,如果你新增加数据库文件,可以取主要存放用户的数据,如果你新增加数据库文件,可以取自己的名称,如:自己的名称,如: train01.dbftrain01.dbf

密码文件:主要用语密码文件:主要用语 internalinternal 用户的初始密码;默认的用户的初始密码;默认的密码是密码是 oracleoracle ,可以通过,可以通过 orapwdorapwd 来修改;来修改;

Page 6: Oracle8i 培训课程

ORACLEORACLE 的逻辑结构的逻辑结构 逻辑结构图:逻辑结构图:

PMON进程监控

SMON系统监控

DBWR数据库读写

LGWR日志读写

CHPT检查点进程

LCKnnn锁进程

RECO恢复进程

SNPnnn工作进程

数据字典区

SQL 缓冲区

Data_Buffer数据缓冲区

Log_Buffer日志缓冲区

ARCH工作进程

Page 7: Oracle8i 培训课程

ORACLEORACLE 的逻辑介绍的逻辑介绍 字典缓冲区:主要存放数据库操作中的数据字典字典缓冲区:主要存放数据库操作中的数据字典

数据,如:表名、列名、存储过程名、函数名、数据,如:表名、列名、存储过程名、函数名、视图名、序列名等;视图名、序列名等;

SQLSQL 缓冲区:存放当前执行的缓冲区:存放当前执行的 SQLSQL 语句、语句、 p-codp-codee 代码、代码、 SQLSQL 语句的执行树等;语句的执行树等;

数据缓冲区:存放从文件中读取的数据、用户操数据缓冲区:存放从文件中读取的数据、用户操作写入数据库的数据,按作写入数据库的数据,按 LRULRU 算法存放(访问最算法存放(访问最频繁的数据放在缓冲区,最少访问的在 队列的后频繁的数据放在缓冲区,最少访问的在 队列的后面,如果缓冲去够,最少访问的将被丢弃)面,如果缓冲去够,最少访问的将被丢弃)

日志缓冲区:一旦用户对数据库进行操作,将产日志缓冲区:一旦用户对数据库进行操作,将产生事务生事务 (transaction)(transaction)

Page 8: Oracle8i 培训课程

ORACLEORACLE 的逻辑结构的逻辑结构 PMONPMON :进程监视器,主要监控其它的进程的运行状态,如果发现:进程监视器,主要监控其它的进程的运行状态,如果发现

有进程失败,将重新启动;有进程失败,将重新启动; SMONSMON :系统事务监控器,主要保证数据库的完整性,保证事务的:系统事务监控器,主要保证数据库的完整性,保证事务的

正常;正常; DBWRDBWR :数据的读写进程,将:数据的读写进程,将 data_bufferdata_buffer 中的数据写入文件或者中的数据写入文件或者

读取数据文件;读取数据文件; LGWRLGWR :日志的读写器,将日志写入数据库;:日志的读写器,将日志写入数据库; CHPTCHPT :检查点进程,触发:检查点进程,触发 DBWRDBWR 的写入数据文件中;的写入数据文件中; LCKLCKnnnnnn :锁进程,数据库锁的管理进程,主要是管理数据库的锁;:锁进程,数据库锁的管理进程,主要是管理数据库的锁; RECORECO :恢复进程,在数据库启动或者数据库恢复的时候,负责恢复:恢复进程,在数据库启动或者数据库恢复的时候,负责恢复

数据库;数据库; SNPSNPnnn:nnn: 数据库的工作进程,如果数据库中有任务,将通过该进程数据库的工作进程,如果数据库中有任务,将通过该进程

进行运行进行运行

Page 9: Oracle8i 培训课程

OracleOracle 的网络结构的网络结构 网络架构图:网络架构图:

客户机

客户机

Net 8

Net 8

网络 LISNERTER数据库监听器

数据库主机

数据数据

数据

数据

数据

数据

数据

Page 10: Oracle8i 培训课程

oracleoracle 的网络结构图说明的网络结构图说明 客户机客户机 :: 主要是不是数据库的应用主要是不是数据库的应用 ,, 如如 :SQL*PLUS:SQL*PLUS 、、

应用程序等;应用程序等; NET8NET8 :是:是 ORACLEORACLE 数据库的组件,作为数据库数据库的组件,作为数据库

的客户端的连接器;的客户端的连接器; 网络:可以是局域网、网络:可以是局域网、 INTERNETINTERNET 、、 DCNDCN 专线专线

网网 ;; ListenerListener :数据库的监听器,主要监听、接受来自:数据库的监听器,主要监听、接受来自

客户端的连接;客户端的连接; 数据库主机:安装数据库的服务器,处理用户的确数据库主机:安装数据库的服务器,处理用户的确

请求;请求; 数据文件:存储用户的数据;数据文件:存储用户的数据;

Page 11: Oracle8i 培训课程

SQL*PLUSSQL*PLUS 介绍介绍 Col column format a20 Col column format a20 ->-> 字符格式化显示字符格式化显示 ;; Col column format 099999->Col column format 099999-> 数字格式化显示数字格式化显示 ;; Edit [filename]Edit [filename] ->-> 编辑当前的脚本或者指定一个文编辑当前的脚本或者指定一个文

件的内容件的内容 ;; @/start@/start filenamefilename ->-> 执行某个文件执行某个文件 ,, 执行一个数据表脚本的时执行一个数据表脚本的时经常使用经常使用 ;;

/ / 或者或者 runrun ->-> 运行上次的语句运行上次的语句 (( 最后执行的语句最后执行的语句 );); Spool filename/spool off ->Spool filename/spool off -> 将输出到入一个指定的文件将输出到入一个指定的文件 ;; Get [filename]Get [filename] ->-> 显示某个文件的内容显示某个文件的内容 ;; Host commandHost command ->-> 执行主机的一条命令执行主机的一条命令 ;; Set linesize 100Set linesize 100 ->-> 将当行的长度设置为将当行的长度设置为 100;100; Set pagesize 200Set pagesize 200 ->-> 设置一页显示设置一页显示 200200 行记录行记录 Set pause onSet pause on ->-> 设置暂停设置暂停

Page 12: Oracle8i 培训课程

SelectSelect 语句的使用(一)语句的使用(一) 在使用在使用 SELECTSELECT 之前,你必须先明白你所要查询的表的结构;如果之前,你必须先明白你所要查询的表的结构;如果

你知道表的结构,如表明名你知道表的结构,如表明名 :emp(:emp( 用户用户 scott/tiger)scott/tiger) ,用,用 desc emp:desc emp:

SQL> desc empSQL> desc emp 名称 空名称 空 ? ? 类型类型 ----------------------------------- -------- ----------------------------------- -------- -------------------------------- EMPNO NOT NULLEMPNO NOT NULL NUMBER(4)NUMBER(4) ENAME ENAME VARCHAR2(10)VARCHAR2(10) JOB JOB VARCHAR2(9)VARCHAR2(9) MGR MGR NUMBER(4)NUMBER(4) HIREDATE HIREDATE DATEDATE SAL SAL NUMBER(7,2)NUMBER(7,2) COMM COMM NUMBER(7,2)NUMBER(7,2) DEPTNO DEPTNO NUMBER(2)NUMBER(2)

Page 13: Oracle8i 培训课程

SelectSelect 语句的使用(二)语句的使用(二) 如果你想看当前用户下面有什么表如果你想看当前用户下面有什么表 ,, 如下如下 :: SQL> select * from tab;SQL> select * from tab; TNAME TABTYPE CLUSTERIDTNAME TABTYPE CLUSTERID ---------------------------------------------------- -------------- -------------- -------------------- BONUS TABLEBONUS TABLE DEPT TABLEDEPT TABLE EMP TABLEEMP TABLE SALGRADE TABLESALGRADE TABLE

Page 14: Oracle8i 培训课程

SelectSelect 语句的格式语句的格式 Select [distinct] { *,{column [alias],….} from table_name [where column_nSelect [distinct] { *,{column [alias],….} from table_name [where column_n

ame=column_value [and ….]] [order by column_name [asc/desc]]ame=column_value [and ….]] [order by column_name [asc/desc]] DistinctDistinct 是让所有选择的列是必须唯一的是让所有选择的列是必须唯一的 ,distinct,distinct 对所有的列产生作用对所有的列产生作用 ,, 而不是第而不是第

一个列一个列 ;; 查询所有的列查询所有的列 ,, 用用 select * from emp,select * from emp, 将将 empemp 表中的数据完全的选择出来表中的数据完全的选择出来 ;; 如如 :: SQL> select * from emp;SQL> select * from emp; EMPNO ENAME JOB MGR EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTN HIREDATE SAL COMM DEPTN

OO ---------- ---------- --------- ---------- ---------- ---------- ---------- -------------------- ---------- --------- ---------- ---------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-127369 SMITH CLERK 7902 17-12月月 -80 800 20-80 800 20 7499 ALLEN SALESMAN 7698 20-27499 ALLEN SALESMAN 7698 20-2月 月 -81 1600 300 30-81 1600 300 30 7521 WARD SALESMAN 7698 22-27521 WARD SALESMAN 7698 22-2月 月 -81 1250 500 30-81 1250 500 30 7566 JONES MANAGER 7839 02-47566 JONES MANAGER 7839 02-4月 月 -81 2975 20-81 2975 20 7654 MARTIN SALESMAN 7698 28-97654 MARTIN SALESMAN 7698 28-9月 月 -81 1250 1400 30-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-57698 BLAKE MANAGER 7839 01-5月 月 -81 2850 30-81 2850 30 7782 CLARK MANAGER 7839 09-67782 CLARK MANAGER 7839 09-6月 月 -81 2450 10-81 2450 10

Page 15: Oracle8i 培训课程

SelectSelect 语句的使用(三)语句的使用(三) 在在 selectselect 中可以使用嵌套的中可以使用嵌套的 select select 语句语句 ,, 如如 :select a.* f:select a.* f

rom emp a,(select deptno from dept) b where a.deprom emp a,(select deptno from dept) b where a.deptno=b.deptno;tno=b.deptno;

当然当然 ,,也可以在也可以在 wherewhere 语句后面嵌套语句后面嵌套 select select 语句语句 ,, 如如 : s: select * from emp where deptno in (select deptno froelect * from emp where deptno in (select deptno from dept)m dept)

在在 wherewhere 语句中,如果是条件必须同时成立的话语句中,如果是条件必须同时成立的话 ,, 用用 anandd 将条件联合起来将条件联合起来 ,, 如果是几个条件中只要一个成立就可如果是几个条件中只要一个成立就可以以 ,, 用用 oror联合起来就可以联合起来就可以

用用 andand 的语句的语句 :select * from emp where id in (7499,7:select * from emp where id in (7499,7599) and deptno=10599) and deptno=10

用用 oror 的语句的语句 :select * from emp where id=7499 or de:select * from emp where id=7499 or deptno=10;ptno=10;

Page 16: Oracle8i 培训课程

SelectSelect 语句的使用(四)语句的使用(四) 以下两句语句是不一样的以下两句语句是不一样的 ,,特别需要注意特别需要注意 :: Select * from emp where deptno Select * from emp where deptno inin (select * from dept); (select * from dept); Select * from emp where deptnoSelect * from emp where deptno==(select (select max(deptno)max(deptno) from dept); from dept); InIn 和和 == 的区别是的区别是 ,, 用用 inin 语句语句 ,, 你可以返回多个值你可以返回多个值 ,, 而用而用 ==号的话号的话 ,, 你只能返回一个只你只能返回一个只 ,,

否则它会产生出错的信息否则它会产生出错的信息 ;; 我们执行我们执行 == 的语句的语句 ,, 而且将而且将 MAXMAX 函数去掉函数去掉 :: select * from emp where deptno=(select deptno from dept)select * from emp where deptno=(select deptno from dept) ** ERROR ERROR 位于第 位于第 1 1 行行 :: ORA-01427: single-row subquery returns more than one rowORA-01427: single-row subquery returns more than one row 而用而用 ININ 的语句的语句 :: SQL> Select * from emp where deptno in (select deptno from dept);SQL> Select * from emp where deptno in (select deptno from dept);

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTEMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNONO

---------- ---------- --------- ---------- ---------- ---------- ---------- -------------------- ---------- --------- ---------- ---------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-127369 SMITH CLERK 7902 17-12 月月 -80 800 20-80 800 20 7499 ALLEN SALESMAN 7698 20-27499 ALLEN SALESMAN 7698 20-2 月 月 -81 1600 300 30-81 1600 300 30 7521 WARD SALESMAN 7698 22-27521 WARD SALESMAN 7698 22-2 月 月 -81 1250 500 30-81 1250 500 30

Page 17: Oracle8i 培训课程

SelectSelect 语句的使用(五)语句的使用(五) 在在 wherewhere 语句中语句中 ,, 可以使用以下的条件函数可以使用以下的条件函数 ;; 如果你不能明确一个用户的名称如果你不能明确一个用户的名称 ,, 可以用模糊查询可以用模糊查询 ,,关键字关键字

是是 like,like, 如你不知道一个员工含有如你不知道一个员工含有 MILMIL 的字符的字符 ,, 不知道详细不知道详细的名字的名字 ,, 可以用以下模糊查询可以用以下模糊查询 ::

Select * from emp where ename like ‘%MIL%’;Select * from emp where ename like ‘%MIL%’; 如果你是要查询某一个范围内的数据如果你是要查询某一个范围内的数据 ,, 可以使用可以使用 betweenbetween

…and ……and … 如如 :: Select * from emp where empno between 7500 and 78Select * from emp where empno between 7500 and 78

00;00; 当然当然 ,, 以上语句可以使用以上语句可以使用 >= and <=>= and <= 的方式来实现的方式来实现 ;; 在列或者在在列或者在 wherewhere 语句中语句中 ,, 可以使用算术表达式可以使用算术表达式 ,, 如如 :sele:sele

ct empno,ename,comm/1024 from emp where (sal+1ct empno,ename,comm/1024 from emp where (sal+100)>1000;00)>1000;

Page 18: Oracle8i 培训课程

SelectSelect 语句的使用(六)语句的使用(六) 如果是与如果是与 NULLNULL 进行比较,不能用进行比较,不能用 == 或者或者 >> 或者或者 << 等操作符,应该用等操作符,应该用 IS NULL IS NULL 或者或者 II

S NOT NULLS NOT NULL ;; NULLNULL与别的值进行与别的值进行 ++ 、—、、—、 ** 、、 // ,都是,都是 NULLNULL ;; SQL> Select null+100 from dual;SQL> Select null+100 from dual;

NULL+100NULL+100 --------------------

SQL> select * from emp where comm=null;SQL> select * from emp where comm=null;

未选定行未选定行 SQL> select * from emp where comm is null;SQL> select * from emp where comm is null;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNOEMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ---------- ---------- ---------- --------------------------------------------- ---------- --------- ---------- ---------- ---------- ---------- ----------------------------------- 7369 SMITH CLERK 7902 17-127369 SMITH CLERK 7902 17-12 月月 -80 800 -80 800 2 2

00 7566 JONES MANAGER 7839 02-47566 JONES MANAGER 7839 02-4 月 月 -81 2975 20-81 2975 20

Page 19: Oracle8i 培训课程

SelectSelect 语句的使用(七)语句的使用(七) 在在 selectselect 语句中语句中 ,, 你可以使用你可以使用 order byorder by子句子句 ,, 主要是对主要是对

数据进行排序数据进行排序 ;; 如果没有指定按什么方式排序如果没有指定按什么方式排序 ,,那么数据库将按生序进行那么数据库将按生序进行排序排序 ;;

如果你在条件中需要不同的排序如果你在条件中需要不同的排序 ,,需要你自己特定指出需要你自己特定指出 ;; Select * from emp order by empno,deptno;Select * from emp order by empno,deptno; Select * from emp order by empno,deptno desc;Select * from emp order by empno,deptno desc; Select * from emp order by empno desc,deptno;Select * from emp order by empno desc,deptno; 第一个语句中第一个语句中 ,empno,empno 、、 deptnodeptno 将按升序排列;而第二将按升序排列;而第二个语句则是,个语句则是, empnoempno 是按升序,而是按升序,而 deptnodeptno 是按降序;是按降序;第三个语句按第三个语句按 empnoempno 是降序,而是降序,而 deptnodeptno 是升序是升序

Page 20: Oracle8i 培训课程

单行函数(一)单行函数(一) Decode Decode 对需要的值进行不同的转换,使用于范对需要的值进行不同的转换,使用于范围较小的情况;如:围较小的情况;如:

Select decode(deptno,10,’Select decode(deptno,10,’财务部’财务部’ ,20,’,20,’调调研部’研部’ ,30,’,30,’市场部’市场部’ ,’,’ 生产部’生产部’ ) from emp;) from emp;

以上的语句的意思是,如果以上的语句的意思是,如果 deptno=10deptno=10 ,则,显,则,显示为’财务部‘,如果为示为’财务部‘,如果为 2020 ,则为’调研部’,则为’调研部’ ,,如果是如果是 3030 ,则为’市场部’,则为’市场部’ ,, 如果不为如果不为 1010 、、 2020 、、3030 ,则为’生产部’,该函数类似于,则为’生产部’,该函数类似于 CC 语言中语言中 sswitchwitch ;;

DecodeDecode 的功能就是对字段进行转义的表示,这的功能就是对字段进行转义的表示,这种转义在数据迁移的时候经常使用;种转义在数据迁移的时候经常使用;

Page 21: Oracle8i 培训课程

单行函数(二)单行函数(二) NVLNVL 函数,是将如果是空值时,将该列显示成为你需要的值,函数,是将如果是空值时,将该列显示成为你需要的值, SQL>select empno,ename,sal,nvl(comm,0) from emp;SQL>select empno,ename,sal,nvl(comm,0) from emp; EMPNO ENAME SAL NVL(COMM,0)EMPNO ENAME SAL NVL(COMM,0) ----- ---------- ---------- ---------------- ---------- ---------- ----------- 7369 SMITH 800 07369 SMITH 800 0 7499 ALLEN 1600 3007499 ALLEN 1600 300 7521 WARD 1250 5007521 WARD 1250 500 7566 JONES 2975 07566 JONES 2975 0 而如果没有而如果没有 NVLNVL ,则显示为空,则显示为空 :: SQL> select empno,ename,sal,comm from emp;SQL> select empno,ename,sal,comm from emp; EMPNO ENAME SAL COMMEMPNO ENAME SAL COMM ---------- ---------- ---------- -------------------- ---------- ---------- ---------- 7369 SMITH 8007369 SMITH 800 7499 ALLEN 1600 3007499 ALLEN 1600 300 7521 WARD 1250 5007521 WARD 1250 500 7566 JONES 29757566 JONES 2975

Page 22: Oracle8i 培训课程

单行函数单行函数 Substr( v,m,n)Substr( v,m,n) 将字符串进行截取,得到需要的字符串将字符串进行截取,得到需要的字符串 ,,

对对 VV 字符串的第字符串的第 MM 开始,截取总数为开始,截取总数为 NN 的长度的长度 ;; SQL> select substr(ename,2,3) from emp;SQL> select substr(ename,2,3) from emp; SUBSTRSUBSTR ------------ MITMIT LLELLE ARDARD ONEONE ARTART 该函数主要的功能就是得到想要的字符串,在系统迁移的该函数主要的功能就是得到想要的字符串,在系统迁移的

时候也经常的使用;时候也经常的使用;

Page 23: Oracle8i 培训课程

常用单行函数常用单行函数 AbsAbs 求绝对值;求绝对值; CeilCeil 求最小的整数;求最小的整数; FloorFloor 求最大的整数;求最大的整数; Ltrim/Rtrim Ltrim/Rtrim 将字符串的空格所含的空格删除;将字符串的空格所含的空格删除; LtrimLtrim 是消左边的空格,是消左边的空格, RR

trimtrim 是消右边的空格是消右边的空格 ;(;( 该函数对于字段的数据类型为该函数对于字段的数据类型为 charchar 的很有效的很有效 );); LengthLength 求一个字符串的长度;求一个字符串的长度; LowerLower 将字符串变为小写;将字符串变为小写; UpperUpper 将字符串变为大写;将字符串变为大写; Initcap Initcap 除第一个字母大写,其余小写;除第一个字母大写,其余小写; SysdateSysdate 取系统的当前时间;取系统的当前时间; To_charTo_char将数值转换成字符;将数值转换成字符; To_char(date_v,date_format)To_char(date_v,date_format) 将日期按你指定的方式转换成字符串;将日期按你指定的方式转换成字符串; To_numberTo_number 将字符串转换为数值;将字符串转换为数值; To_date(char_v,date_format)To_date(char_v,date_format) 将字符串转换成为时期格式;将字符串转换成为时期格式; ConcatConcat |||| 将两个字符串相连接将两个字符串相连接

Page 24: Oracle8i 培训课程

常用组函数常用组函数 CountCount 求总数,对求总数,对 nullnull 的值不进行屏蔽;的值不进行屏蔽; SumSum 求综合,对求综合,对 nullnull 的值进行屏蔽;的值进行屏蔽; AvgAvg 求平均值,对求平均值,对 nullnull 的值进行屏蔽;的值进行屏蔽; MaxMax 求最大值,对求最大值,对 nullnull 的值进行屏蔽;的值进行屏蔽; MinMin 求最小值,对求最小值,对 nullnull 的值进行屏蔽;的值进行屏蔽; DistinctDistinct 可以与组合函数一起使用;可以与组合函数一起使用;

Page 25: Oracle8i 培训课程

组合函数的使用(一)组合函数的使用(一) 如果在如果在 selectselect 中,除组合函数以外,还有没有使用组合函数的列,必中,除组合函数以外,还有没有使用组合函数的列,必须使用须使用 group bygroup by ,而且列要放在组合函数的前面,而且该列必须在,而且列要放在组合函数的前面,而且该列必须在group bygroup by 的后面;的后面;

SQL> select deptno,count(*) from emp group by deptno;SQL> select deptno,count(*) from emp group by deptno; DEPTNO COUNT(*)DEPTNO COUNT(*) ---------- -------------------- ---------- 10 310 3 20 520 5 30 630 6 如果没有使用如果没有使用 group by group by ,将产生出错;,将产生出错; SQL> select deptno,count(*) from emp ;SQL> select deptno,count(*) from emp ; select deptno,count(*) from empselect deptno,count(*) from emp ** ERROR ERROR 位于第 位于第 1 1 行行 :: ORA-00937: not a single-group group functionORA-00937: not a single-group group function

Page 26: Oracle8i 培训课程

组合函数的使用(二)组合函数的使用(二) 如果用户想得到组合函数计算后得到值大于某个范围,必须使用如果用户想得到组合函数计算后得到值大于某个范围,必须使用 havinghaving ;; SQL> select deptno,count(*) from empSQL> select deptno,count(*) from emp 2 group by deptno having count(*)>4;2 group by deptno having count(*)>4;

DEPTNO COUNT(*)DEPTNO COUNT(*) ---------- -------------------- ---------- 20 520 5 30 630 6 而不能使用而不能使用 where count(*)>4where count(*)>4 SQL> select deptno,count(*) from empSQL> select deptno,count(*) from emp 2 where count(*)>4 group by deptno;2 where count(*)>4 group by deptno; where count(*)>4 group by deptnowhere count(*)>4 group by deptno ** ERROR ERROR 位于第 位于第 2 2 行行 :: ORA-00934: group function is not allowed hereORA-00934: group function is not allowed here

Page 27: Oracle8i 培训课程

联合查询联合查询 UnionUnion 将查询出来的数据合并将查询出来的数据合并 ,,但是取消掉重复的记但是取消掉重复的记录录 ;;

Union all Union all 将查询出来的数据合并将查询出来的数据合并 ,,但是不取消掉重复的记但是不取消掉重复的记录录

Minus Minus 将查询出来的数据进行相减将查询出来的数据进行相减 ,, 得到不同的记录得到不同的记录 ;; 自连接 自连接 select a.* from emp a,emp b where a.mgr=b.eselect a.* from emp a,emp b where a.mgr=b.e

mpno ;mpno ; 等值连接 等值连接 select a.*,b.dname from emp a,dept b where select a.*,b.dname from emp a,dept b where

a.deptno=b.deptno;a.deptno=b.deptno; 外连接 外连接 select a.*,b.dname from emp a,dept b where a.select a.*,b.dname from emp a,dept b where a.

deptno=b.deptno (+);deptno=b.deptno (+); 外连接的主要作用是将外连接的主要作用是将 AA 表中的所有数据输出表中的所有数据输出 ,, 不管是否在不管是否在

BB 中有对应的巨轮中有对应的巨轮 ;;

Page 28: Oracle8i 培训课程

数据库的模型数据库的模型 关系模型关系模型 网状模型网状模型 层次模型层次模型 现有的数据库主要是关系模型的数据库,现有的数据库主要是关系模型的数据库,

如如 : ORACLE : ORACLE 公司的公司的 oracleoracleIBMIBM 公司的公司的 db2db2 、、 informixinformixSYBASESYBASE 公司的公司的 sybasesybase

MICROSOFTMICROSOFT 公司的公司的 sql serversql server

Page 29: Oracle8i 培训课程

数据库模型和设计数据库模型和设计 数据库的设计主要由以下的阶段数据库的设计主要由以下的阶段

需求分析

数据库设计

建立 / 文档

承受力测试

系统测试

最终产品

Page 30: Oracle8i 培训课程

数据库的设计工具数据库的设计工具 ErwinErwin ->CA ->CA 公司出产针对数据库的专业的公司出产针对数据库的专业的

设计工具设计工具 ;; Power desginer ->sybase Power desginer ->sybase 公司出产的软件开发公司出产的软件开发

的设计工具的设计工具 ,, 其中包含数据库的设计模块其中包含数据库的设计模块 ;; ROSE 2002ROSE 2002->->软件建摸工具软件建摸工具 ,,包含数据库的模块包含数据库的模块

data model ;data model ; Visio 2002Visio 2002 ->->建摸的设计工具建摸的设计工具 ,,包含数据库建立包含数据库建立模块模块 ;;

以上所有的实际工具都能从现有的数据库中导出以上所有的实际工具都能从现有的数据库中导出ERER关系模型关系模型 ,, 并形成脚本并形成脚本 ;;

这些工具能够将设计规划的实体关系直接导入到这些工具能够将设计规划的实体关系直接导入到数据库中数据库中 ,,形成需要的数据表形成需要的数据表 ;;

Page 31: Oracle8i 培训课程

模型对象模型对象 实体实体 (ISMGW)(ISMGW)

属性属性 (PASSWORD)(PASSWORD)

关系关系 (FK)(FK)

规则规则 (PK(PK 、、 NN NN 、 、 CHECHECK)CK)

I SMGWI CP

FK1 ISMGWIDI CPI D

I SMGWTAB

PK ISMGWID

PASSWORDI SMGWI PV4I SMGWPORTAREANOMASTERVERSLAVEVERLI NKSTATUS

Page 32: Oracle8i 培训课程

数据类型数据类型 Char(n)->Char(n)->定长字符串如果没有指定长度, 将是默认为长定长字符串如果没有指定长度, 将是默认为长

度度 11 ,输入的数据如果没有达到指定的长度,将自动补空,输入的数据如果没有达到指定的长度,将自动补空格,最大格,最大 22 的的 1616次方;次方;

Varchar2(n) ->Varchar2(n) -> 变长字符串,如果没有指定长度,将产生变长字符串,如果没有指定长度,将产生出错。输入不满指定长度,数据库不会补空格,最大出错。输入不满指定长度,数据库不会补空格,最大 22 的的1616次方;次方;

number(n)->number(n)-> 如果没有指定长度,将占用如果没有指定长度,将占用 3838 字节,字节, n<=n<=38;38;

Date->Date->占的长度为占的长度为 77 ,固定形式存储格式,精确到秒,固定形式存储格式,精确到秒 Long/long row->Long/long row-> 现在基本不用,别现在基本不用,别 loblob 代替,最大可以代替,最大可以

2G2G ;; Clob/blobClob/blob ->-> 存储巨大的数据,一般是存储巨大的数据,一般是 varchar2/charvarchar2/char

存储不下的数据;存储不下的数据; ObjectObject ->-> 数据库对象,需要自己定义;数据库对象,需要自己定义;

Page 33: Oracle8i 培训课程

建表建表 Create table [schema.]table(Create table [schema.]table( column datatype [default express],column datatype [default express],

[column constraint],[column constraint],……

[table_constraint]);[table_constraint]); 表主要是存储用户的数据,而如果是系统表主要是存储用户的数据,而如果是系统

的表,主要是存储数据字典;的表,主要是存储数据字典;

Page 34: Oracle8i 培训课程

建表(一)建表(一) 以下是一个包含有主键、以下是一个包含有主键、 NOT NULL NOT NULL 的的

表表 Create table department(Create table department(

dept_nodept_no number(5) primary key,number(5) primary key, dept_namedept_name varchar2(20) not null,varchar2(20) not null, descriptiondescription varchar2(64) null );varchar2(64) null );

Page 35: Oracle8i 培训课程

建表(二)建表(二) 以下脚本主要是建立一个有 以下脚本主要是建立一个有 FK(FK(外键外键 )) 、、 checkcheck 、、

default default 的表的表 Create table employee(Create table employee(

empnoempno number(10) primary key,number(10) primary key,enameename varchar2(60) not null,varchar2(60) not null,

salarysalary number(5) default 1000,number(5) default 1000, comm number(5) check(comm<40000),comm number(5) check(comm<40000), dept_no number(5) references departmentdept_no number(5) references department

(dept_no));(dept_no));

Page 36: Oracle8i 培训课程

约束约束 Primary keyPrimary key ->-> 主键主键 Foreign key Foreign key ->->外键外键 Not nullNot null ->-> 非空的约束非空的约束 Check Check ->->满足一定条件的约束满足一定条件的约束 DefaultDefault ->-> 默认值的约束默认值的约束 UniqueUnique ->->唯一值约束(可包含多个空唯一值约束(可包含多个空值)值)

如果你不对约束进行命名的话,系统将用如果你不对约束进行命名的话,系统将用 SYS_CSYS_Cnnnn 来显示,如果有约束名,对删除约束将非常方来显示,如果有约束名,对删除约束将非常方便;便;

Page 37: Oracle8i 培训课程

建表(三)建表(三) 以下是包含有约束名称的表:以下是包含有约束名称的表: Create table department(Create table department(

dept_nodept_no number(5) ,number(5) ,constraint pk_emp primary key(dept_constraint pk_emp primary key(dept_no),no),

dept_namedept_name varchar2(20) varchar2(20) constraint nn_emp1 not null,constraint nn_emp1 not null,

descriptiondescription varchar2(64) );varchar2(64) );

Page 38: Oracle8i 培训课程

建表(四)建表(四) 以下是包含有约束名称的表:以下是包含有约束名称的表: Create table employee(Create table employee(

empnoempno number(10) primary key,number(10) primary key,enameename varchar2(60) not null,varchar2(60) not null,

salarysalary number(5) default 1000,number(5) default 1000, comm number(5) check(comm<40000),comm number(5) check(comm<40000), dept_no number(5),dept_no number(5), constraint fk_emp foreign key(dept_no) constraint fk_emp foreign key(dept_no) references department(dept_no));references department(dept_no));

Page 39: Oracle8i 培训课程

常用数据字典常用数据字典 TabTab 查询常用的表查询常用的表 User_tables User_tables 用户所属的表用户所属的表 User_tab_columns User_tab_columns 表所包含的列;表所包含的列; User_constraints User_constraints 表的约束;表的约束; User_cons_columnsUser_cons_columns 关系到列的约束;关系到列的约束; User_sequencesUser_sequences 序列;序列; User_indexesUser_indexes 索引;索引; User_sourceUser_source 存储过程、包、函数;存储过程、包、函数; User_synonymsUser_synonyms 同义词;同义词; User_db_linksUser_db_links 数据库链;数据库链; User_objectsUser_objects 包含以上所有表中的数据包含以上所有表中的数据 ;; DictionaryDictionary 存放数据字典的字典;存放数据字典的字典;

Page 40: Oracle8i 培训课程

数据字典的说明数据字典的说明 User_User_ 用户所有的对象;用户所有的对象; All_All_ 除用户所有的对象外,还有属于除用户所有的对象外,还有属于 PUBPUB

LICLIC 的部分的对象;的部分的对象; Dba_Dba_ 所有的用户的对象;所有的用户的对象; V$V$ 数据库的视图(性能视图、动态数据库的视图(性能视图、动态

视图)视图) User_User_ 、、 all_all_ 、、 dba_dba_ 的数据所包含的字的数据所包含的字

符全部是大写,而符全部是大写,而 v$v$ 包含的数据,经常多包含的数据,经常多时小写的。时小写的。

Page 41: Oracle8i 培训课程

改表改表 数据表建立后,可以通过数据表建立后,可以通过 alteralter 来进行修改;来进行修改; 删除列 删除列 alter table employee drop column ename;alter table employee drop column ename; 修改列的类型 修改列的类型 alter table employee modify(ename alter table employee modify(ename

char(2));char(2)); 修改列的约束 修改列的约束 alter table employee modify(ename alter table employee modify(ename

null);null); 增加列 增加列 alter table employee add( address varcharalter table employee add( address varchar

2(64));2(64)); 不能对字段的名称进行修改;新增加的列将加在表的不能对字段的名称进行修改;新增加的列将加在表的

最后;最后;

Page 42: Oracle8i 培训课程

修改约束修改约束 删除主键 删除主键 alter table employee drop primary key;alter table employee drop primary key; 增加主键 增加主键 alter table employee add constraint pkalter table employee add constraint pk

_emp priamry key(empno);_emp priamry key(empno); 删除外键:删除外键: alter table employee drop constraint alter table employee drop constraint

fk_emp;fk_emp; 增加外键:增加外键: alter table employee add constraint falter table employee add constraint f

k_emp foreign key(dept_no) references dept(dek_emp foreign key(dept_no) references dept(dept_no));pt_no));

增加默认值:增加默认值: alter table employee modify( salarialter table employee modify( salaris default 2000);s default 2000);

Page 43: Oracle8i 培训课程

创建序列创建序列 Create sequence [schema.]sequence_nameCreate sequence [schema.]sequence_name [start with[start with n]n] ------ 开始值开始值 [increment by n][increment by n] ----步长步长

[maxvalue[maxvalue n]n] ---- 最大值最大值[minvalue[minvalue n]n] ---- 最小值最小值

[cache n|nochache][cache n|nochache] 是否缓存在内存中是否缓存在内存中 [cycle/nocycle][cycle/nocycle] 是否可以循环使用是否可以循环使用

SQL> Create sequence seq_testSQL> Create sequence seq_test 2 Maxvalue 99999999992 Maxvalue 9999999999 3 Minvalue 10000000003 Minvalue 1000000000 4 Nocycle4 Nocycle 5 Nocache 5 Nocache 6 ;6 ; 序列已创建。序列已创建。 在系统的数据字典中在系统的数据字典中 user_sequencesuser_sequences ,能够查询到所有的序列,以及其变化; ,能够查询到所有的序列,以及其变化;

select sequence_name,min_value,max_value,increment_by,last_number froselect sequence_name,min_value,max_value,increment_by,last_number from user_sequences;m user_sequences;

Page 44: Oracle8i 培训课程

使用序列使用序列 (1)(1) 将序列下个值取出将序列下个值取出 SQL> Select seq_test.nextval from dual;SQL> Select seq_test.nextval from dual; NEXTVALNEXTVAL -------------------- 10000000001000000000 取出序列的当前值取出序列的当前值 SQL> select seq_test.currval from dual;SQL> select seq_test.currval from dual; CURRVALCURRVAL -------------------- 10000000001000000000 在使用在使用 currvalcurrval 之前,必须执行过之前,必须执行过 nextvalnextval 的过程,否则的过程,否则会产生出错;如果执行一个会产生出错;如果执行一个 nextval,nextval, 可以多次执行可以多次执行 currvcurrval;al;

Page 45: Oracle8i 培训课程

使用序列(使用序列( 22 )) 序列最经常的使用除了序列最经常的使用除了 selectselect外,还使用在外,还使用在 inseinse

rt rt 语句中使用语句中使用 :: Insert into employee (id,ename) values(seq_Insert into employee (id,ename) values(seq_

test.nextval,’guofr’);test.nextval,’guofr’); 在在 updateupdate 语句中,偶尔也使用:语句中,偶尔也使用: Update employee set id=seq_test.nextval;Update employee set id=seq_test.nextval; DeleteDelete 语句中非常少使用到;语句中非常少使用到; 序列的主要作用是产生一序列的唯一数,避免用序列的主要作用是产生一序列的唯一数,避免用

户的自己产生,产生差错;户的自己产生,产生差错; 如果你要保证序列是递增的,最好用如果你要保证序列是递增的,最好用 nocache,nocache,避免由于系统关闭时,序列产生丢失;避免由于系统关闭时,序列产生丢失;

Page 46: Oracle8i 培训课程

改变序列改变序列 以下是改变序列的语法:以下是改变序列的语法: Alter sequence [schema.]sequence_name Alter sequence [schema.]sequence_name

[increment by n][increment by n][maxvalue n|nomaxvalue ][maxvalue n|nomaxvalue ]

[minvalue n|nominvalue][minvalue n|nominvalue][cycle|nocycle][cycle|nocycle]

[cache n|nocache][cache n|nocache] SQL> alter sequence seq_testSQL> alter sequence seq_test 2 nomaxvalue;2 nomaxvalue; 序列已更改。序列已更改。 删除序列 删除序列 SQL> drop sequence seq_test;SQL> drop sequence seq_test; 序列已丢弃。序列已丢弃。

Page 47: Oracle8i 培训课程

视图视图 视图上存储在服务器上的视图上存储在服务器上的 SQLSQL 语句,视图语句,视图

本身不存储数据,在执行时,从相关的表本身不存储数据,在执行时,从相关的表中取数据;中取数据;

视图的作用有以下方面:视图的作用有以下方面: 限制用户的访问,只让用户读取某些列;限制用户的访问,只让用户读取某些列; 让用户能够得到更直观的数据表示;让用户能够得到更直观的数据表示; 简单用户的查询(如:复杂试图);简单用户的查询(如:复杂试图); 同样数据的不同显示,用户可通过不同角同样数据的不同显示,用户可通过不同角

度得到同样的数据;度得到同样的数据;

Page 48: Oracle8i 培训课程

创建视图的语法创建视图的语法 Create [or replace] [force|noforce] view v_naCreate [or replace] [force|noforce] view v_na

meme ([alias(,alias)])([alias(,alias)])as subqueryas subquery with chech option with chech option

[constraint [constraint constraint]constraint]with read onlywith read only

ForceForce 强迫建立视图,不管数据表是否存在;强迫建立视图,不管数据表是否存在; nonoforceforce ,默认方式,只有,默认方式,只有 subquerysubquery 存在,才能存在,才能建立视图;建立视图;

With check option With check option 如果视图是不可更新的,不如果视图是不可更新的,不能有能有 DMLDML 操作;操作;

With read only With read only 视图是只读的,不能有任何的视图是只读的,不能有任何的 DDMLML 操作;操作;

Page 49: Oracle8i 培训课程

创建视图创建视图 简单视图:简单视图: Create view v_emp as select empno,ename fCreate view v_emp as select empno,ename f

rom employee;rom employee; 复杂的视图:复杂的视图: Create view v_emp_stat as select deptno,Create view v_emp_stat as select deptno, cc

ount(*) ount(*) emp_total from employee emp_total from employee where deptno<100 where deptno<100 group by deptnogroup by deptno

如果你有创建视图,可以通过数据字典如果你有创建视图,可以通过数据字典 user_vieuser_viewsws 来查看用户已经创建的视图;来查看用户已经创建的视图;

Page 50: Oracle8i 培训课程

删除视图删除视图 从数据字典中,你能够查找到用户所有的从数据字典中,你能够查找到用户所有的

视图以及相关的视图以及相关的 SQLSQL 语句;语句; 试图能够想表一样,用试图能够想表一样,用 desc desc 进行描述;进行描述; Select view_name , text from user_vieSelect view_name , text from user_vie

ws;ws; 删除视图:删除视图: drop view v_emp;drop view v_emp;

Page 51: Oracle8i 培训课程

索引索引 索引是一个数据库对象,象表一样,存储在数据索引是一个数据库对象,象表一样,存储在数据

库中,你可以从数据字典库中,你可以从数据字典 user_indexesuser_indexes 中查询中查询到用户的相关索引;到用户的相关索引;

有效地使用索引,能够提高数据的访问速度,有有效地使用索引,能够提高数据的访问速度,有效地减少磁盘的效地减少磁盘的 I/OI/O ;;

索引一旦建立以后,由数据库自动的维护,不需索引一旦建立以后,由数据库自动的维护,不需要用户的干预;要用户的干预;

如果对表的数据进行频繁的操作,需要定时对索如果对表的数据进行频繁的操作,需要定时对索引重建;引重建;

索引依赖于表,如果表被删除,那么索引也将被索引依赖于表,如果表被删除,那么索引也将被删除;删除;

Page 52: Oracle8i 培训课程

索引的种类索引的种类 B-TREEB-TREE 索引,最常见的索引,也是经常使索引,最常见的索引,也是经常使

用的索引,不用指定参数;用的索引,不用指定参数; Reverse Reverse 反向索引,如果表中的列值非常反向索引,如果表中的列值非常

的接近,可以采用该索引将值分开;的接近,可以采用该索引将值分开; Bitmap Bitmap 在数据仓库中经常使用,值变化在数据仓库中经常使用,值变化

非常的少而且有限;非常的少而且有限; 函数索引,将函数放置在索引中,一般在函数索引,将函数放置在索引中,一般在

wherewhere 语句中经常需要使用的函数;语句中经常需要使用的函数;

Page 53: Oracle8i 培训课程

索引的创建索引的创建

如果你创建如果你创建 primary key primary key 或者或者 uniqueunique 的话, 的话,数据库将自动为这些约束建立索引;数据库将自动为这些约束建立索引;

只有频繁使用的表列,并且数据量超过只有频繁使用的表列,并且数据量超过 25002500 行的行的数据,才建立索引;数据,才建立索引;

如果需要创建包含多个列的索引,最好按如果需要创建包含多个列的索引,最好按 wherewhere语句中的顺序创建索引;语句中的顺序创建索引;

如果经常联合使用,最好对外键(如果经常联合使用,最好对外键( foreign keforeign keyy )见索引;)见索引;

可以通过可以通过 explain plan explain plan 来观察该索引是否有效,来观察该索引是否有效,pl/sql developerpl/sql developer也可以查看;也可以查看;

Page 54: Oracle8i 培训课程

索引的类型索引的类型 唯一索引,如:唯一索引,如: primary key ,uniqueprimary key ,unique ,,

保证数据是唯一的;保证数据是唯一的; 非唯一的索引,有效提高速度;非唯一的索引,有效提高速度; 单行索引,只有一行被索引;单行索引,只有一行被索引; 组合索引,有多个列组合起来作为一个索组合索引,有多个列组合起来作为一个索引;引;

Page 55: Oracle8i 培训课程

索引创建、删除索引创建、删除 Create [bitmap | reserve ] index index_Create [bitmap | reserve ] index index_

name name on table_name(column_namon table_name(column_name1,column_name)e1,column_name) tablespace indx;tablespace indx;

所有创建的索引可以在数据字典所有创建的索引可以在数据字典 user_induser_indexesexes 中查询到;中查询到;

删除索引为删除索引为 : drop index index_name;: drop index index_name;