Oracle经典自学笔记_第1页
Oracle经典自学笔记_第2页
Oracle经典自学笔记_第3页
Oracle经典自学笔记_第4页
Oracle经典自学笔记_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一验证Oraclle已经安装装完成了,首首先得确认程程序里有这些些个选项,有有四个选项:Oraclle Insstallaation Produucts、集集成管理工具具、配置和移植工工具(管理员员用得比较多多)、应用程程序开发。Oraclle也可以形形成一种层次次性的链接(DDirecttory MManageer),对于我们来来说用得最多多是sqlpplus,而而OLE 是是一种面向对对象的技术,利利用这种技术术可开发可重重复使用的软软件组件(CCOM),他他是微软提出出的,在用VVB开发时可可能要用,对对于我们来说说不须管。当启动sqllplus时时会提示输入入用户名和口口令,所谓的的s

2、qlpllus是Orracle的的一个客户端端。Oraccle大多数数命令都用命命令来实现,所所以比较难使使,就如同uunix比wwindowws难使。口口令你输入ttiger,建建议就用它,因因为以后去企企业里Oraacle 99i就是用的的这个口令。当你看到SSQL命令令符时说明已已经进入到了了Oraclle的命令行行了。图形版的sqllplus,命命令行的sqqlpluss,还有一个个就是通过网网页访问Orracle的的服务,启动动sqlpllus,端口口号是55660,URLL是 HYPERLINK httpp:/1227.0.00.1:55560/issqlpluus。isqqlpl

3、uss httpp:/1227.0.00.1:55560/issqlpluus。isqqlpluss非常有用,比比如说你的机机器上没有装装上Oraccle,就可可以通过键入入别人的IPP,然后登陆陆到他的机器器上来做实验验,当然也可可以安装特定定的客户端软软件实现。说实在的Oraacle的这这个客户端太太难看了,并并且要记好多多好多的命令令,所以专门门有一类公司司专门为Orracle开开发客户端。有一个比较较著名的客户户端叫Toad,当当然Oraccle还有一一个客户端PPL/SQLL Deveelplorr,这个用的的也非常多。数据库管理理时常用Tooad(英文文蛤蟆的意思思),如果有有声卡

4、的话,你你启动一次它它就叫一次。对我们来说说sqlpllus足够使使了。以后有有机会我使用用一下PL/SQL DDevelpplor,不不过这个也不不好使,因为为你同时必须须装上Oraacle,还还不如isqqlpluss好呢。以超级管理员身身份链接数据据库的方法是是再命令行下下敲入命令:sqlpllus syys/口令 as syysdba。Sys和syystem的的区别是syys是数据库库管理者,ssystemm是数据库所所有者,sys用户拥拥有dba,sysdbba,sysopper等角色色或权限,是是oraclle权限最高高的用户,ssystemm用户拥有dbba,sysdbba等角色

5、或或系统权限,system如果正常登录,它其实就是一个普通的dba用户,但是如果以as sysdba登录,其结果实际上它是作为sys用户登录的,这一点类似Linux里面的sudo的感觉,从登录信息里面我们可以看出来。sys用户必须以as sysdba或as sysoper形式登录。然后输入命令alter user scott account unlock;它的意思是将Scott用户解锁,以后关于dba的用到一个学一个,没必要从头到尾的去学它。二SQL语言是在在数据库下进进行操作的语语言,它本身身是一个标准准语言,有国国际标准。有有两套一个是是SQL19992,SQQL19999。大多数数数据库

6、既支持持旧的标准也也支持新的,很很多也是用的的旧的SQLL语言写程序序的,对于我我们来说新旧旧都要学,而而且对大多数数数据库系统统来说都是通通用的,只不不过不同数据据库有一个轻轻微的改变,这这就是最郁闷闷的地方,没没办法到时候候查手册或ggooglee一下。SQL全称称为Struuctureed Queery Laanguagge,即机构化查查询语言,它被定义为为第四代语言言。为什么叫叫第四代语言言,因为我们们知道第三代代语言也得有有if ellse foor 等这些些流程控制语语句,也就是是你得告诉它它干什么且怎怎么干。第四四大只用告诉诉它我要干什什么,不用去去控制它怎么么干,这样的的语言学

7、起来来当然十分eeasy。我们共有四类类语句要学:数据操作语语言语句Data manippulatiion laanguagge,DMLL,会话控制语语句 HYPERLINK /searchwhatis/18/.shtml sessiion coontroll stattementt,数据定义语语言语句DData ddefiniition languuage,DDDL以及及事务控制语语句 HYPERLINK /searchwhatis/297/.shtml transsactioon conntrol stateement。查询语句只有一一句话就是sselectt语句,这是是最重要的一一条语句

8、。以以后只要遇到到相应的seelect语语句一律背过过,企业再面面试时其他语语句一般不会会怎么考但这这条语句是必必考的。如果果考你SQLL语句肯定会会考这条seelect语语句不是别的的。你跟别人人交流的时候候,别说我写写过几条dmml语句,而而因详细的说说到底是什么么语句,比如如inserrt语句、uupdatee语句等。选择的意思思是从表里把把数据拿出来来,展现出来来。听起来似似乎挺简单的的,但你要从从表里拿数据据得首先知道道有几张表,每每张表里有些些什么内容。第一步要做的的就是熟悉一一下实验用的的数据,这些些数据Oraacle都给给自带了,直直接用就行了了。首先第一一条语句deesc e

9、mmp,描述一一下emp这这张表,会分分别列出所有有字段(表头头),emppno 雇员员编号,enname 雇雇员名字,jjob 雇员员工种,mggr 经理人人,hireedate 雇员入职日日期,sall 薪水,ccomm 津津贴,奖金,ddeptnoo 所属部门门编号。表还有一部部分叫类型,也也就是相对应应字段的类型型,这些都是是Oraclle已经定义义好的,我们们直接用。现现在先用别人人建立好的表表,然后再自自己建表。NNUMBERR指数字,VVARCHAAR指字符型型,Oraccle7以前前在用,现在在常用的是VVARCHAAR2它支持持各种可变字符串,可以更好的的表示各国文文字,DA

10、TTE指日期,NNUMBERR(7,2)指七位数字字有两位小数数。desc deept 部门门表,它有三三个字段DEEPTNO 部门编号,DDNAME 部门名称,LLOC部门所所在位置。DDesc ssalgraade工资等等级表,许多多公司都实行行的是工资等等级制,分几几级工资,GGRADE工工资等级,HHISAL该该等级最高工工资,LOSSAL该等级级最低工资。以上简要的介绍绍了三张表,如如果想更详细细的了解里面面的数据,教教大家第一个个selecct语句:seclectt *frrom 表名名;。*表示把表表里所有的数数据都取出来来,分号表示示语句结束。尽量多熟悉悉各张表之间间的关系,以

11、以及表内部各各字段之间的的关系,越熟熟悉越好。如果要算纯数据据,可以采用用dual这这张表,它就就一条记录,一一个字段。你你如果用其他他表计算的话话会有好多条条重复结果,记记录。字段是不能有空空格的,如果果非要空格可可以将整个字字段用双引号号括起来,这这样的话引号号里面就可以以加上各种各各样的字符了了。如果没加加引号的话那那样做是不对对的。再没有有加双引号的的时候结果字字段名会以大大写字母显示示出来,但加加了双引号就就保持住了原原来的形式不不变。没有就就是nulll值,即便是是0也与空值值大不一样。0是有值但但为0,nuull是没有有值。任何含含有空值的表表达式最后的的结果都是空空值。SQL里

12、面有一一个字符串链链接符|,它它的作用跟JJava里的的+一样,所所有被链接的的都会转换为为字符串显示示出来。如selecct enaame|ssal frrom emmp;它的意意思是将结果果sal转换换为字符串后后链接到enname后面面。在任何数据据库的SQLL语句里面都都是用单引号号括起来表示示一个字符串串序列。如果果字符串里本本来就有单引引号,再解析析时就会出错错。可以用两两个单引号来来代替一个单单引号,这样样就可以正确确显示了。关键字disttinct是是指选择不重重复的记录,如如果修饰多个个字段时表示示选择该多个个字段的组合合不重复的显显示出来。wwhere叫叫过滤条件,它它会过

13、滤掉一一些记录,等等值判断用=,不等值判判断注意是而不是JJava语句句里的不等号号。字符串比较较是比较字符符的ASCIII码,挨个个比较。做比比较时还可以以用关键字bbetweeen andd,注意的是是包括边界值值的。andd也可把两个个过滤条件连连接起来。下面来讲空值值的处理,你你可以直接用用wheree +字段+is nuull来取出出是空值的,取取出不是空值值的多加一个个not就行行。这种处理理方式非常像像我们的说话话习惯。inn然后跟着某某个字段的取取值是括号括括起来各值之之间用逗号隔隔开。可以使使用and、or,noot连接起各各个查询条件件。日期处理起来稍稍微麻烦一些些,由于现

14、在在还没有学日日期函数,所所以采用另外外一种方式一个特殊的的字符串。你你就按它的日日期写法来写写如20-2月月-07,然后系统统就按照字符符串来比较即即可。年份可可以写全如20-2月月-2007,它能认出出来。以后我我们可以写成成任何形式的的日期格式都都能处理。模糊查询是这样样的,比如找找出名字里含含有al的,有有点像正则表表达式。使用用关键字liike,可以以通配符%,代代表0个或多多个字符,_代表一个字字母。如果名字里里就含有一个个%,则使用用转义字符%的形式,当当然可以自己己指定转义字字符方法是sselectt * frrom emmp wheere enname llike _A$%

15、esccape $;。排序用到的一个个关键字是oorder by,默认认的是按升序序排列,如果果想降序排列列可以采用如如下形式:sselectt * frrom deept orrder bby depptno ddesc;ddesc是降降序的英文缩缩写。升序排排列可不写也也可加上assc。还可以以加入wheere先过滤滤了再排序,按照几个字段进行排序时,用逗号分隔开,如下:select ename ,job,empno,sal ,deptno from emp order by deptno,sal desc;意思是先将表按照deptno升序排列,然后相同的deptno内部再按照sal降序排

16、列。三SQL函数,函函数就是Jaava里的方方法,有参数数有返回值。现在讲的是是单行函数,第第一个叫做llower,作作用是转换为为小写;第二二个叫uppper,作用用是转为大写写;第三个叫叫substtring,取取子串。这几几个函数都是是对字符串进进行操作的,传传递进去的参参数就是字段段名。如selecct lowwer(enname) from emp;还还有一个函数数叫chr,它它是把一个数数字转为字符符:seleect chhr(86) fromm duall;将86代代表的字符显显示出来,与与之对应的是是将一个字符符转为对应的的ASCIII码,叫asscii,如如:seleect

17、asscii(A) froom duaal;就是将将A的码值显显示出来。round函数数是四舍五入入的作用,如如selecct rouund(433.) frrom duual;结果果就为44。还有一个重重载的带两个个参数的方法法如seleect roound(443.,4) fromm duall;四舍五入入到小数点后后4位,结果果位44.55354,第第二个参数可可以是负数表表示四舍五入入到小数点前前多少位。其他函数可以不不用记住,但但要知道有这这么个函数,然然后取手册中中可以查到,但但下面讲的一一个函数最好好记住它。tto_chaar是将字段段内容显示为为字符,可以以对显示的形形式进行格

18、式式控制,比如如selecct to_char(sal, $99,999,9999.99999) from emp;就就是以后面给给定字符形式式显示出来,小小数点后的四四位会强制显显示,而前面面的没有的位位数就不显示示,这就是99的含义。$换为L表示示本地货币。0代表一位位数字,如果果没有该位数数字也会强制制显示为0,对于这种方式是为了进行格式控制。实际上用too_charr来控制数字字是比较少用用的,而用得得最多的是对对日期格式的的控制,我们们知道Oraacle里的的sysdaate包含了了插入记录的的详细时间信信息,我们可可以对其进行行显示的格式式进行控制,比比如:sellect tto_

19、chaar(hirredatee,yyyyy-mm-dd) from emp;转转换为年月日日2006-3-23这这种格式的。实际上对日日期的格式控控制是利用JJava来实实现的,到时时会有一个关关于日期处理理的专题。select enamee,job,hireddate ffrom eemp whhere hhiredaate tto_datte(19982-1-1 1:330:00, yyyyy-mmm-dd hhh:mi:ss);意思是将特特定的字符串串转换为相应应的日期格式式。还有to_numbeer是将特定定的字符串解析为为相应的数字格格式如selecct enaame ,jjob

20、,ssal frrom emmp wheere saal22000;首首先按depptno求出出每个depptno的平平均sal,然然后对这些分分组利用haaving 语句进行过过滤。到现在为止已已经学完了所所有的单条sselectt语句,执行行顺序按照sselectt+字段或内容+frrom+表名名+wherre+grouup by+haviing+ordeer by这个顺序进进行执行,首首先取出记录录,然后对单单个记录进行行过滤,过滤滤完了分组,分分组好了对组组过滤,剩下下的分组再按按顺序显示出出来。单条sselectt语句一定要要非常熟悉,如如果这都要查查书的话对企企业就没法交交代了,哈

21、哈哈!之前已经讲过一一个子查询的的例子:seelect enamee,sal from emp wwhere sal=(selecct maxx(sal) fromm emp);看谁的工工资最高,之之所以叫子查查询因为再一一个seleect语句里里套了另外一一个seleect语句。理解子查询询的关键是把把它当成一张张表,可以对对它做表连接接最后就可以以求出想要的的结果来。单单独的sellect语句句相当简单,但但是有了seelect子子句和表连接接之后语句就就稍微复杂了了点。sellect eename ,sal from emp jjoin(sselectt max(sal) max_ssa

22、l,deeptno from emp ggroup by deeptno) t onn (empp.sal=t.maxx_sal and tt.depttno=emmp.depptno);这个语句的的作用是求出出每个部门薪薪水最高的员员工记录。select e1.enname,ee2.enaame frrom emmp e1,emp ee2 wheere e11.mgr=e2.emmpno;对对于在同一张张表中进行查查询时需要进进行自连接,为为表取别名便便于写出条件件和比较。这这条语句的意意思是找出每每个员工的经经理人。为同同一张表起不不同的别名然然后当成两张张表来用。在SQL99里里面链接条

23、件件和过滤条件件是分开的,即即链接条件不能能出现在whhere语句句里面,利用用Join+表名+onn+链接条件件进行。比如如:seleect enname ,job,ddname from emp jjoin ddept oon (emmp.depptno=ddept.ddeptnoo);等值链链接的时候有有一个简便的的写法usiing(deeptno)代替on (emp.deptnno=deppt.depptno)但但不推荐使用用,因它的限限制条件很多多,可能报出出来的错误很很难找并且看看起来也不是是很清楚。连接有各种各样样的形式,下下面我们讲外外连接,其实实用起来特别别方便。它会把左边边

24、那张表不能能和右边链接接的数据也拿拿出来。seelect t1.enname , t2.eename mgr , t1.ddeptnoo fromm emp t1 left ouuter jjoin eemp t22 on (t1.mggr=t2.empnoo);outter可以省省略掉效果一一样。如果想想把右边多余余的拿出来JJoin前加加上righht即可;如如果两边多余余的都想拿出出来Joinn前加上fuull叫全外外连接。讲一道面试题,不不准用组函数数求出薪水的最最高值。方法法是用自连接接,连接条件件采用非等值值连接,这这样表中的最最大值就会连连接不上,然然后再从emmp表中找出出未连

25、接上的的最大值,如如下:sellect ssal frrom emmpwherre sall not in (sselectt t1.ssal frrom emmp t1jjoin eemp t22on (tt1.sall(sselectt max(sal) from emp wwhere empnoo not in (sselectt disttinct mgr ffrom eemp whhere mmgr iss not null) andd empnno in (seleect diistincct mgrr fromm emp wheree mgr is noot nulll );再讲

26、一道面试题题:比较这两两个语句的执执行效率Select * froom empp wherre depptno=110 andd enamme likke %A%;Select * froom empp wherre enaame liike %A%anddepptno=110;理论上说应该是是第一个,就就如同&和和&的区别一一样它会过滤滤掉很多条件件,后面的字字符串就不用用再取去比较较了,但实际际中不好说因因为有可能OOraclee在执行的时时候做了优化化,自动将数数字比较放前前面了。四现在已经讲完完了seleect语句,接接下来讲dmml语句,常常见的有三条条,他们和sselectt语句合

27、称为为数据库的四四大语句(sselectt/inseert/uppdate/delette)。增删改查!接下来简单介绍绍一下Oraacle的逻逻辑结构。安安装的时候创创建了一个全全局数据库,同同时为这个数数据库建立了了一系列管理理它的进程SSID。一个大数据据库里面又区区分为不同的表空空间,说白了了就是装表的的地儿。我们们现在的表是是放在不同的的表空间里面面,比方说uusers表表空间,在里里面放着某个个用户所有的的表,当该用用户登录进去去后其实是去去访问自己的的表空间里的的相对应的表表。可以将某某个表空间里里的内容全部部copy出出去创建一个个新的useer,然后该该user就就操作专属于于

28、自己的表空空间里的表了了,所以说OOraclee是支持多用用户的。将某个表空间里里的内容全部部copy出出去创建一个个新的useer做法是这这样的:1.以超级管理理员登录数据据库connn sys/oraclle as sysdbba;2.从命令行行在起一个cclientt,先建立一一个目录如CC:tesst进入该目目录后执行ddel *.*删除所有有,然后键入入命令expp后提示输入入用户名和口口令,就是你你要备份哪个个就输哪个,接接下来提示输输入数组提取取缓冲区大小小,这个没关关系(内存里里的一个小区区域填满了再再统一拿到硬硬盘上来)一一路回车就行行,等着它导导完就可以了了;3.创建新用用

29、户creaate usser huuanggaang iddentiffied bby hahha08322 defaault ttablesspace userss quotta 10MM on uusers;用户名huuanggaang口令hhaha08832在ussers表空空间里分配110M的默认认表空间给该该用户;4.给予相应应权限graant crreate sessiion,crreate tablee,creaate viiew too huannggangg,如果没有有sessiion它登录录都是问题;5.导入文文件imp后后回车几个后后提示是否导导入整个导出出文件选否后后输

30、入想导入入的那个用户户数据的用户户名。只有2和55是在命令行行中完成,其其余是超级用用户登录后在在数据库里完完成。insert into+表名+vaalues(各各字段值),在在对这些数据据进行操作时时最好有一个个备份,方法法很简单roollbacck回退操作作,creaate taable 表表名 as selecct * ffrom +欲备份表名名;inserrt语句还有有一种插入方方法,inssert iinto ddept2(deptnno,locc) vallues(550,beeijingg);只是是插入部分字字段的值,其其他字段的值值为nulll,还有一种种方法是innsert

31、into dept22 seleect * from dept;将seleect子句选选出的记录挨挨个插入前提提是选出的记记录与该表的的记录格式相相同。在Oraclee中取完相应应字段后,会会在末尾附加加一个伪字段段,你看不到到,叫做roownum,它它是记录下每每条记录在第第几行了,用用它的时候有有个限制条件件只能与或或=6 aand r=10;这个在Oraccle里面是是效率最高的的,如果通过过连接数据库库用Javaa编程来做,但但效率相当低低。这个重点点掌握,比如如说显示论坛坛里的帖子是是分页显示的的,如果想显显示第4页的的内容一定是是从某一个帖帖子到某一个个帖子显示出出来,帖子这这个记

32、录是按按照发帖时间间倒序排列的的。三层嵌套套就是Oraacle对这这种问题的解解决方案,当当然每一种数数据库有自己己的解决方式式。SQL面试题:有3个表S,CC,SC。SS(SNO,SNAMEE)代表(学学号,姓名);C(CNOO,CNAMME,CTEEACHERR)代表(课课号,课名,教教师);SCC(SNO,CNO,SSCGRADDE)代表(学学号,课程成成绩)。问题:找出没选过“黎黎明”老师课程的的所有学生姓姓名;列出2门以上(含含2门)不及及格学生姓名名及平均成绩绩;既学过1号课程程又学过2号号课程所有学学生姓名。请用标准SQLL语言写出答答案,方言也也行(请说明明使用什么方方言)。s

33、elect snamee fromm s jooin scc on (s.snoo=sc.ssno) jjoin cc on (o=sc.noo) wheere c.cteaccher limingg; (2) seleect snname ffrom ss wherre snoo in (selecct snoo fromm sc wwhere scgraade =2); (3) seleect snname ffrom ss wherre snoo in (selecct snoo fromm sc wwhere cno=11 and sno = (sellect ssno frrom s

34、cc wherre cnoo=2);update 的作用相对对于对记录进进行修改。用用法是upddate+表表名+sett+字段列表表及更新值过过滤条件;deelete+from+表名+过滤滤条件,删除除某些字段。五接下来讲数据据定义语言dddl语言。它实现了数数据表,视图图等的建立。事务trannsactiion就是一一系列的操作作,要么同时时完成要么不不完成,比如如转账操作要要对两个账户户updatte,不会出出现数据不一一致。对于OOraclee来说,一个个transscatioon起始于一一条dml语语句,然后一一系列的操作作rollbback回退退事务会结束;或commmit结束事事

35、务,再roollbacck也没用;当遇到一条条dcl语句句或ddl语语句提交结束束事务;当正正常退出exxit时提交交结束事务,不不正常退出时时(如断电)自自动回滚结束束事务。数据库常用对象象是指它经常常使用的一些些资源,比方方说表、视图图或其他资源源。下面讲如如何创建一张张表,creeate ttable +表名+字字段及字段的的数据类型。Oraclle常用的数数据类型有变长字符串串varchhar2(最最长字符数即即上界4k)、定长字符串串char(所所占大小)。有了变长字字符串后为什什么还要有定定长字符串呢呢?主要还是是效率问题,跟跟数组很像,但但是站空间,很很多结构、算算法都存在拿拿空

36、间换时间间问题,如HHashTaable。数字型nuumber(mm,n)m指指总共多少为为,n是小数数点后的位数数;日期daate,包含含年月日时分分秒;变长字符串串long可可达2G,主主要是有些时时候一篇文本本相当长;存存图片可以把把硬盘上图像像的名字存到到数据库里,也也可以把整张张图片存到数数据库里。创建一张表存放放学生数据如如:create tablee stu ( id nummber(88), name vvarchaar(20), sex nuumber(10), age nuumber(3), sdate date, grade numbeer(2) defauult 1,

37、class numbeer(2), email varchhar2(550) );sex取数字来来表示更节省省空间,入学学时日期加个个s避免和关关键字冲突,可可以为某些字字段指定默认认值当插入记记录时没有对对该字段赋新新值就以该默默认值,其他他没有默认值值为nulll。五个约束条件件第一个叫非非空,第二个个叫唯一,第第三个叫主键键,第四个叫叫外键第五个个叫checck。当我们们创建这张表表的时候,有有一个最简单单的条件字段段非空nott nulll。在Oraacle里面面约束条件也也可以看成一一个对象,能能为之取一个个名字,加一一个关键字cconstrraint+约束名,如如name varc

38、hhar(2) consstrainnt stuu_namee_nn nnot nuull,不起时系统统自动起名字字我们不用管管了。唯一约约束的意思是是在这个字段段里面所有的的记录不能重重复,如id nnumberr(8) uuniquee,这属于字段段级的约束;字段级的约约束有些限制制,比如要某某些字段组合合不能重复,还有就是两个空值它不认为是重复的。要达到表级约束方法是在最后一个字段写完后加一句如:constraint stu_name_email_uniunique(emaill,namee)。主键(primmary kkey)是可可以唯一标示示整条记录的的东西,它代表表的意思是既既不能

39、为空又又不能重复,比如学生学号。E-mail做主键不好因为它可以为null,同时索引的时候数字比字符串效率高。如id number(8) primary key,也可以加在表级,如constraint stu_id_pk primary key(id),主键也可以是多个字段组合。外键约束建立立在一张表的的两个字段上上或者是两张张表的两个字字段上,是比比较麻烦的一一种约束。在在emp和ddept就有有外键约束,往emp里加记录的时候不允许再dept里没有的部门编号。class number(2) references class(id),参考class这张表的id字段,当然也可以加在表级上:co

40、nstraint foreign key (class) references class(id),。注意在写外键约束的时候,stu里的class叫参考字段,class里的id叫被参考字段,加外键的前提是被参考字段必须是主键。删一条记录的时候首先看有没有其他字段参考它,有的话是无法删除的,违反了完整约束条件。Check约束束用得比较少少,在写miis系统时数数据在Javva程序里就就已经校验过过了。修改表表结构是在现现有表上修改改。在任何项项目开发时候候建表的SQQL语句是要要保存下来的的,所以可以以将表整个删删掉再建。添添加字段allter ttable +表名+aadd(字段段名+数据类类

41、型)如allter ttable dept22 add(dphonne varrchar22(11);删除某个个字段如allter ttable dept22 dropp(dphoone);还还可以修改字字段的数据类类型,如果里里面已经有数数据修改的后后果应不影响响原来存的记记录值。在Oraclee里面看当前前用户下有哪哪些表,哪些些约束,哪些些视图等等这这些信息被单单独地装在一一张表里面,称作数据字典表。user_tables里面装的是当前用户共有多少张表,里面字段可多了,我们关心的是table_name。查询当前用户下有哪些视图:select view_name from user_vie

42、ws;查询当前用户下有哪些表:select table_name from user_tables;查询当前用户下有哪些约束:select constraint_name,table_name from user_constraints;。user_tables、user_constraints、user_views这些都是数据字典表,那么一共有多少个数据字典表呢?Oracle专门有另外一张表存放数据字典表的表叫做dictionary,它总共两个字段一个叫table_name数据字典表的名字、还有一个叫comments对于这张数据字典表的描述。总共有600多个数据字典表,这就是Oracle的D

43、BA总是背着个小本本的原因,你要背是不可能的。索引就相当于字字典里的索引引一样,它在在Oraclle里相当于于一种新的数数据库对象,建立索引的方法create index idx_stu_emil on stu (email);也可以在字段组合上建立索引,以后在查询组合时效率就高,删除索引同删除表方法类似。忘了自己有哪些索引可以采用select index_name from user_indexse;当你给某张表的字段加主键或唯一性约束的时候。建立索引的用处是当你建立了索引后取访问相应数据的时候效率会很高。注意说的是读的效率高了,但存的效率反而低了,因为你得同时往索引表里加索引值,会占用大量

44、的空间。记住一点不要轻易建立索引,除非觉得访问量特别大时。视图前面也提提过,它是一一张虚表,严严格来讲就是是一个子查询询。利用它可可以简化我们们的查询复杂杂度,同时它它也有不好的的地方,就是是表结构改了了它也得跟着着改动,增加加了维护的难难度。视图有有些其他功能能,比如说我我有一个数据据库,它里面面存了所有的的产品信息,而有一个供应商他想看我产品的信息,如果我把整张表都给他看那么关键信息他就全部都看走了,我的销量有多少等等。我可以建立一个视图里面只包含我想要给他看的内容。序列是Oraacle数据据库独有的东东西,它产生生一个唯一、不间断的序序列,作用是是一般做主键键。如下我们们要存储BBBS里

45、的帖子子建立一张表表:create tablee artiicle (id numbber,title vvarchaar2(10024),cont loong);如果要加入一篇篇文章,采用用这种做法sselectt max(id) ffrom aarticlle;然后知知道了id往往里插,但若若有另外一个个客户端在做做数据插入同同时也在执行行完上面一条条语句插入了了一条记录就就会导致数据据不一致的现现象。为此我我们可以创建建一个seqquencee,每次插的的时候访问它它的一个属性性nextvval就会得得到不重复的的id,实际际上它是在内内部做了同步步的。六范式就是数据库库设计的一些些规则

46、,而它它又是由一个个姓范的提出的。讲到设计其其实是很复杂杂的事情,不不能指望用几几条规则把所所有的都总结结出来(你在在造永动机,追追求银弹siilver bulleet),所以有时要要具体问题具具体分析,该该打破三范式式的时候还是是要敢于打破破。三范式追求的的是这样的目目标:不存在在冗余数据,换换句话说就是是同样的数据据不存第二遍遍。当然除了冗冗余性外还有有一些边缘性性的要求,不不是很重要,讲到的时候再说。第一范式的第第一个要求-要有主键;第二个要求求-列不可分分,不能说姓姓名我还要分分成姓和名。第二范式当一一张表里有多多个字段作为为组合主键的的时候,非主主键的字段不不能够依赖于于部分主键,多

47、对多关系的表应分割成三张表,如前一个面试题。第三范式是不不能存在传递递依赖,即除除了主键之外外的其他字段段必须直接依依赖于主键。比如empp表里的deeptno依赖于emppno,而lloc依赖于于empnoo所以不能放放一张表里。七PL_SQL是是Oraclle里面的一一个编程语言言,比较有用用,在Oraacle内部部写一些存储储过程,触发发器,函数。基本上每一一种数据库都都有这么一个个语言,SQQL-Serrver叫做做T_SQLL,如果每个个都学比较累累,但是可以以取学一种然然后其他实在在要用时再查查上手要快很很多。可能以以后我们接触触的写存储过过程机会很少少,实际上我我们用SQLL和J

48、avaa程序就可以以解决大部分分问题了,这这只是让大家家有个了解知知道有这么回回事。PL语言用来补补充SQL语语言的,因为为后者不带有有分支和循环环,对于有些些问题求解不不便,而过程程语言可以解解决。PL_SQQL写程序非非常固定,分分为四块,第第一块叫deeclaree,声明各种种变量和游标标的地方,可可选;第二个个叫begiin,就是说说程序从这开开始执行了;excepption是是catchh到任何异常常时要执行的的;end是是结束,后面面得有一个分分号。set serrverouutput on;begin dbms_ooutputt.put_line(hi,ppl_sqll!);en

49、d;/第一句是将内部部环境变量打打开,默认的的是关掉的,不不然看不到任任何输出结果果。dbmss_outpput相当于于systeem.outt而put_line相相当于priintln。declaree v_namme varrchar22(20);begin v_namme := huannggangg; dbms_outpuut.putt_linee(v_naame);end;/变量名的写法是是v_+名字字,声明的时时候是变量名名在前,类型型在后;赋值值语句有点像像pascaal冒号等号号;declaree v_naame nuumber := 0; begin v_naame := 2

50、/v_name; dbmss_outpput.puut_linne(v_nname); excepttion whenn otheers thhen dbbms_ouutput.put_lline(Errorr!); end; /当检测到异常时时才执行exxceptiion,whhen otthers then 这样做就相相当于一张大大网子,肯定定能把异常捕捕获到。PL_SQLL变量声明规规则:变量名名不能够使用用保留字(OOraclee里保留字很很多所以推荐荐使用v_+名字,这样样不易冲突),如select、from等;第一个字符必须是字母;变量名最多包含30个字符;不要与数据库的表或者列同

51、名;每一行只能声明一个变量。常用变量类型7种:binary_integer整数主要是计数而不是用来表示字段类型(用来for循环,数组下标,效率比较高,Oracle追求的目标);number数字类型;char定长字符串;date日期;long长字符串可达2GB;boolean布尔可取true、false或null值,建议大家布尔类型在用的时候一定要给一个初值,否则是null。declaree v_teemp nuumber(1); v_coount bbinaryy_inteeger :=0; v_sal numbeer(7,22) := 4000.00; v_datee datee := ss

52、ysdatte; v_pi cconstaant nuumber := 3.14; v_valiid booolean := faalse; v_namee varcchar2(20) nnot nuull :=myNaame; begin dbmss_outpput.puut_linne(v_temp valuee:|vv_datee); end; /dbms_ouutput.put_lline不能能打印处布尔尔类型的值。Constaant相当于于Java的的finall ,nott nulll对变量进行行限制。Oracle里里面的变量经经常用来存储储某一张表的的某个字段的的值,使用%typ

53、e属属性为了解决决表里字段的的变动与声明明变量类型一一致。在PLL_SQL里里面可以使用用 两个短横横线注释掉一一行,注释掉掉多行的时候候用/* */。declaree v_emmpno nnumberr(4);v_empnoo2 empp.empnno%typpe; v_emmpno3 v_emppno2%ttype; begin dbmss_outpput.puut_linne(Teest); end;%type可以以看做变量的的一个属性,指指示其类型;引用某张表表某个字段方方法如v_eempno22 emp.empnoo%typee;。下面接着讲PPL_SQLL里面复杂的的变量,可以以定

54、义复合变变量,有两种种:Tablle相当于JJava里的的数组;Reecord相相当于Javva里的类,暂暂且这样理解解。要指定ttable的的数据类型,比比较复杂是这这样来做type type_tablee_emp_empnoo is ttable of emmp.emppno%tyype inndex bby binnary_iintegeer;typpe定义了一一种新的数据据类型名字叫叫type_tablee_emp_empnoo,然后可以以用它定义新新变量如 vv_empnnos tyype_taable_eemp_emmpno;。比较有意思思的是下标可可以取负值如如v_emppnos

55、(-1)。是什么促使了rrecordd类型数据的的出现呢?我我们现在写的的是PL_SSQL,它最最主要用于操操纵表,表里里面有字段、记录,如果果把一条记录录放一个变量量里以后用起起来要方便得得多。声明这这种类型的方方式如:declaree type type_recorrd_deppt is recorrd( depttno deept.deeptno%type, dnamme deppt.dnaame%tyype, loc dept.loc%ttype); v_temmp typpe_reccord_ddept;begin v_temmp.depptno := 50; v_temmp.dna

56、ame := aaaaa; v_temmp.locc := bj; dbms_outpuut.putt_linee(v_teemp.deeptno| | v_ttemp.ddname);end;/这样声明还有一一个弊病,那那就是当字段段改变时控制制起来比较烦烦人,为此引引入rowttype属性性来声明reecord变变量。只需:declaree v_temmp deppt%rowwtype;begin v_temmp.depptno := 50; v_temmp.dnaame := aaaaa; v_temmp.locc := bj; dbms_outpuut.putt_linee(v_tee

57、mp.deeptno| | v_ttemp.ddname);end;/PL_SQL语语句里的seelect语语句只能返回回一条记录,且且selecct语句里面面必须有个iinto或使使用游标,还还要保证有且且仅有一条记记录被返回,这这是它比较特特别的地方,不不然会报错。在PL_SSQL里面使使用inseert、deelete、updatte后加上ccommitt不然起不了了作用有时,只只不过。同时还有这这么一个需求求-执行上述述语句以后有有多少条记录录受影响(除除selecct,对它来来说没多大意意义),这样样做:dbms_ouutput.put_lline(ssql%roowcounnt|条

58、记录录受影响);sql代代表刚刚执行行完的sqll语句,而rrowcouunt代表刚刚刚执行完的的sql语句句影响了多少少条记录。如果在PL_SQL里创创建一张表得得这样写:eexecutte immmediatte crreate tablee T(nnnn varrchar22(20) deffault aaaa);由于外面已已经有单引号号了所以里面面的一个单引引号得用两个个代表一个。defauult是给一一个默认值。PL_SQL里里条件语句是是形如if (条件) then elsiif (条件件) theen elsee end if;注意意最后一个eelse后没没有thenn,其他条件

59、件后有,而且且elsiff没有那个ee,最后以eend iff;结束。PL_SQL里里也有三种循循环,首先看看第一种,如如下:declareei binarry_intteger :=0;begin loopdbms_ouutput.put_lline(ii);i:= i+11;exit whhen (ii=11); end lloop;end;这也类似于Jaava里的ddo -whhile循环环;第二种,如下:declaree j binnary_iintegeer :=11;begin whilee j111 looppdbms_ouutput.put_lline(jj);j := j+1

60、; end lloop;end;这也类似于Jaava里的wwhile循循环;第三种,如下:beginbeginfor k iin 1.10 looopdbms_ouutput.put_lline(kk);end looop; for k in reeversee 1.110 looop dbms_ooutputt.put_line(k); end looop;end;这类似于Javva里的foor循环,rreversse表示逆序序循环,1.100指定循环范范围。PL_SQL里里也可以逮某某种类型的错错误,Javva里每一种种excepption都都有相应的类类为代表,同同理PL_SSQL里也一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论