版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图表SEQ图表\*ARABIC1多表查询的基本语法查一张以上的表,就叫做多表查询例子:查询出雇员名称,部门名称和部门所在地的(一般多表查询要用别名)记录记录数:查询emp有多少条纪录左右连接(重点)selecte.empno,e.ename,d.deptno,d.dname,d.locfromempe,deptdwheree.deptno=d.deptno;部门一共四个,这里只查询出三个,由于在雇员表中没有指定40部门的雇员,所以在消除笛卡尔乘机的时候没有条件符合40,假如喜欢40部门显示出来,就要用左右连接了。selecte.empno,e.ename,d.deptno,d.dname,d.locfromempe,deptdwheree.deptno(+)=d.deptno;(+)在左边,表达以右边的表为准,表达右链接。40部门出来了,所以此时就用到了有连接,证明以下规律(+)在左表达右连接(+)在右表达左连接.SQL:1999对SQL的支持(了解)范例:交叉连接(crossjoin)产生笛卡尔积select*fromemptCROSSJOINdept;查询结果产生笛卡尔积CREATETABLEEMP10ASSELECT*FROMEMPWHEREDEPTNO=10;select*fromempNATURALJOINdept;自动进行匹配范例:USING子句,直接关联的操作列select*fromempeJOINdeptdUSING(deptno)wheredeptno=30;把两张表的具体信息进行打印输出范例:ON子句自己编写连接条件select*fromempeJOINdeptdON(e.deptno=d.deptno)wheree.deptno=30;范例:左连接(左外连接)右连接(右外连接)LEFTJOINRIGHTJOIN组函数和分组记录(重点)组函数在SQL常用组函数有如下几个:COUNT()求所有记录数MAX()求最大记录数MIN()求最小记录数AVG()平均SUM()求和分组记录Groupbyselectdeptno,COUNT(empno)fromempGROUPBYdeptno;算出部门表的平均工资:selectAVG(sal)fromemp;算出每个部门的平均工资:Selectdeptno,AVG(sal)fromemp;
之所以会出现这个错误是由于数据库不知道如何在结果集中解决deptno列。考虑一下:这个查询既试图使用AVG聚合函数对多行记录进行操作,却又试图从每行中获得deptno列的值;这两个操作是不也许同时完毕的。此时必须提供一个GROUPBY子句告诉数据库将deptno列相同的行分组在一起,然后数据库就可以将这些组中的行传递给AVG函数。警告:假如查询中包含聚合函数,而所选择的列并不在聚合函数中,那么这些列就必须在GROUPBY子句中。按部门分组,并显示部门名称,以及部门员工数selectd.dname,count(e.empno)fromdeptd,empewhered.deptno=e.deptnoGROUPBYd.dname;规定查出平均工资大于2023的部门编号和平均工资selectdeptno,AVG(sal)fromempWHEREAVG(sal)>2023GROUPBYdeptno;
之所以会出现这个错误是由于WHERE子句只能用来对单行而不是行组进行过滤。要过滤行组,可以使用HAVING子句。范例:显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于¥5000。输出结果按月工资的合计升序排列1.显示所有的非销售人员:job<>’SALESMAN’select*fromempwherejob<>'salesman';2.按工作分组同时求出工资的总和Selectjob,SUM(sal)fromempWHEREjob<>’SALESMAN’GROUPBYjob;3.对分组条件进行限制Selectjob,SUM(sal)fromempWHEREjob<>’SALESMAN’GROUPBYjobHAVINGSUM(sal)>5000;4.使用排序,按升序排列Selectjob,SUM(sal)sufromempWHEREjob<>’SALESMAN’GROUPBYjobHAVINGSUM(sal)>5000orderbysu;分组的简朴原则:只要一列上存在反复的内容才考虑用分组注意:分组函数可以嵌套使用,但是在组函数嵌套的时候不能再出现分组条件的查询语句范例:求出平均工资最高的部门错误代码:Selectdeptno,MAX(AVG(sal))fromempGROUPBYdeptno;SelectMAX(AVG(sal))fromempGROUPBYdeptno;(对的)ﻬ子查询范例:规定查询出比7654工资高的所有雇员信息一方面:要知道7654雇员的工资是多少然后:以此查询结果为查询依据,只要其他工资大于sal,则表达符合条件一方面:查询出比7654工资高的所有雇员信息select*fromempwheresal>(selectsalfromempwhereempno=7654);另一方面:与7788工作同样Selectjobfromempwhereempno=7788所以:select*fromempwheresal>(selectsalfromempwhereempno=7654)andjob=(Selectjobfromempwhereempno=7788);;
数据库更新操作数据库的重要操作分为两种:1..数据库的查询操作SELECT2..数据库的更新操作uUPDATE,DELETE,INSERT此时为了保存原始的emp表的信息,在进行更新删除插入表前先将表复制一份CreatetablemyempASselect*fromemp;此时数据已经复制出来添加数据Insertintoemp(empno,ename,job,hiredate,sal,deptno)Values(7899,’张三’,’清洁工’,’20-2月-2023’,9000,40);使用简略写法(并不推荐),由于现在是要添加所有字段的内容,所以可以不写上任何字段名称,只要值的数量和顺序和数据库表中的顺序一致。Insertintomyempvalues(7899,’张三’,’清洁工’,9000,40);之前插入数据的时候,日期的格式是使用了表中固定好的格式,假如现在有这样一个日期”2023-10-10”日期格式,那么现在如何把这种格式的日期插入进去呢?使用TO_DATE()函数,将一个字符串类型的数据变为DATE类型的数据。Insertintomyemp(empno,ename,job,hiredate,sal,deptno)Values(7899,’张三’,’清洁工’,TO_DATE(‘2023-07-19’,’yyyy-mm-dd’),9000,40);修改数据UPDATE表名称set要修改的字段=新值,要修改的字段=新值….;UPDATE表名称set要修改的字段=新值,要修改的字段=新值…WHERE修改条件.;修改数据删除所有:DELETEFROM表名称局部删除:DELETEFROM表名称WHERE删除条件;事物解决范例:创建一张只包含10部分雇员的一张临时表CREATETABLEEMP10ASSELECT*FROMEMPWHEREDEPTNO=10;打开一个oracle终端,进行删除操作DELETEFROMEMP10WHERESAL=2450;显示已经删除然后再打开此外一个oracle终端,查询到sal=2450这条数据还在,证明这条数据并没有被删除,这就是oracle事务的概念。事务解决:就是保证数据操作的完整性,所有的操作要么同时成功要么同时失败。在ORACLE中对每一个连接到数据库中的窗口,都会与数据库建立一个Session。一个Session对数据库所做得修改不会立即反映到数据库的真实数据之上。是允许回滚的,当一个Session提交所有操作之后,数据库才真正做出修改。进行同样的删除操作DELETEFROMEMP10WHERESAL=2450;结果它停住了,等待第一个终端操作结束再动。----》这就是ORACLE死锁提交事务:COMMIT回滚:Roolback
ORACLE常用命令查看所有表select
table_name
fromuser_tables;显示表结构describenchar_tst(nchar_tst为表名)查询练习1.列出至少有一个员工的所有部门信息第一步:列出所有部门的员工数量Selectdeptno,count(empno)fromempgroupbydeptno;第二步:列出员工大于1的部门Selectdeptno,count(empno)fromempgroupbydeptnoHAVINGCOUNT(empno)>1;第三步:通过多表关联查,把子查询做为一个查询出来selectd.*,ed.couFROMdeptd,(SELECTdeptno,COUNT(empno)couFROMempGROUPBYdeptnoHAVINGCOUNT(empno)>1)edWHEREd.depno=ed.deptno;
2.列出薪金比SMITH多的所有员工第一步:求出smith的工资SELECTsalFROMEMPWHEREENAME=’SMITH’;第二步:selectenamefromempwheresal>(SELECTsalFROMEMPWHEREENAME=’SMITH’);3列出所有员工姓名及其直接上级的姓名此程序属于自身关联查询SELECTe.ename,d.enameFROMempe,empdwheree.mgr=d.empno;4.列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称自身关联,查找mgr=empno的同时还要比较Hiredate第一步:SELECTe.empno,e.enameFROMempe,empmWHEREe.mgr=m.empnoANDe.hiredate<m.hiredate;查找e表的直属领导编号等于m表的员工,也就是说m表是领导表,m表的雇佣日期晚于e表第二步:查找e表的直属领导编号等于m表的员工,也就是说m表是领导表,m表的雇佣日期晚于e表SELECTe1.empno,e1.ename,d.dnameFROM(SELECTe.empno,e.enameFROMempe,empmWHEREe.mgr=m.empnoANDe.hiredate<m.hiredate)e1,deptdWHEREe1.deptno=d.deptno;ORA-00904invalididentifier
这个错误是由于字段名写错了ﻫ检查下字段名,发现e1表的查询结果没有deptno字段,所以报错了!SELECTe1.empno,e1.ename,d.dnameFROM(SELECTe.empno,e.ename,e.deptnoFROMempe,empmWHEREe.mgr=m.empnoANDe.hiredate<m.hiredate)e1,deptdWHEREe1.deptno=d.deptno;李兴华给出的标准答案是:SELECTe.empno,e.ename,d.dnameFROMempe,empm,deptdWHEREe.mgr=m.empnoANDe.hiredate<m.hiredateANDe.deptno=d.deptno;5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门左右关联问题SELECTd.deptno,d.dname,e.ename,e.empnoFROMdeptd,empeWHEREd.deptno=e.deptno(+);查询结构少了40部门的信息,用连接操作SELECTd.deptno,d.dname,e.ename,e.empnoFROMdeptd,empeWHEREd.deptno=e.deptno(+);6.列出所有”CLERK”(办事员)的姓名及部门名称,部门的人数2.入手第一步:在emp表中查询出职位job为CLERK所在的部门名称(dept表)、eq\o\ac(○,2)…..SELECTe.ename,d.dnameFROMdeptd,empeWHEREe.job=’CLERK’ANDe.deptno=d.deptno;3.部门人数肯定要用分组查询,假如是分组查询肯定要用GROUPBY,而上面的语句明显不能用GROUPBY了,由于查询字段太多。所以把分组做子查询SELECTe.ename,d.dname,ed.couFROMempe,deptd,(SELECTdeptno,COUNT(empno)couFROMempGROUPBYdeptno)edWHEREjob=’CLERK’ANDe.deptno=d.deptnoANDed.deptno=e.deptno;7.列出最低薪金大于1500的各种工作及此从事此工作的所有雇员人数SELECTjob,COUNT(empno)FROMempWHEREsal>1500GROUPBYjob;结果出来,但是是错的。李兴华分析一:按工作分组,分组条件最低工资大于1500SELECTjob,MIN(sal)FROMempGROUPBYjobHAVINGMIN(sal)>1500;分析二:SELECTe.job,COUNT(e.empno)FROMempeWHEREe.jobIN(SELECTjobFROMempGROUPBYjobHAVINGMIN(sal)>1500)GROUPBYe.job;ﻬ列出在部门”SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号1.Selectdeptnofromdeptwheredname=’SALES’;将第一环节作为条件写子查询2.selectenamefromempwheredeptno=(Selectdeptnofromdeptwheredname=’SALES’);9.列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级。1..算出平均工资:SelectAVG(sal)fromemp2.select*fromempwheresal>(SelectAVG(sal)fromemp);答案:第一步求出公司的平均工资-1,第二步:列出薪金高于平均工资的所有雇员的信息-2第三步:规定所在部门肯定要与部门表关联查所在部门的信息,3.SELECTe.*,d.dname,d.locFROMempe,deptdWHEREsal>(SELECTAVG(sal)FROMemp)ANDe.deptno=d.deptno;第四步要想查询上级领导肯定要与自身关联4..SELECTe.empno,e.ename,m.ename,d.dname,d.deptno,d.locFROMempe,deptd,empmWHEREe.sal>(SELECTAVG(sal)FROMemp)ANDe.deptno=d.deptnoANDe.mgr=m.empnoe.mgr=m.empnoe表的领导编号等于m表的员工编号,emp表自身关联m表的员工=e表的领导,所以m.ename就是:"领导”。e.mgr=m.empnoe表的领导编号等于m表的员工编号,emp表自身关联m表的员工=e表的领导,所以m.ename就是:"领导”。第五步:求出雇员的工资等级SELECTe.empno,e.ename,s.grade,m.ename,d.dname,d.deptno,d.locFROMempe,deptd,empm,salgradesWHEREe.sal>(SELECTAVG(sal)FROMemp)ANDe.deptno=d.deptnoANDe.mgr=m.empno(+)ANDe.salBETWEENs.losalANDs.hisal工资属于这个区间内表达这个等级。;工资属于这个区间内表达这个等级。ﻬ10列出与”SCOTT”从事相同工作的所有员工及部门的名称。(dims)第一步:SELECTjobFROMempewheree.ename=’SCOTT’;第二步:SELECTe.ename,d.dnameFROMempe,deptdwheree.job=(SELECTjobFROMempewheree.ename=’SCOTT’)ANDe.ename<>’SCOTT’ANDe.deptno=d.deptno;11列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金(dims)SELECTe.ename,e.salFROMempewheresalIN(SELECTsalFROMempwheredeptno=30)ANDdeptno<>30;合理的情况是没有deptno=30的合理的情况是没有deptno=30的12列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金.,部门名称Selectsalfromempwheresal>(MAX(SELECTsalFROMempwheredeptno=30));答案:在之前的程序改,使用>ALL比最大的还要大SELECTe.ename,e.sal,d.dname,d.locFROMempe,deptdwheresal>ALL(SELECTsalFROMempwheredeptno=30)ANDe.deptno<>30ANDe.deptno=d.deptno;13列出在每个部门工作的员工数量,平均工资和平均服务期限第一步查询出每个部门的员工数量:SELECTd.dname,COUNT(empno)FROMempe,deptdWHEREe.deptno=d.deptnoGROUPBYd.dname;答案:在第一步的基础上,第二步要读出平均工资和服务期限:尝试:SELECTd.dname,COUNT(empno),AVG(e.sal),AVG(e.hiredate)FROMempe,deptdWHEREe.deptno=d.deptnoGROUPBYd.dname;SELECTd.dname,COUNT(empno),AVG(e.sal),AVG(MONTHS_BETWEEN(sysdate,e.hiredate)/12)年FROMempe,deptdWHEREe.deptno=d.deptnoGROUPBYd.dname;oracle中的months_between(date1,date2)函数可以实现年龄的计算,此函数的返回值为date1与date2之间的月数,比如months_between(2023-8-8,2023-4-8)执行的结果是40(执行“selectmonths_between('2023-8-8','2023-4-8')fromdual;”不涉及双引号)。date1和date2都是DATE类型的,用SYSDATE可以获得系统时间,用现在的时间减去变量中的时间再与年龄总月数比较即可实现这一功能。14列出所有员工的姓名,部门名称和工资(dims)Selecte.ename,d.dname,e.salfromempe,deptdwheree.deptno=d.deptno;15列出所有部门的具体信息和部门人数第一步:这种题型肯定是多表关联子查询,一方面列出部门的人数SELECTdeptnodno,COUNT(empno)couFROMempGROUPBYdeptno第二步:把以上的结果当成一张临时表出现;SELECTd.*,ed.couFROMdeptd,(SELECTdeptnodno,COUNT(empno)couFROMempCROUPBYdeptno)edWHEREd.deptno=ed.dno;16列出各种工作的最低工资及从事此工作的雇员姓名1.查找工资最低的工作:SELECTjob,MIN(sal)FROMempGROUPBYjob;2.SELECTe.ename,e.job,cou.minsalFROM(SELECTjob,MIN(sal)minsal,empnoFROMempGROUPBYjob)cou,empeWHEREe.empno=cou.empno;ORA-00979:不是GROUPBY表达式.错误答案:ORA-00979:不是GROUPBY表达式.错误SELECT*FROMempWHEREsalIN(SELECTMIN(sal)FROMempGROUPBYjob);17列出各个部门的MANAGER(经理)的最低薪金(dims)Selectd.dname,MIN(e.sal)Fromempe,deptdWheree.deptno=d.deptnoANDe.job=’MANAGER’groupbyd.dname;18列出所有员工的年工资,按年薪从低到高排序在解决年薪的时候,要解决奖金,奖金要使用NVL函数解决SELECTename,(sal+NVL(comm,0))*12incomeFROMempORDERBYincome;19查出某个员工的上级主管,并规定出这些主管中的薪水超过3000SELECTDISTINCTm.*FROMempe,empmWHEREe.mgr=m.empnoANDm.sal>3000;20求出部门名称中,带’s’字符的部门员工的工资合计,部门人数查询部门表的部门名称,使用模糊查询,以拟定部门的编号SELECTdeptnoFROMdeptWHEREdnameLIKE‘%S%’;以上面的结果作为查询的条件SELECTdeptno,SUM(sal),COUNT(empno)FROMempWHEREdeptnoIN(SELECTdeptnoFROMdeptWHEREdnamelike‘%S%’)GROUPBYdeptno;21给任职日期超过2023的人加薪10%UPDATEempSETsal=sal+(sal*0.1)WHEREMONTHS_BETWEEN(sysdate,hiredate)/12>10;ﻬ创建表和管理表(重点)ORACLE复制表的语法:CREATETABLE表名称AS(子查询)假如现在子查询写的是:SELECT*FROMemp表达将表结构和内容一起复制假如现在子查询写的是:SELECT*FROMempWHERE1=2;加入一个永远不也许成立的条件,表达只是复制表结构不复制表内容。CREATETABLEperson_f(ﻩPidVARCHAR(18),ﻩNameVARCHAR(200),ﻩAgeNUMBER(3),ﻩBirthdayDATE, SEXVARCHAR(2)DEFAULT‘男’);表的删除DELETETABLE表名称范例:删除person表:DELETETABLEperson;表的修改范例:为person表增长address列ALTERTABLEpersonADD(addressVARCHAR(200)DEFAULT‘暂无地址’);为表重命名在Oracle中提供了RENAME命名,可认为表重新命名,但是此语法只能在Oracle中使用语法格式:RENAME旧的表名称TO新的表名称范例:将person重新命名为了tpersonRENAMEpersonTOmiaofang;思考题分析:这是一道面试题,只能用笛卡尔乘机:Selecte.country,d.countryfromcountryd,countryewheree.country<>d.country;ﻬ约束约束的分类: 主键约束(PRIMARYKEY) 主键约束一般都在id上使用,并且自身已经默认了内容不能为空,主键约束可以在建表的时候指定:范例:建立person表,在pid上增长主键约束CREATETABLEperson( PidVARCHAR(18)PRIMARYKEY, NameVARCHAR(200), AgeNUMBER(3),ﻩBirthdayDATE, SEXVARCHAR(2)DEFAULT‘男’);insertintopersonvalues(null,'柯为权',123,TO_DATE(‘2023-07-19’,’yyyy-mm-dd’),’男');主键为空或者反复都会报错范例:将person中的pid指定名称CREATETABLEperson_a(ﻩPidVARCHAR(18), NameVARCHAR(200),ﻩAgeNUMBER(3), BirthdayDATE,ﻩSEXVARCHAR(2)DEFAULT‘男’, CONSTRAINTperson_pid_pkPRIMARYKEY(pid));Constraint[kən'strent]:约束;限制person_pid_pk:表达约束的名称非空约束(notnull)CREATETABLEperson_a( PidVARCHAR(18)NOTNULL, NameVARCHAR(200)NOTNULL,ﻩAgeNUMBER(3), BirthdayDATE, SEXVARCHAR(2)DEFAULT‘男’, CONSTRAINTperson_pid_pkPRIMARYKEY(pid));表达插入了两个非空约束的声明,证明此时PID跟name是不允许为空的。唯一约束(UNIQUE)表达一个字段中的内容是唯一的,其他列不允许反复CREATETABLEperson_a( PidVARCHAR(18)NOTNULL,ﻩNameVARCHAR(200)UNIQUENOTNULL, AgeNUMBER(3),ﻩBirthdayDATE, SEXVARCHAR(2)DEFAULT‘男’, CONSTRAINTperson_pid_pkPRIMARYKEY(pid));表达姓名唯一。ﻬ检查约束(CHECK)使用检查约束来判断一个列中插入的内容是否合法,例如:年龄,性别的取值范围。CREATETABLEperson_a( PidVARCHAR(18)NOTNULL, NameVARCHAR(200)NOTNULL,ﻩAgeNUMBER(3)CHECK(ageBETWEEN0AND150), BirthdayDATE, SEXVARCHAR(2)DEFAULT‘男’CHECK(sexIN(‘男’,’女’,’中性’)), CONSTRAINTperson_pid_pkPRIMARYKEY(pid));修改约束(了解)一张表建立完毕之后,则可认为其添加约束DROPTABLEpersonCASCADECONSTRAINT;CREATETABLEperson( PidVARCHAR(18)PRIMARYKEY,ﻩNameVARCHAR(200), AgeNUMBER(3),ﻩBirthdayDATE,ﻩSEXVARCHAR(2)DEFAULT‘男’);ﻩ此时,需要为表中添加若干个约束,添加约束的语法如下:ALTERTABLE表名称ADDCONSTRAINT约束名称约束类型(约束字段);关于约束类型的命名一定要统一:PRIMARYKEY:主键字段_PKUNIQUE:字段_UKCHECK:字段_CKFOREIGNKEY:父字段_子字段_FKALTERTABLEpersonADDCONSTRAINTperson_pid_PKPRIMARYKEY(pid);ALTERTABLEpersonADDCONSTRAINTperson_name_UKUNIQUE(pid);ALTERTABLEpersonADDCONSTRAINTperson_age_CKCHECK(ageBETWEEN0AND150);ALTERTABLEpersonADDCONSTRAINTperson_sex_CKCHECK(sexIN(‘男’,’女’,’中’));
ROWNUM(重点) ROWNUM:表达行号,事实上此是一个列,但是这个列是一个伪列,此列可以在每张表中出现。范例:在查询雇员表上,加入ROWNUMSELECTROWNUM,empno,ename,job,sal,hiredateFROMemp;从运营上看,ROWNUM自身采用自动编号的形式出现,有什么用处呢?例如,现在假设只想显示前5条记录。条件中:ROWNUM=5SELECTROWNUM,empno,ename,job,sal,hiredateFROMempWHEREROWNUM<=5;能不能查中间5条呢?ﻬ假如现在想进行中间的截取操作,则只能采用子查询,例如现在假设每页显示5条,第2页应当显示6~10,那么对于数据库操作来讲,它在查询的时候应当一方面查询1~10条,之后在查询的结果中取出后5条。假如要取出最后5条数据
视图表的建立:CREATETABLE表名称在ORACLE中的重要数据类型|----VARCHAR2(长度):表达一个字符串,有长度限制|----NUMBER():表达数字,可以表达整数或小数|----DATE:表达日期格式,日期要按照指定的格式编写|----CLOB:存储大文本对象,海量文字复制表:CREATETABLE表名称AS子查询一般表建立之后不要修改,假如非要修改使用ALTERTABLE指令ALTERTABLE有两种功能|-增长列:ALTERTABLE表名称ADD(字段名称字段类型DEFAULT默认值)|-修改列:ALTERTABLE表名称MODIFY(字段名称字段类型DEFAULT默认值)约束:使用约束可以保证数据库表中的数据完整性在SQL中约束一共分为以下五种:但表上的约束:|-PRIMARYKEY:一个实体表一般都要去建立一个主键,表达唯一的编号|-NOTNULL:一个列的内容不予许插入空值|-UNIQUE:表达此列的内容不允许反复|-CHECK:表达此列的内容设立的时候要有限制b)关联表上的约束:|-FOREIGNKEY表达子表的取值与父表的取值有所关联 |-删除的时候应当先删除子表再删除父表ﻩ|-假如现在要删除父表,可以采用ORACLE的强制手段ﻩﻩ|-DROPTABLE表名称CASCADECONSTRINT|-级联删除:ONDELETECASCADE,当父表中的内容被删除掉之后,子表的相应内容也被删除掉。ROWNUM:伪列:所有的记录中都存在此列,用以表达行的编号,在实际中可以通过此列并结合子查询完毕表中的部分数据显示。集合的操作:并,交,差视图部分的知识点掌握视图的作用及定义(重)掌握序列的使用:SEQUENCE掌握PowerDesiger设计工作的使用了解同义词,了解用户管理理解数据库的设计范式
视图视图的功能:一个视图事实上就是封装了一条复杂的查询语句创建视图的语法:CREATEVIEW视图名称AS子查询ﻩ事实上此时的子查询就表达一条非常复杂的语句,范例:建立一个视图,包含所有的20部门的雇员信息(雇员编号,姓名,工作,雇佣日期)CREATEVIEWempv20ASSELECTempno,ename,job,hiredateFROMempWHEREdeptno=20;视图创建完毕之后,就可以就可以像查找表那样直接对视图进行查询的操作范例:查询视图SELECT*FROMempv20;此时,是通过视图找到的20部门的所有数据,也就是发现,可以使用视图包装需要的查询语句。此时,此视图只包含了四个字段的信息,假如现在希望多包含一个
“工资”sal
,CREATEVIEWempv20ASSELECTempno,ename,job,sal,hiredateFROMempWHEREdeptno=20;犯错,说明视图不能重名但是,假如所有的代码都这样去写肯定很麻烦,由于假如要修改视图,肯定要先删视图,所以在ORACLE中为了方便用户修改视图,提供一个替换的命令,此时完整的视图创建语法
:CREATEORREPLACE视图名称AS子查询CREATEORREPLACEVIEWempv20ASSELECTempno,ename,job,sal,hiredateFROMempWHEREdeptno=20;视图可以封转复杂查询,那么下面封装一个之前已经存在的复杂查询:SELECTename,(sal+NVL(comm,0))*12incomeFROMempORDERBYincome;假如在开发中每次都写如此之长的sql代码肯定不方便,所以就应当把它建立成视图以方便用户查询操作;CREATEORREPLACEVIEWempv21ASSELECTename,(sal+NVL(comm,0))*12incomeFROMempORDERBYincome;创建完视图之后,以后想得到之前的查询结果.直接写:SELECT*FROMempv21 ;即可查询出结果范例:创建一个只包含20部门的雇员的视图CREATEORREPLACEVIEWempv20ASSELECT*FROMempWHEREdeptno=20;更新视图:在视图中是不应当包含真实数据的,并且在此程序中,创建的视图事实上是存在创建条件的,此条件是deptno=20,假如将视图中的7369的部门编号改为30;范例:修改视图中的7369的部门编号UPDATEempv20SETdeptno=30WHEREempno=7369;SELECT*FROMempv20;此时,已经提醒视图正常的进行了更新,重新查询视图之后,会发现在视图中已经没有7369这个雇员了,那么emp表中呢?----发现在emp表中的7369雇员的部门编号已经修改为30了,这样做明显不合适,由于创建视图的时候是有条件的,你一旦修改之后,则此条件就被破坏了,所以在创建视图的过程的SQL中提供了两个重要的参数:---WITHCHECKOPTION:不能更新视图的创建条件范例:在创建视图中使用此参数CREATEORREPLACEVIEWempv20ASSELECT*FROMempWHEREdeptno=20WITHCHECKOPTION;完整的创建视图语法这时候再执行更新条件语句:UPDATEempv20SETdeptno=30WHEREempno=7369;完整的创建视图语法创建条件不能更新,那么其他字段呢?例如:现在将7369的雇员姓名修改Wie“史密斯”范例:修改视图中7369的雇员编号;UPDATEempv20SETename=’史密斯’WHEREempno=7369;已更新一行;但是,视图的自身作用还是用来查询的,所以不应当允许更改,所以此时可以使用第二个参数:WITHREADONLY:创建的视图只读范例:创建只能读的视图CREATEORREPLACEVIEWempv20ASSELECT*FROMempWHEREdeptno=20WITHREADONLY;此时提醒视图无法更改,是只读的。序列(重点)李兴华:在oracle中序列是最重要的。在很多数据库中都存在一个自动增长的列,假如现在要想在oracle中完毕自动增长的功能,则只能依靠序列完毕,所有的自动增长操作,需要用户手工完毕解决。创建序列需要CREATESEQUENCE系统权限。序列的创建语法如下:CREATESEQUENCE序列名[INCREMENTBY每次增长幅度n]每次增长幅度[STARTWITH从哪开始;n]从哪开始;[{MAXVALUE/MINVALUEn|NOMAXVALUE最大值,最小值,没有最大值}]最大值,最小值,没有最大值[{CYCLE|NOCYCLE循环}]循环[{CACHEn|NOCACHE}];范例:创建一个myseq的序列,验证自动增长的操作CREATESEQUENCEmyseq;序列创建完毕之后,所有的自动增长应当由用户自己解决,所以在序列中提供了以下的两种操作:NextVal:取得序列的下一个内容CurrVal:取得序列的当前内容范例:建立一张表以验证序列的操作CREATETABLEtestseq(ﻩnext表达下一个值NUMBER,表达下一个值ﻩcurr表达当前值NUMBER表达当前值);向表中添加数据,添加数据的时候需要手工使用序列范例:使用序列Insertintotestseq(next,curr)values(myseq.nextval,myseq.currval);将以上的语句执行5次.范例:查询testseq表,观测序列的变化从结果中发现,nextval始终在进行自动增长的操作,而curr始终取出当前操作的序列的结果;也就是说,现在的这种序列,每次增长的幅度是1,那么也可以修改序列的增长幅度:可以使用以下的两个参数:每次的增长幅度:INCREATEBY从哪里开始:STARTWITH范例:重新创建序列删除序列:DROPSEQUENCEmyseq;CREATESEQUENCEmyseqINCREMENT注意拼写BY2;注意拼写重建testseq表重新建立:DROPTABLEtest2seq;CREATETABLEtest2seq( nextNUMBER, currNUMBER);Insertintotest2seq(next,curr)values(myseq.nextval,myseq.currval);ORACLE查看所有用户建的表:select
table_name
fromuser_tables;查看表结构:descdept;默认情况下序列是从1开始的,可以使用STARTWITH指定其开始的位置。CREATESEQUENCEmyseqINCREMENTBY2STARTWITH10;可以用工具建立序列,但是序列用得最多也只有:CREATESEQUENCE序列名称;
同义词(了解即可) 之前总是存在这样的一种查询语句:SELECTSYSDATEFROMdual; 之前一直强调,dual是一张虚拟表,那么虽然是虚拟表,可是此表到底是在哪里定义的呢?假如现在使用system连接数据库,查询一张此张表是否属于system用户:使用system用户连接:connsystem/manager;查找所有的表:select*fromtab;查找dual表:select*fromtabwhereTNAME=’DUAL’;//找不到Connsys/change_on_installASSYSDBA;select*fromtabwhereTNAME=’DUAL’;在sys用户下存在此表,此表在sys下,但是在scott用户下却可以直接通过表名称访问,那么正常情况下假如要访问不同用户的表需要使用”用户名.表名称”。这就是同义词的作用,同义词,可以让其他用户通过一个名称方便访问“用户名.表名称”创建同义词的语法:CREATESYNONYM同义词名称FOR用户名.表名称;范例:将scott.emp定义emp的同义词CREATESYNONYMempFORSCOTT.emp;范例:删除同义词DROPSYNONYMemp;但是此种特性只合用于oracleﻬ索引是用于加速数据存取的数据对象。合理的使用索引可以大大减少i/o次数,从而提高数据访问性能。索引有很多种我们重要介绍常用的几种:为什么添加了索引之后,会加快查询速度呢?索引是用于加速数据存取的数据对象。合理的使用索引可以大大减少i/o次数,从而提高数据访问性能。索引有很多种我们重要介绍常用的几种:为什么添加了索引之后,会加快查询速度呢?图书馆:假如杂乱地放书的话检索起来就非常困难,所以将书分类,然后再建一个箱子,箱子里面放卡片,卡片里面可以按类查询,按姓名查或者类别查,这样的话速度会快很多很多,这个就有点像索引。索引的好处就是提高你找到书的速度,但是正是由于你建了索引,就应当有人专门来维护索引,维护索引是要有时间精力的开销的,也就是说索引是不能乱建的,所以建索引有个原则:假如有一个字段假如不经常查询,就不要去建索引。现在把书变成我们的表,把卡片变成我们的索引,就知道为什么索引会快,为什么会有开销。创建索引:单例索引单例索引是基于单个列所建立的索引,比如:CREATEindex索引名on表名(列名)复合索引复合索引是基于两个列或多个列的索引。在同一张表上可以有多个索引,但是规定列的组合必须不同,比如:Createindexemp_idx1onemp(ename,job);Createindexemp_idx1onemp(job,ename);这两个是不同的索引,
这两个是不同的索引,范例:CREATEtablecustomer(customerIdchar(8)primarykey, ﻩName假如经常要根据name去查询客户,假如这里数据非常海量,不加索引,这里将会非常浪费时间;varchar2(50)notnull,假如经常要根据name去查询客户,假如这里数据非常海量,不加索引,这里将会非常浪费时间; Addressvarchar2(50), ﻩEmailvarchar2(50)unique,ﻩﻩSexchar(2)default‘男’check(sexin(‘男’,’女’)), ﻩCardidchar(10));SELECT*FROMcustomerwherename=’sp’;假如数据非常海量这里建索引跟不建索引差别非常大。假如数据非常海量这里建索引跟不建索引差别非常大。建索引名为nameIdx表名为customer列名为name的索引:CREATEindexnameIdxoncustomer(name);#索引缺陷分析索引有一些先天局限性:1:建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引。2:更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性。实践表白,不恰当的索引不仅于事无补,反而会减少系统性能。由于大量的索引在进行插入,修改和删除操作时比没有索引花费更多的系统时间。比如在如下字段建立索引应当是不恰当的:1..很少或从不引用的字段2...逻辑型的字段逻辑型的,比如说在sex字段上没必要建索引,由于它自身就很好找,”男”逻辑型的,比如说在sex字段上没必要建索引,由于它自身就很好找,”男”或”女”,很好区分,没必要建。除了我们加的name字段有索引,尚有些默认的字段,O除了我们加的name字段有索引,尚有些默认的字段,Oracle看看只要类型是unique的,都会自动加索引
用户管理(了解)在oracle中可以对用户进行建立及授权的操作。创建用户的语法:CREATEUSER用户名IDENTIFIEDBY密码;范例:创建一个test用户,密码是test123;CREATEUSERtestIDENTIFIEDBYtest123;CREATEUSERkeIDENTIFIEDBYke123;假如想要创建用户,则一方面应当使用管理员进行登陆;创建用户之后,启动一个新的sqlplusw,并用此用户登陆;提醒test用户没有创建session的权限,没有session权限意味着无法登陆,假如要为session建立权限可以参照:(本文档oracle常见问题第6)---------------------------------略------------------------------------事实上一个新的用户的所有权限都需要分别赋予,假设现在需要把所有权限一次性赋予一个用户,则可以将这些权限定义成一个角色. 在oracle中提供了两个重要的角色:CONNECT,RESOURCE表达连接和资源操作,可以直接把这两个角色赋予test用户;GRANTCONNECT,RESOURCETOtest;//这就把权限都给了test修改用户的密码:ALTERUSER用户名IDENTIFIYEDBY密码;范例:将test的用户密码修改为helloALTERUSERtestIDENTIFIEDBYhello;ﻩ在一般的系统中存在,在用户第一次登陆的时候可以修改密码。所以想要完毕此功能,可以手工让一个密码失效,格式如下:ALTERUSER用户名PASSWORDEXPIRE;范例:让test用户的密码失效ALTERUSERtestPASSWORDEXPIRE;这时候再用conntest/hello登陆就会提醒你重新输入修改密码;
数据库的备份与恢复(了解)把所有数据都备份到d://data之中,exp命令之后会提醒你要备份的是哪个用户名下的数据EXPDAT.DMP是导出文献的默认名称不建议修改,然后就执行一系列的默认操作备份完毕,为了检查备份的效果,把数据库中的表所有删除,之后使用imp命令将备份的文献恢复
数据库设计范式(了解)嵌套表、可变数组,对于数据库的开发过程中像过程之类的基本上也都不使了,由于很多都用程序完毕,并且,对于高级开发部分,游标,触发器,包,函数。基本上很少去直接调用。数据库设计范式事实上非常重要,但是从实际的开发来看,假如真的所有按照范式去做,则这个程序没法写,涉及查询语句也会变得复杂,(由于表关联过多,会产生大量的笛卡尔乘机在Oracle中的scott用户的所有表,事实上就已经很好的体现一种设计思绪;第一范式:1NF:目的就是表中每列都不可分割;ﻬ数据库设计分析(重点)设计规定,规定设计一个网上购物程序(使用powerdesiger建立模型并编写测试数据),有如下的需求管理员可以在后台添加商品,每个商品属于一个商品组可以对管理员进行分组,对每一组进行分别授权,即一个管理员组可以有多个管理员,一个管理员组有多个权限,一个管理员可以在多个组。用户可以自己购买商品,购买商品时要在订单表中添加信息,一个用户可以同时购买多个商品,用户可以选择自己所在的地区进行商品的派送4.用户可以根据自己的购买积分,对商品进行折扣
GROUPBY和HAVING在介绍GROUPBY和HAVING子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM,COUNT,MAX,AVG等。这些函数和其它函数的主线区别就是它们一般作用在多条记录上。SELECTSUM(population)FROMbbc这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。通过使用GROUPBY子句,可以让SUM和COUNT这些函数对属于一组的数据起作用。当你指定GROUPBYregion时,属于同一个region(地区)的一组数据将只能返回一行值.也就是说,表中所有除region(地区)外的字段,只能通过SUM,COUNT等聚合函数运算后返回一个值.HAVING子句可以让我们筛选成组后的各组数据.WHERE子句在聚合前先筛选记录.也就是说作用在GROUPBY子句和HAVING子句前.而HAVING子句在聚合后对组记录进行筛选。让我们还是通过具体的实例来理解GROUPBY和HAVING子句,还采用第三节介绍的bbc表。SQL实例:一、显示每个地区的总人口数和总面积.SELECTregion,SUM(population),SUM(area)FROMbbcGROUPBYregion先以region把返回记录提成多个组,这就是GROUPBY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。二、显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。SELECTregion,SUM(population),SUM(area)FROMbbcGROUPBYregionHAVINGSUM(area)>1000000在这里,我们不能用where来筛选超过1000000的地区,由于表中不存在这样一条记录。相反,HAVING子句可以让我们筛选成组后的各组数据.oracle常见问题1..在打开PL/SQLdevelop的时候回弹出:ORA-12170:
TNS:连接超时关闭掉杀毒跟防火墙都无法解决:点NetManager--设立好主机名,也可以设立IP地址,但是每次都要重新设立。Ok---成功解决!2.查找SQL/PL生成ﻩ下一个序列号在Oracle库中查询出下个自动生成的id号3.ORA-00904invalididentifier解决办法,字段名错误ORA-00904invalididentifier
这个错误是由于字段名写错了
检查下字段名3.oracle
10g
安装成功之后。scott用户被锁定问题因素:默认Oracle10g的scott不能登陆。ﻫ解决:ﻫ(1)connsys/sysassysdba;//以DBA的身份登录ﻫ(2)alteruserscottaccountunlock;//然后解锁
(3)connscott/tiger//弹出一个修改密码的对话框,修改一下密码就可以了
具体操作环节如下:
C:>sqlplus
请输入用户名:sys
输入口令:sysassysdba//注意:在口令这里输入的密码后面必须要跟上assysdba才可以。
SQL>alteruserscottaccountunlock;
用户已更改.
SQL>commit;ﻫ
提交完毕.ﻫSQL>connscott/tigerﻫ更改scott口令ﻫ新口令:tiger
重新键入新口令:tigerﻫ口令已更改
已连接。ﻫ//完毕。4.oracle连接其他地址的库在oracle安装目录下的:C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN的tnsnames.ora文献#tnsnames.oraNetworkConfigurationFile:C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.oratnsnames.ora#GeneratedbyOracleconfigurationtools.ORCL=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)))EXTPROC_CONNECTION_DATA=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年审计工作计划范文样本
- 2025年度导游工作计划怎么写
- 厕所清洁剂行业相关投资计划提议范本
- 环保节能型冷却塔行业相关投资计划提议范本
- 2025年沪教版小学数学四年级下册教学计划
- 冷墩钢相关项目投资计划书
- 2025年销售半年工作计划
- 2025年市场部销售工作计划
- 豪华酒店销售业绩总结
- 餐饮业的智能点餐系统
- (新版)北师大版五年级数学上册期末试卷
- 小班《火车开了》音乐欣赏课评课稿
- 伦理学与医学伦理学 (医学伦理学课件)
- GB/T 6344-2008软质泡沫聚合材料拉伸强度和断裂伸长率的测定
- GA/T 1740.1-2020旅游景区安全防范要求第1部分:山岳型
- 产后康复客户健康评估表格
- 个人现实表现材料1500字德能勤绩廉(通用6篇)
- 六年级上册数学单元测试-5.圆 青岛版 (含答案)
- (精心整理)高一语文期末模拟试题
- QC成果解决铝合金模板混凝土气泡、烂根难题
- 管线管廊布置设计规范
评论
0/150
提交评论