ORACLE数据库教程资料_第1页
ORACLE数据库教程资料_第2页
ORACLE数据库教程资料_第3页
ORACLE数据库教程资料_第4页
ORACLE数据库教程资料_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

ORACLE数据库教程你可以不知道,但是绝对不能不懂--毁人不倦语录2007年5月SQL基础知识篇SQL-001​简介SQL(StructuredQueryLanguage)结构化查询语言是IBM公司SanJose实验室为SystemR而设计的查询语言,后被国际标准化组织(ISO)批准作为关系数据库语言的国际标准。SQL目前遵循的是1992年标准,即SQL-92。各数据库厂家对SQL-92标准均有扩充,扩充部分不能完全保证数据库之间的兼容性。我的热情会灼伤一些人,但我是无心的--毁人不倦语录​简介SQL可以分为:(基础篇只介绍前两种)DML:数据操作语言(DataManipulationLanguage):select,insert,update,delete,(其他:truncate)DDL:数据定义语言(DataDefinitionLanguages):create,drop,alter,(其他:rename)DCL数据控制语言:grant、revoke、setrole事务控制:commit、rollback、savepoint(其他:locktable、setconstraint(s)、settransaction)审计控制:audit、noaudit系统控制:altersystem会话控制:altersession其他语句:comment(添加注释)、explainplan、analyze、validate、call如果我的话没有错,一定是你听错了--毁人不倦语录​DDL数据定义语言CREATE(建立)ALTER(修改)DROP(删除)无知者无畏,无畏者不一定无知--毁人不倦语录​语言描述约定[]:表示可选项{|}:表示选择项CREATE:粗体表示关键字或必输项Table_name:斜体表示用户输入项创建

:蓝色表示说明如果1+1>2,我相信那说的是团队的力量--毁人不倦语录​DDL数据定义语言CREATE--创建用户CREATEUSERuser_nameIDENTIFIEDBYpassword[DEFAULTTABLESPACEtablespace_name][TEMPORARYTABLESPACEtablespace_name];创建user_name用户,密码为password,使用tablespace_name表空间,如果没有指定表空间,默认表空间为system表空间。Oracle10g有用户默认表空间设置。建议在创建用户时一定要指名表空间。先有鸡,还是先有蛋,这么重要的问题还是留给鸡去考证吧--毁人不倦语录​DDL数据定义语言CREATE--创建数据表CREATETABLEtable_name(Column1datatype[default][notnull][primarykey],[………,][constraintkey_nameprimarykey(column_list)[usingindextablespacetablespace_name]])[tablespacetablespace_name];Datatype是数据类型:varchar2(x),number(x,x),date,integer等。Notnull非空限制,如果不写表示可为空。Primarykey主键,可以紧跟在字段后,或在最后使用constraint。未指名表空间,数据表建立在用户默认的表空间中。笔只留下了痕迹,人用笔留下了文化--毁人不倦语录​DDL数据定义语言CREATE--创建索引CREATE[UNIQUE]INDEXindex_nameONtable_name(column_list)[tablespacetablespace_name];在table_name表上按照column_list建立索引,索引名为index_name,索引保存在tablespace_name表空间中。UNIQUE:唯一性索引。--毁人不倦语录你可以不听,但是我一定要说​DDL数据定义语言ALTER--修改表ALTERTABLEtable_nameRENAMETOnew_table_name;将table_name表名修改为new_table_name。ALTERTABLEtable_nameADD(column1datatype[default][notnull],column2datatype[default][notnull],…..);在table_name表中增加column1,column2..字段,追加到字段最后。ALTERTABLEtable_nameMODIFY(column1datatype[default][{notnull|nullable}],column2datatype[default][{notnull|nullable}],…..修改table_name表字段属性,长度或精度不能小于原长度或精度。ALTERTABLEtable_nameDROPCOLUMNcolumn_name;删除table_name表中的column_name字段。ALTERTABLEtable_nameRENAMECOLUMNold_nameTOnew_name;修改table_name表的old_name字段名为new_name。ALTERTABLEtable_nameADDCONSTRAINTpk_namePRIMARYKEY(column_list);建立table_name表的主键,主键名pk_name,主键字段column_list。ALTERTABLEtable_nameDROPCONSTRAINTpk_name;删除table_name表的pk_name主键。一个表只能有一个主键--毁人不倦语录不说了,再说就该吐了。补充一点:站着进,扶着出也许是侃爷的最高境界吧​DDL数据定义语言DROP--删除DROPTABLEtable_name;删除table_name表。DROPINDEXindex_name;删除index_name索引。删除主键(强制限制的一种),使用ALTERTABLEtable_nameDROPCONSTRAINTpk_name;--毁人不倦猜想数据库和水库之间不可能没有区别​DML小结从ALTER和CREATE及DROP语法数量再一次证明需求是易变的。如果增加表字段,并要求字段的排列位置,可以使用:CREATETABLEtemp_table_nameASSELECT*FROMtable_name;DROPTABLEtable_name;CREATETABLEtable_name(column…);INSERTINTOtable_nameVALUES(column_list)(SELECTcolumn_list1FROMtemp_table_name);DROPTABLEtable_name;需要注意的是,删除表后,表中的索引也被删除,所以,在执行上述操作前要保留好表的索引脚本。这里没有写DROPDATABASE的语法,如果大家想要尝试删除数据库的话,最好在专家的指导下进行!人间本无对错,因为计算机才有了对与错--毁人不倦语录​DDL数据操作语言SELECT(查询)INSERT(插入)UPDATE(更新)DELETE(删除)如果老天能再给我一次机会,我一定做甲方--毁人不倦语录​DDL数据操作语言SELECT--查询SELECT[ALL|DISTINCT[ON(expression[,...])]]*|expression[ASoutput_name][,...][INTO[TEMPORARY|TEMP][TABLE]new_table][FROMfrom_item[,...]][WHEREcondition][GROUPBYexpression[,...]][HAVINGcondition[,...]][{UNION|INTERSECT|EXCEPT[ALL]}select][ORDERBYexpression[ASC|DESC|USINGoperator][,...]][FORUPDATE[OFclass_name[,...]]][LIMIT{count|ALL}[{OFFSET|,}start]]

后续查询范例均以oracle中的SCOTT/TIGER用户表为例如果失眠了,就看看上面的语法吧--毁人不倦语录​DDL数据操作语言SCOTT/TIGER表介绍DEPT部门定义表,DEPTNO是主键EMP职工表,EMPNO主键,DEPTNO外键关联DEPT其他表没有数据或没有关系,不在这里介绍将复杂问题简单化是修养,将简单问题复杂化是艺术,综合起来叫艺术修养--毁人不倦语录​DDL数据操作语言SELECT--单表查询查询表中所有字段和所有记录,select后跟*表示所有字段SELECT*FROMDEPT;查询指定字段,在select后跟查询的字段名列表,字段间用’,’隔开SELECTDEPTNO,DNAMEFROMDEPT;条件查询,FROM后面使用WHERE,在WHERE中可以使用=,<>,>,<,>=,<=,BETWEEN,LIKE,IN,返回WHERE条件为true的数据SELECT*FROMDEPTWHEREDEPTNO=20;

--返回部门编码为20的部门数据SELECT*FROMDEPTWHEREDEPTNOBETWEEN20AND30;--返回部门编码在20到30之间的部门数据(包括20和30)同意的从门出去,反对的请走窗户--毁人不倦语录​DDL数据操作语言SELECT--单表查询SELECT*FROMDEPTWHEREDNAMELIKE‘ACCOUNT%’;--返回部门名称以ACCOUNT开始的部门数据SELECT*FROMDEPTWHEREDNAMELIKE‘%UNT%’;--返回部门名称含UNT的部门数据,%全匹配符,?单匹配符SELECT*FROMDEPTWHEREDEPTNOIN(20,30)AND(DNAMELIKE‘%UNT%’ORDNAME=‘SALES’);--返回部门编码等于20和30并且部门名称含UNT或等于SALES的部门数据,AND与,OR或,IN和(等同OR)知识可以拷贝,思想无法复制--毁人不倦语录​DDL数据操作语言SELECT--多表查询在FROM中列举表名,WHERE中写表关联SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNOANDDEPT.DEPTNO=20;--字段名前使用表名.指定表字段,在WHERE中先写表关联关系,从FROM的内侧(即左侧)向外侧写(即右侧),表关联写完后再写查询条件,不要把表管理和查询条件混在一起写,这虽然不是必须的,但却是规范推荐的。SELECTE.EMPNOAS职工编码,E.ENAME

姓名,E.JOB,D.DEPTNO,D.DNAMEFROMEMPE,DEPTDWHEREE.DEPTNO=D.DEPTNOANDD.DEPTNO=20;--字段和表名可以使用别名,方法为AS别名,或直接写别名,表如果指定别名,原表名在该查询中不能再被使用。淹死的都是会游泳的,累死的都是能干的--毁人不倦语录​DDL数据操作语言SELECT--Joins(连接)语法

{T1}[NATURAL][INNER|{LEFT|RIGHT|FULL}[OUTER]]JOIN{T2}{ONsearchcondition|USING(joincolumnlist)}一个条件JOIN必须通过提供一个(并且只能有一个)NATURAL,ON,或者USING这样的关键字来声明它的连接条件.ON子句接受一个searchcondition,它与一个WHERE子句相同.USING子句接受一个用逗号分隔的字段名列表,连接表中必须都有这些字段,并且用那些字段连接这些表。NATURAL是USING子句的缩写,它列出两个表中所有公共的字段名字。对于所有JOIN而言,INNER和OUTER都是可选的.INNER是缺省.LEFT,RIGHT和FULL只用于OUTERJOIN。​DDL数据操作语言SELECT—INNERJOIN内连接对于T1的每行R1,连接成的表在T2里都有一行满足与R1的连接条件。SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMPJOINDEPTUSING(DEPTNO);结果同:SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNOINNERJOIN完全可以写成WHERE子句重复两遍后你就应该把他变为程序--毁人不倦语录​DDL数据操作语言SELECT—OUTERJOIN外连接LEFT[OUTER]JOIN首先执行一次INNERJOIN,然后,如果T1里有一行对任何T2的行都不满足连接条件,那么返回一个连接行,该行的T2的字段为null。左表数据全部返回,右表无对应数据返回NULL。Oracle也可以写成:WHEREEMP.DEPTNO=DEPT.DEPTNO(+)RIGHT[OUTER]JOIN首先执行一次INNERJOIN,然后,如果T2里有一行对任何T1的行都不满足连接条件,那么返回一个连接行,该行的T1的字段为null。右表数据全部返回,左表无对应数据返回NULL。Oracle也可以写成:WHEREEMP.DEPTNO(+)=DEPT.DEPTNOFULL[OUTER]JOIN首先执行一次INNERJOIN,然后,如果T1里有一行对任何T2的行都不满足连接条件,那么返回一个连接行,该行的T1的字段为null。同样,如果T2里有一行对任何T1的行都不满足连接条件,那么返回一个连接行,该行的T2的字段为null。两个表数据全部返回,相互之间没有对应数据返回NULL。三分技术,七分管理--毁人不倦语录​DDL数据操作语言SELECT--DISTINCT取差异数据,在SELECT查询列表中只返回有差异的结果集。SELECT--统计函数

统计操作(AVG,COUNT,SUM,MIN,MAX)以表达式为参数。满足WHERE子句的行均被计算,通常,一个聚集对整个SELECT语句生成一个计算结果。如果在一个查询里面声明了分组,那么数据库将对每个组进行一次独立的计算。SELECT--分组操作SQL使用GROUPBY实现查询结果的分组,GROUPBY后面跟着字段列表,字段列表值均相同的记录成为一组。分组操作伴随聚集操作使用才有使用价值(注意:是分组伴随聚集,而不是聚集伴随分组)。SELECT--HAVING

在分组操作后可以跟HAVING子句,限定分组统计函数的查询结果。WHERE是分组之前限定查询结果,HAVING是对分组后的限定,即:HAVING伴随GROUPBY子句才有意思。难道我现在是和上帝说话?怎么总是没有回答!--毁人不倦语录​DDL数据操作语言SELECT--范例查询人数和人次,KC61是中心门诊报销表,其中AAC001是个人编码,一个人只有一个唯一的编码,可以使用DISTINCT和聚集查询SELECTCOUNT(*)AS人次,COUNT(DISTINCT(AAC001))AS人数FROMKC61;统计各部门人数、工资总额和平均工资SELECTDEPTNO,COUNT(*)AS人数,SUM(SAL)AS工资总额,AVG(SAL)AS平均工资FROMEMPGROUPBYDEPTNO;如果需要显示部门名称,必须关联DEPT表SELECTD.DEPTNO,D.DNAME,COUNT(*)AS人数,SUM(E.SAL)AS工资总额,AVG(E.SAL)AS

平均工资FROMSCOTT.DEPTD,SCOTT.EMPEWHERED.DEPTNO=E.DEPTNOGROUPBYD.DEPTNO,D.DNAME;--非聚集字段必须在GROUPBY中列举,如果列举字段太多势必影响性能,可以使用查询子句解决此问题,有关查询子句见后详述。解决问题的问题,而不是问题,这是关键性问题--毁人不倦语录​DDL数据操作语言SELECT--UNION,UNIONALL,MINUS,INTERSECT返回两个查询结果的集合操作,两个查询结果集必须字段相同。UNION和UNIONALL并集操作,UNION并集后去掉重复结果,UNIONALL直接并集MINUS差集操作INTERSECT交集操作SELECT*FROMSCOTT.DEPTUNIONSELECT*FROMSCOTT.DEPTWHEREDEPT.DEPTNO=20;--返回所有部门,因为去掉了重复的结果SELECT*FROMSCOTT.DEPTUNIONALLSELECT*FROMSCOTT.DEPTWHEREDEPT.DEPTNO=20;--返回所有部门,部门编码为20的有两条。工作境界:吃苦耐劳,苦中作乐,乐在其中,无苦无乐--毁人不倦语录​DDL数据操作语言SELECT--ORDERBYORDERBY排序,跟数字(代表字段位置)或字段名,ASC升序,DESC降序,默认升序。SELECTDEPTNO,DNAMEFROMSCOTT.DEPTWHEREDEPTNO>10GROUPBYDEPTNO,DNAMEHAVINGCOUNT(*)>0ORDERBYDEPTNODESC;

--ORDERBY是对返回的结果进行排序,所以必须放在最后一句。SELECTDEPTNO,DNAMEFROMSCOTT.DEPTWHEREDEPTNO>10GROUPBYDEPTNO,DNAMEHAVINGCOUNT(*)>0ORDERBY1DESC;

--结果同第一个查询,字段位置从1开始。我是来做项目的,不是来创造奇迹的--毁人不倦语录​DDL数据操作语言SELECT--FORUPDATE锁等待查询。当查询结果中有被锁定记录时等待解锁,当记录被解锁后返回结果集,并锁定返回的记录。如果FORUPDATE后跟NOWAIT,遇到锁后不等待,返回错误。ORACLE使用记录级锁定,当事物被提交或回滚后锁定被释放。死锁问题当两个事物以不同的顺序同时更新多个表时就会发生死锁(对牛),解决死锁的途径是手工杀掉死锁的进程或者重新启动数据库。因此,在使用事物更新多表数据时一定要小心,使用面向对象的方法封装数据操作可以在很大程度上解决死锁问题。没有经过严格测试的软件开发进度报告不看也罢--毁人不倦语录​DDL数据操作语言SELECT--子查询查询语句可以嵌套,任何产生数值的地方都可以使用子查询。在查询条件中使用子查询时,当子查询返回多个结果时只能使用IN。查询顺序是先执行被依赖的底层查询,然后一层层向上查。子查询只被执行一次。查询平均工资最低的部门情况SELECTDEPTNO,AVG(SAL)FROMSCOTT.EMPGROUPBYDEPTNOHAVINGAVG(SAL)=(SELECTMIN(AVG(SAL))FROMSCOTT.EMPGROUPBYDEPTNO);--子查询先查询出最低的部门平均工资,然后查询部门最低平均工资等于子查询工资的部门就是喜欢编程也不能为了编程而放弃和用户的功能确认,如果你把用户对程序的任意修改提升为对你自身价值的否定,你还不先确认吗?--毁人不倦语录​DDL数据操作语言SELECT--子查询在FROM中使用子查询,子查询在这里相对与VIEWSELECTD.DEPTNO,D.DNAME,S.AVG_SAL,S.SUM_SAL,S.NUMFROMSCOTT.DEPTD,(SELECTDEPTNO,AVG(SAL)ASAVG_SAL,SUM(SAL)ASSUM_SAL,COUNT(*)ASNUMFROMSCOTT.EMPGROUPBYDEPTNO)SWHERED.DEPTNO=S.DEPTNO;在WHERE中使用子查询,例子不好,应该直接写表关联,这里只是为了说明语法。SELECT*FROMSCOTT.EMPWHEREDEPTNOIN(SELECTDEPTNOFROMSCOTT.DEPTWHEREDEPTNO=20);驴怎么了?人家采用的可是软件工程中的螺旋法则--毁人不倦语录​DDL数据操作语言SELECT--子查询使用EXISTS(NOTEXISTS)替换IN(NOTIN)IN(NOTIN)在执行数据库操作时性能非常低下,应该使用EXISTS(NOTEXISTS)替换,特别是NOTIN子句将执行一个内部的排序和合并;EXISTS子查询使用主表的字段限制查询数据SELECT*FROMSCOTT.EMPE

WHEREEXISTS(SELECT*FROMSCOTT.DEPTWHEREDEPT.DEPTNO=E.DEPTNOANDDEPTNO=20);--因为EXISTS可以看到外表,所以,如果表名重复,使用表别名区分,在子查询中一定写清楚和外表的关联关系,另外,子查询写SELECT*是对的,不用写字段名。多做一点,早知道一点--毁人不倦语录​DDL数据操作语言UPDATE—修改用来更新数据表中的数据

UPDATEtable_name

SETcolumn_name=new_value[,…]

WHEREcondition;更新DEPT表,将20号部门名称修改为’销售部’,地址修改为’北京’UPDATEDEPT

SETDNAME='销售部',

LOC='北京'

WHEREDEPTNO=20;子查询也可在UPDATE中使用,将职工领导是KING的人员薪资增加100元UPDATESCOTT.EMPSETSAL=SAL+100WHEREEMPNOIN(SELECTE.EMPNOFROMSCOTT.EMPE,SCOTT.EMPGWHEREE.MGR=G.EMPNOANDG.ENAME='KING');UPDATESCOTT.EMP

SETSAL=SAL+100

WHEREEXISTS(SELECT*FROMSCOTT.EMPE,SCOTT.EMPG

WHEREE.MGR=G.EMPNO

ANDE.EMPNO=EMP.EMPNO

ANDG.ENAME='KING');

金保工程是“阳光工程”,所以我才阳光--毁人不倦语录​DDL数据操作语言INSERT--插入语法:INSERTINTOtable_name[(column[,...])]{VALUES(expression[,…])|SELECTquery}当表字段和插入值相同时,可以省略字段列表INSERTINTOSCOTT.BONUSVALUES('TURNER','SALESMAN',200,40);当只插入部分字段时,必须列举字段,未赋值字段使用默认值或为空INSERTINTOSCOTT.BONUS(ENAME,JOB,SAL)VALUES('CLARK','MANAGER',100);也可以使用查询给表插入数据INSERTINTOSCOTT.BONUS(ENAME,JOB,SAL)SELECTENAME,JOB,SALFROMSCOTT.EMPWHEREMGR=7698;

理论上都是问题,做起来没有问题--毁人不倦语录​DDL数据操作语言DELETE--删除语法:DELETEFROMtable_nameWHEREcondition;删除BONUS中ENAME为‘CLARK’的记录DELETEFROMSCOTT.BONUSWHEREENAME='CLARK'删除重复记录,ROWID是记录的物理位置,一经确定永不改变DELETEFROMSCOTT.BONUSBWHEREROWID<(SELECTMAX(ROWID)FROMSCOTT.BONUSWHEREBONUS.ENAME=B.ENAMEGROUPBYENAMEHAVINGCOUNT(*)>1);--删除ENAME重复记录自己先擦块玻璃再交代给别人擦,安排工作同理--毁人不倦语录​序列号创建CREATESEQUENCEname[INCREMENTBYn][STARTWITHn][{MAXVALUEn|NOMAXVALUE}][{MINVALUEn|NOMINVALUE}][{CYCLE|NOCYCLE}][{CACHEn|NOCACHE}];说明:INCREMENTBYn一次增长n个数字STARTWITHn初始值NOMAXVALUE缺省值10E+27NOMINVALUE缺省值1NOCYCLE不循环,常用于唯一关键字CACHEn在内存里缓存n个序列,出错回退时会丢失创建从1开始,不缓存的EMP_EMPNO序列。CREATESEQUENCEEMP_EMPNOSTARTWITH1NOCACHE;修改ALTERSEQUENCEname[INCREMENTBYn][{MAXVALUEn|NOMAXVALUE}][{MINVALUEn|NOMINVALUE}][{CYCLE|NOCYCLE}][{CACHEn|NOCACHE}];--起始值不能改变,如果要改变序列的起始值,先删除,再新建。删除DROPSEQUENCEname;DROPSEQUENCEEMP_EMPNO;​序列号使用NEXTVAL下一个序列号值CURRVAL当前序列号值如果EMP_EMPNO是一个序列号,可以用下面SQL取序列值--去序列的当前值SELECTEMP_EMPNO.CURRVALFROMDUAL;--去序列的下一个值SELECTEMP_EMPNO.NEXTVALFROMDUAL;--使用序列插入数据INSERTINTOEMP(EMPNO,ENAME,…)VALUES(EMP_EMPNO.NEXTVAL,‘JONE’,…);不能用序列号的nextval和currval的地方视图查询、distinct查询、有groupby,having,orderby的查询、有子查询的查询、表里的缺省值​注释/*注释内容*/--注释内容--SELECT*DELETEFROMEMPWHEREDEPTNO=20;提示:删除数据前最好先查询一下。可以先写SELECT*,然后把SELECT*注释掉,增加DELETE。如果再想不出来就去上厕所--毁人不倦语录​常用函数数字函数ABS取绝对值POWER乘方LN10为底数取幂SQRT平方根EXPe的n次乘方LOG(m,n)m为底数n取幂数学运算函数:ACOSATANATAN2COSCOSHSIGNSINSINHTANTANHCEIL大于或等于取整数FLOOR小于或等于取整数MOD取余数ROUND(n,m)按m的位数取四舍五入值如果round(日期):中午12以后将是明天的日期.round(sysdate,'Y')是年的第一天TRUNC(n,m)按m的位数取前面的数值如果trunc(日期),确省的是去掉时间冲锋号响起后执行的是命令而不是计划--毁人不倦语录​常用函数字符函数CHR按数据库的字符集由数字返回字符CONCAT(c1,c2)把两个字符c1,c2组合成一个字符,和||相同REPLACE(c,s,r)把字符c里出现s的字符替换成r,返回新字符SUBSTR(c,m,n)m大于0,字符c从前面m处开始取n位字符,m等于0和1一样,m小与0,字符c从后面m处开始取n位字符TRANSLATE(c,f1,t1)字符c按f1到t1的规则转换成新的字符串INITCAP字符首字母大写,其它字符小写LOWER字符全部小写UPPER字符全部大写LTRIM(c1,c2)去掉字符c1左边出现的字符c2RTRIM(c1,c2)去掉字符c1右边出现的字符c2TRIM(c1,c2)去掉字符c1左右两边的字符c2LPAD(c1,n,c2)字符c1按指定的位数n显示,不足的位数用c2字符串替换左边的空位RPAD(c1,n,c2)字符c1按指定的位数n显示,不足的位数用c2字符串替换右边的空位提示:去掉字符串中间的空格可以使用replace如果有三条路供你选择,不要选中间的,剩下两条可以扔硬币决定--毁人不倦语录​常用函数日期函数ADD_MONTHS(d,n)日期值加n月LAST_DAY(d)返回当月的最后一天的日期MONTHS_BETWEEN(d1,d2)两个日期值间的月份NEXT_DAY(d)返回日期值下一天的日期SYSDATE当前的系统时间DUAL是SYS用户下一个空表,它只有一个字段dummy提示:dual可以理解为虚表,多在查询系统函数返回值时使用,以满足SELECT语法规则,如selectsysdatefromdual;select3+4fromdual;零也是钱--毁人不倦语录​常用函数转换函数TO_CHAR(date,'日期显示格式')TO_CHAR(number)用于显示或报表的格式对齐TO_DATE(char,'日期显示格式')TO_LOB把long字段转换成lob字段TO_NUMBER(char)用于计算或者比较大小日期显示格式年:YYYY,YEAR,YY季:Q月:MM,MONTH,MON日:DD,DAY,DY时:HH24,HH12,HH(12小时)分:MI秒:SS还差最后一点--毁人不倦语录​常用函数逻辑比较函数NVL(EXPR1,EXPR2)当EXPR1为空用EXPR2替代DECODE(EXPR﹐V1﹐R1﹐V2﹐R2....)当EXPR=V1时返回R1当EXPR=V2是放回V2…EXPR后条件和返回值成对出现,最后一个单值是不在条件中的返回值,如果没有单值,不满足条件的返回NULL。SELECTENAME,DECODE(JOB,'MANAGER','经理','PRESIDENT','总裁','SALESMAN','销售','不详')FROMSCOTT.EMP;CASEWHENconditionTHENexpress1ELSEexpress2END当condition成立返回express1否则返回express2SELECTENAME,HIREDATE,(CASEWHENTO_NUMBER(TO_CHAR(HIREDATE,'MM'))>6THEN'下半年'ELSE'上半年'END)AS入职时间FROMSCOTT.EMP;--TO_CHAR(HIREDATE,'MM')取时间月份写SQL时小心一点,别让硬盘飞出来伤到你--毁人不倦语录​演讲完毕,谢谢观看!附录资料:不需要的可以自行删除​oracle数据库培训内容*基本概念*Oracle的体系结构SQL*Plus的使用及常用命令*SQL*NET的配置和使用数据库的备份(exp/imp)其它常见问题​一、基本概念什么是数据库:是存储在一起的相关数据的集合。这些数据无有害或不必要的冗余,为多种应用服务。数据的存储独立于使用它的应用程序。对数据库插入新数据、修改和检索原有数据均能用一种公用的和可控的方法进行。数据库能做什么:数据库的基本功能就是存储数据,而且能够为用户提供便捷、快速的查找、修改、添加和删除数据等功能。什么是SQL语言:是运用于数据库的语言。它除了具有数据库查询、插入、删除、修改等功能外,可以独立使用,也可以嵌入其它主语言中使用。它的语法类似于英语。​什么是oracle:oracle是以高级结构化查询语言(SQL)为基础的大型关系数据库,通俗地讲它是用方便逻辑管理的语言操纵大量有规律数据的集合。是目前最流行的客户/服务器(CLIENT/SERVER)体系结构的数据库之一。​二、Oracle的体系结构(1)物理结构

ORACLE数据库在物理上是存储于硬盘的各种文件。它是活动的,可扩充的,随着数据的添加和应用程序的增大而变化。datafilesredologfilescontrolfilesparameterfile

数据文件日志文件控制文件参数文件

datafilesredologfilescontrolfileparameterfiles*.dbf*.logInitoraid.ora*.ctl​(2)session(连接)

Oracle是多用户、多任务、可分布式管理的数据库,同

时可有许多个用户对数据库操作。oracleuseruserusersession……​

ORACLE数据库在逻辑上是由许多表空间构成。主要分为系统表空间和非系统表空间。非系统表空间内存储着各项应用的数据、索引、程序等相关信息。我们准备上马一个较大的ORACLE应用系统时,应该创建它所独占的表空间,同时定义物理文件的存放路径和所占硬盘的大小。Oracle数据存储单位a、block数据块:2k最小的I-O单位,伴随database产生而产生,不可变b、extent一组连续的数据块:是用户所能分配存储的最小单位c、segment段:有共同结构的一个或几个区域(extent)d、tablespace表空间:一组物理数据的逻辑组合,(象逻辑间数据仓库)e、file文件:属于某个表空间的物理文件f、database数据库:一组表空间所构成的逻辑的可共享的数据。(3)存储结构​表空间tablespacesystemRBSnosystem把system表空间单独放在一个硬盘上做成一组镜像toolsuserstempapplicationdataapplicationindex分开存放减少争用​segment段的分类data数据段存储对象object(table,view,index,sequence...)index索引段temporary临时段用做(join,groupby,orderbysorting操作)rollback回滚段用于记录修改前后信息bootstrap启动段存储数据字典系统信息不能读写,放在系统表空间内,约占40几个block​datasegment中可能有十种不同类型的存储对象(1)table(2)view实为一个select语句(3)index(一个表不多于3个)(4)cluster(簇)(5)sequence序列(6)synonyms用于定义某个远程数据库同义词,实现分式数据库管理透明(7)snapsot快照(8)storedprocedure(function)(9)package程序包(10)dbtrigger数据触发器,处理updata,delete,insert中可能出现的问题​常用的ORACLE的数据库字段类型字段类型中文说明限制条件其它说明CHAR固定长度字符串最大长度2000bytesVARCHAR2可变长度的字符串最大长度4000bytes可做索引的最大长度749DATE日期(日-月-年)LONG超长字符串最大长度2G(231-1)足够存储大部头著作RAW固定长度的二进制数据最大长度2000bytes可存放多媒体图象声音等LONGRAW可变长度的二进制数据最大长度2G同上NUMBER(P,S)数字类型P为整数位,S为小数位INTEGER整数类型小的整数FLOAT浮点数类型NUMBER(38),双精度REAL实数类型NUMBER(63),精度更高……​三、SQL*Plus的使用及常用命令进入sql*plus;数据查询操作(select);改变数据操作(insert、update、delete);其它常用sql和sql*plus命令(spool、create、drop、desc、connect、grant……)。​数据查询操作简单查询select列名1,列名2,列名3……from表名where条件orderby列名1,列名2……;​逻辑运算符>>=<<=<>或!=其它(not)inis(not)betweenandandor单值函数nvl----空值替换函数abs---绝对值函数mod---求模函数power---求幂函数sqrt-----平方根函数exp,ln,log----对数函数sin,cos等----三角函数​唯一性查询关键字:distinctselectdistinct列名from表名where条件;​模糊查询select列名1,列名2,列名3……from表名where列名1like‘_%mm’orderby列名1,列名2……;关键字:(not)like通配符:%_​联接查询select表名1.列名1,表名2.列名2,列名3……from表名1,表名2……where条件orderby表名1.列名1,表名2.列名2……;​子查询单值子查询

多值子查询select列名1,列名2,列名3……from表名1where列名1=(select列名1from表名2where条件)orderby列名1,列名2……;select列名1,列名2,列名3……from表名1where列名1in(select列名1from表名2where条件)orderby列名1,列名2……;​组值函数avg---平均值函数count---非空值数目max---最大值函数min---最小值函数sum---求和函数distinct---唯一性函数分组查询select列名1,列名2,sum(列名3)……from表名where条件groupby列名1,列名2……;关键字:groupby​改变数据操作Insert插入操作insertinto表名1(列名1,列名2……)values(值1,值2……);注意:⑴值表中的数据用逗号间隔;⑵字符型和日期型要用单引号括起来;⑶缺省的日期格式为dd-man-yy。insertinto表名1usingselect列名1,列名2……from表名2where条件;​Update修改操作可修改单个字段、修改多行、修改单个列。update表名set列名=值或表达式where条件;​Delete删除deletefrom表名where条件;注意⑴不能只删除行的一部分⑵where子句决定哪一行将被删除。如里省略了where子句,则所有的行都将被删除。​其它常用sql命令Createtable---创建表;例子Droptable---删除表,sql同时自动删除该表上的索引、特权,但并不删除相关的视图或同义词;Grant---授权Connect-----连上Oracle,做最基本操作resource----具有程序开发最基本的权限dba----------数据库管理员所有权限​@-------运行指定的命令文件,作用等价于start命令;/---------运行sql缓冲区的命令,与run命令等价;Connect---退出当前账号,向指定的用户帐号登录;Desc-----显示指定表的结构;Exit-----中止sql*plus,返回操作系统;Spool---将屏幕显示内容输出到一个文件上;Spooloff--输出文件结束;其它常用sql*plus命令​四、SQL*NET的配置和使用1配置网络协议TCP/IP

2测试网络是否连通3在Windows95上选择“开始”按钮,选定“程序”中的“OracleforWindows95”下的“SQL*NetEasyConfiguration”,在“SQL*NetEasyConfiguration”窗口中选择“AddDatabaseAlias”,在“ChooseDatabaseAlias”对话框中“DatabaseAlias”项中键入数据库别名,按“OK”按钮确认。

在“ChooseTCP/IPHostNameandDatabase”对话框中的TCP/IPHostname项中键入SERVER的IP地址,在“DatabaseInstance”项中键入Oracle的实例名。在“ConfirmAddingDatabaseAlias”对话框中可以看到你新增加的数据库别名。按“YES”按钮,按“OK”,退出“SQL*NetEasyConfiguration”。​五、数据库备份(exp/imp)EXPORT将数据库中数据备份成一个二进制系统文件称为“导出转储文件”(EXPORTDUMPFILE),并将重新生成数据库写入文件中。它有三种模式:a.用户模式:导出用户所有对象以及对象中的数据;b.表模式:导出用户所有表或者指定的表;c.整个数据库:导出数据库中所有对象。IMPORT导入:导入的过程是导出的逆过程,这个命令先读取导出来的导出转储二进制文件,并运行文件,恢复对象用户和数据。​数据库导出过程exp80用户名/密码Enterarrayfetchbuffersize:4096>exportfile:expdat.dmp>(1)Entiredatabase(2)Users(3)Table:(2)Users>Exportgrants:yes>Exportt

温馨提示

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

评论

0/150

提交评论