已阅读5页,还剩111页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL结构化查询语言(StructuredQueryLanguage),教书育人匠:胡琦光,结构化查询语言(StructuredQueryLanguage),具有定义、查询、更新和控制等多种功能,是关系数据库的标准语言。SQL分类:数据操纵语言DMLDataManipulationLanguage:SELECTINSERTUPDATEDELETE数据定义语言DDLDatadefinitionlanguage:CREATEALTERDROPRENAMETRUNCATE数据控制语言DCLDataControlLanguage:GRANTREVOKETransaction:commitrollbacksavepoint,SQL语言(B),查看所有表:selecttable_namefromuser_tables;查看表结构:describedept;(或者descdept;)emp表雇员表Empno:雇员工号Ename:雇员名字Job:工作。(秘书、销售、经理、分析员、保管)Mgr(manager):经理的工号Hiredate:雇用日期Sal:工资Comm:津贴Deptno:所属部门号dept表部门表Deptno:部门号Dname:部门名字Loc:地址salgrade表薪水等级Grade:等级losal:最低工资hisal:最高工资bonus表奖金Ename:雇员名字,job:工作,sal:工资comm:津贴,实验用数据表(B),为表添加注释commentontableempis雇员表;为列添加注释commentoncolumnemp.Empnois雇员工号;,添加注释(B),Select-from-where句型SELECTDISTINCT*,columnalias,.FROMtableWhere条件表达式aliasColumnaliasColumn“alias”Columnasalias,SELECT(A),检索单个列selectcolfromtableName;检索多个列selectcol1,col2,col3fromtableName;检索所有列select*fromtableName;使用通配符的优点:书写方便、可以检索未知列使用通配符的缺点:降低检索的性能给检索出的列起个别名selectjobgongzuofromemp;selectjobasgongzuofromemp;,SELECT语言(A),select*fromemp;selectempnofromemp;selectempnoempnumberfromemp;selectempno“empnumber”fromemp;selectempnoasempnumberfromemp;selectdistinctempnofromemp;,select(A),条件比较,!,,,=,any,some,allisnull,isnotnullbetweenxandyexists(subquery)in(list),notin(list)like_,%,escape_%escape,where(A),select*fromempwherecommisnull;select*fromempwherecommisnotnull;selectename,salfromempwheresalin(800,1250,1500,2000);selectename,salfromempwhereenamein(SMITH,ALLEN,KING);selectename,salfromempwheresalbetween1000and2500;selectename,salfromempwheredeptno10;,where,逻辑复合条件not,and,or计算次序问题的解决,最好用括号进行分组处理SQL优化问题:AND:把检索结果较少的条件放到后面OR:把检索结果较多的条件放到后面,where(A),selectename,hiredatefromempwherehiredate20-2月-81;selectename,salfromempwheredeptno=10andsal1000;selectename,job,deptnofromempwheredeptno=10orjob=CLERK;selectename,salfromempwheresalnotin(800,1500,2000);列出deptno为10或者30,并且工资2000的所有人。,where,条件表达式中字符串匹配操作符是“like”%通配符表示任意字符出现任意次数_通配符表示任意字符出现一次技巧和注意事项:不能过度使用通配符。如果其他操作符能达到目的,就不要使用通配符。确实需要使用通配符时,除非绝对必要,否则不要把通配符用到搜索模式最开始处,因为这样搜索起来是最慢的。selectenamefromempwhereenamelike%ALL%;selectenamefromempwhereenamelike_A%;,like(A),Youquerythedatabasewiththiscommand:SELECTnameFROMemployeeWHEREnameLIKE_a%;Whichnamesaredisplayed?A.namesstartingwithaB.namesstartingwithaorAC.namescontainingaasthesecondletterD.namescontainingaasanyletterexceptthefirst,selecttest,按照单个列排序orderbycol降序和升序:orderbycoldesc(asc)按多个列排序orderbycol1desc(asc),col2desc(asc),orderby(A),selectename,salfromemporderbyename;selectename,salfromemporderbyempno;selectename,salfromemporderbyenameasc;selectename,salfromemporderbydeptnodesc;selectename,sal,deptnofromemporderbydeptnoasc,enamedesc;,orderby(A),为什么需要计算字段?我们经常需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序中重新格式化。计算字段并不实际存在于数据库表Sql允许select子句中出现+,-,*,/以及列名和常数的表达式拼接字段(|,+)首选|(mysql中|表示or,一般用concat(),创建计算字段(A),selectename|isa|jobfromemp;selectename,sal,sal*12fromemp;selectename,sal,sal*12+500fromemp;selectename,sal,sal*(12+500)fromemp,创建计算字段,Sql中允许列值为空,空值用保留字NULL表示。NULL不同与0或者空格,它就是代表了一个不确定的内容。任何含有null值的数学表达式最后的结果都为空值selectename,sal,comm,(sal*12)+comm“income”fromemp;可以通过函数nvl将NULL转换成为一个“actualvalue”selectename,comm,nvl(comm,0)fromempselectename,sal,comm,(sal*12)+nvl(comm,0)“income”fromemp,通用函数nvl(A),函数一般是在数据上执行的,它给数据的转换和处理提供了方便。只是将取出的数据进行处理,不会改变数据库中的值。,通用函数nvl,SQL函数(A),Sql函数可以分为组函数和单行函数。组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或查询的having子句单行函数对单个数值进行操作,并返回一个值。,两种SQL函数(A),单行函数的分类(A),字符函数全以字符作为参数,返回值分为两类:一类返回字符值,一类返回数字值concat(string1,string2)连接两个字符串initcap(string)string中每个单词首字母大写Lower(string)以小写形式返回stringlpad,rpad填充字符型数据ltrim/rtrim(string1,string2)trim()substr提取字符串的一部分substr(string,1,2)upper(string)以大写形式返回stringinstr字符串出现的位置,instr(string,A)length字符串长度,字符函数(A),selectename,salfromempwherelower(ename)like%a%;selectename,salfromempwhereupper(ename)like%A%;selectsubstr(Hello,1,3)fromdual;selectname,substr(ename,2)fromemp;selectename,length(ename)fromemp;selectename,instr(ename,A)fromemp;selectename,lpad(ename,6)fromemp;selectename,lpad(ename,6,?)fromemp;Selectlpad(ABC,5,#)fromdual;,字符函数,数字函数以NUMBER类型为参数返回NUMBER值round(number,n)selectround(23.652)fromdual;selectround(23.652,2)fromdual;selectround(23.652,-1)fromdual;trunc(number,n)selecttrunc(23.652)fromdual;selecttrunc(23.652,2)fromdual;selecttrunc(23.652,-1)fromdual;mod(x,y)求余数selectmod(13,5)fromdual;ceil()上取整selectceil(19.2)fromdual;floor()下取整selectfloor(19.2)fromdual;,数字函数(A),Oracle以内部数字格式存储日期:世纪,年,月,日,小时,分钟,秒sysdate/current_date以date类型返回当前的日期Add_months(d,x)返回加上x月后的日期d的值LAST_DAY(d)返回的所在月份的最后一天Months_between(date1,date2)返回date1和date2之间月的数目,日期和时间函数(A),从日期中加或减一个数值,以得当一个日期结果值selectsysdate+2fromdual;selectsysdate-2fromdual;两个日期相减以便得到他们相差多少天selectename,round(sysdate-hiredate)/7)weeksfromempwheredeptno=10,日期和日期时间算术,标量数据可以有类型的转换,转换分为两种,隐式类型转换和显示类型转换。隐式类型转换可用于:字符和数字的相互转换selectename,hiredate,to_char(hiredate,yyyy/mm/dd)fromempselectsysdate,to_char(sysdate,yyyy-mon-ddhh12:mi:ss)fromdual;,TO_CHAR函数操作日期(A),to_char(num,format)用于将Number类型参数转换为varchar2类型,如果指定了format,它会控制整个转换。,TO_CHAR函数操作数字(A),selectto_char(sal,$99,999.9999)salaryfromempwhereename=ALLEN;selectto_char(sal,$00,000.0000)salaryfromempwhereename=ALLEN;selectto_char(123456,99,99,00)fromdual;,TO_CHAR函数操作数字,to_date(String,format)将char或varchar2类型的string转换为date类型Selectto_date(04,05,19,10,23,40,yy,mm,dd,hh12,mi,ss)fromdual;selectto_date(2004-09-19,yyyy-mm-dd)fromdual;to_number(String,format)将char或varchar2类型的string转换为number类型selectto_number($39343.783,$99990.000)fromdual;selectto_number(11.231,999.999)fromdual;,to_number显示员工雇佣期满6个月后下一个星期五的日期Selectto_char(next_day(add_months(hiredate,6),Friday),fmDay,Monthddth,YYYY)“review”fromemporderbyhiredate;,单行函数嵌套,组函数基于多行数据返回单个值,组函数(A),avg()返回某列的平均值min()返回某列的最小值max()返回某列的最大值sum()返回某列值的和count()返回某列的行数组函数仅在选择列表和Having子句中有效,组函数(A),在数字类型数据使用AVGandSUM函数selectsum(sal),avg(sal),max(sal),min(sal)fromemp;MINandMAX适用于任何数据类型selectmin(hiredate),max(hiredate)fromemp;组函数除了count(*)外,都跳过空值而处理非空值selectcount(*)fromemp;selectcount(comm)fromemp;selectcount(distinctdeptno)fromemp;,组函数(A),selectavg(comm)fromemp;NVL函数迫使分组函数包括空值selectavg(nvl(comm,0)fromemp;,在分组函数中使用NVL函数,创建分组groupby子句Groupby子句可以包含任意数目的列。除组函数语句外,select语句中的每个列都必须在groupby子句中给出。如果分组列中具有null值,则null将作为一个分组返回。如果列中有多行null值,他们将分为一组。Groupby子句必须出现在where子句之后,orderby子句之前。过滤分组(having子句)Where过滤行,having过滤分组。Having支持所有where操作符。分组和排序一般在使用groupby子句时,应该也给出orderby子句。,数据分组,SELECTcolumn,group_functionFROMtableWHEREconditionGROUPBYgroup_by_expressionORDERBYcolumn;使用GROUPBY子句将表分成小组结果集隐式按升序排列,如果需要改变排序方式可以使用Orderby子句,数据分组(A),出现在SELECT列表中的字段,如果出现的位置不是在组函数中,那么必须出现在GROUPBY子句中selectdeptno,avg(sal)fromempgroupbydeptnoGROUPBY列可以不在SELECT列表中selectavg(sal)fromempgroupbydeptno不能在WHERE子句中使用组函数.不能在WHERE子句中限制组.使用Having对分组进行限制selectavg(sal)fromempgroupbydeptnohavingavg(sal)1000;,数据分组(A),Select子句顺序(A),Sql语句执行过程:读取from子句中的基本表、视图的数据,执行笛卡尔积操作。选取满足where子句中给出的条件表达式的元组按group子句中指定列的值分组,同时提取满足Having子句中组条件表达式的那些组按select子句中给出的列名或列表达式求值输出Orderby子句对输出的目标表进行排序。,Select子句顺序(A),selectmax(sal)fromempgroupbydeptno;selectmax(sal),deptno,jobfromempgroupbydeptno,job;selectavg(sal)fromempwheresal1200groupbydeptnohavingavg(sal)1500orderbyavg(sal);,例子,多表查询,语法规则:SELECTtable1.column,table2.columnFROMtable1,table2WHEREtable1.column1=table2.column2;在WHERE子句中写入连接条件当多个表中有重名列时,必须在列的名字前加上表名作为前缀连接的类型:等值连接-Equijoin非等值连接-Non-equijoin外连接-Outerjoin自连接-Selfjoin,sql:1992语法的连接(A),selectcount(*)fromempselectcount(*)fromdeptselectemp.empno,dept.locfromemp,dept检索出的行的数目将是第一个表中的行数乘以第二个表中的行数检索出的列的数目将是第一个表中的列数加上第二个表中的列数应该保证所有联结都有where子句,不然数据库返回比想要的数据多得多的数据,笛卡尔积(A),等值连接(A),使用AND操作符增加查询条件,等值连接,selectemp.empno,emp.ename,dept.deptno,dept.locfromemp,deptwhereemp.deptno=dept.deptnoandemp.deptno=10selectemp.empno,emp.ename,dept.deptno,dept.locfromemp,deptwhereemp.deptno=dept.deptnoandename=JAMES,等值连接,使用表的别名简化了查询selecte.empno,e.ename,e.deptno,d.deptno,d.locfromempe,deptdwheree.deptno=d.deptno,连接中使用表的别名(A),为了连接n个表,至少需要n-1个连接条件。,多于两个表的连接(A),createtablemanagerasselect*fromemp;Manager,emp,deptselecte.empno,e.ename,m.ename,d.locfromempe,managerm,deptdwheree.mgr=m.empnoande.deptno=d.deptnoande.job=ANALYST,多于两个表的连接,select*fromemp,salgradewheresalbetweenlosalandhisal,非等值连接,emp,DEPt,没有雇员属于40,50部门Dept.deptno=emp.deptno,外连接,为了在操作时能保持这些将被舍弃的元组,提出了外连接的概念,使用外连接可以看到不满足连接条件的记录外连接运算符是(+)有左外连接和右外连接左外连接显示左边表的全部行SELECTtable.column,table.columnFROMtable1,table2WHEREtable1.column=table2.column(+);右外连接显示右边表的全部行SELECTtable.column,table.columnFROMtable1,table2WHEREtable1.column(+)=table2.column;,外连接(A),selecte.ename,d.deptno,d.dnamefromempe,deptdwhered.deptno=e.deptno(+);selecte.ename,d.deptno,d.dnamefromempe,deptdwheree.deptno(+)=d.deptno;,外连接(A),查找每个员工的上级主管selectworker.ename|worksfor|manager.enamefromempworker,empmanagerwhereworker.mgr=manager.empno,自连接(A),sql1992的语法规则暴露了这样的缺点:语句过滤条件和表连接的条件都放到了where子句中。当条件过多时,联结条件多,过滤条件多时,就容易造成混淆。SQL1999修正了整个缺点,把联结条件,过滤条件分开来,包括以下新的TABLEJOIN的句法结构:CROSSJOINNATURALJOINUSING子句ON子句LEFTOUTERJOINRIGHTOUTERJOINFULLOUTERJOIN,sql:1999语法的连接(A),CROSSJOIN产生了一个笛卡尔积,就象是在连接两个表格时忘记加入一个WHERE子句一样selectemp.empno,emp.ename,emp.deptno,dept.locfromemp,dept;可以使用CROSSJOIN来达到相同的结果selectemp.empno,emp.ename,emp.deptno,dept.locfromempcrossjoindept;,交叉连接(B),NATURALJOIN子句基于两个表中列名完全相同的列产生连接两个表有相同名字的列数据类型相同从两个表中选出连接列的值相等的所有行select*fromempnaturaljoindeptWheredeptno=10;自然连接的结果不保留重复的属性,自然连接(B),selecte.ename,e.ename,e.sal,deptno,d.locfromempejoindeptdusing(deptno)wheredeptno=20using子句引用的列在sql任何地方不能使用表名或者别名做前缀,同样适合natural子句,using创建连接(B),自然连接的条件是基于表中所有同名列的等值连接为了设置任意的连接条件或者指定连接的列,需要使用ON子句连接条件与其它的查询条件分开书写使用ON子句使查询语句更容易理解selectename,dnamefromempjoindeptonemp.deptno=dept.deptnowhereemp.deptno=30;,使用on创建连接(A),检索雇员名字、所在单位、薪水等级:这三个信息在三个表里面,所以只能用多表联结selectename,dname,gradefromempjoindeptonemp.deptno=dept.deptnojoinsalgradeonemp.salbetweensalgrade.losalandsalgrade.hisal;,使用on创建连接三表连接,在LEFTOUTERJOIN中,会返回所有左边表中的行,即使在右边的表中没有可对应的列值。selecte.ename,d.deptno,d.dnamefromdeptdleftouterjoinempeone.deptno=d.deptnoselecte.ename,d.deptno,d.dnamefromempe,deptdwhered.deptno=e.deptno(+);,左外连接(A),RIGHTOUTERJOIN中会返回所有右边表中的行,即使在左边的表中没有可对应的列值。selecte.ename,d.deptno,d.dnamefromemperightouterjoindeptdone.deptno=d.deptnoselecte.ename,d.deptno,d.dnamefromempe,deptdwheree.deptno(+)=d.deptno;,右外连接(A),SQL允许多层嵌套。子查询,即嵌套在其他查询中的查询。SELECTselect_listFROMtableWHEREexproperator(SELECTselect_listFROMtable);理解子查询的关键在于把子查询当作一张表来看待。外层的语句可以把内嵌的子查询返回的结果当成一张表使用。子查询要用括号括起来将子查询放在比较运算符的右边(增强可读性),子查询(A),按照子查询返回的记录数,子查询可以分为单行子查询和多行子查询,单行子查询,CLERK,子查询的种类(A),子查询返回一行记录使用单行记录比较运算符,单行子查询,我们要查询有哪些人的薪水是在整个雇员的平均薪水之上的:首先求所有雇员的平均薪水selectavg(sal+nvl(comm,0)fromemp然后求:selectename,empno,sal,sal+nvl(comm,0)fromempwheresal+nvl(comm,0)(selectavg(sal+nvl(comm,0)fromemp);此处嵌套的子查询在外层查询处理之前执行,单行子查询,子查询返回多行行记录使用集合比较运算符,运算符INsomeALL,含义等于列表中的任何值将值与子查询返回的任意一个值进行比较比较子查询返回的每一个值,多行子查询(B),我们要查在雇员中有哪些人是经理人,也就是说,有哪些人的empno号在mgr这个字段中出现过,这个时候,应当首先查询mgr中有哪些号码,然后再看看有哪些人的雇员号码在此出现:selectempno,enamefromempwhereempnoin(selectdistinctmgrfromemp);,在多行子查询中使用in,找出部门编号为20的所有员工中收入最高的职员select*fromempwheresal=all(selectsalfromempwheredeptno=20)anddeptno=20,在多行子查询中使用someall,我们要求每个部门平均薪水的等级,可以这样考虑,首先将每个部门的平均薪水求出来,然后把结果当成一张表,再用这张结果表和salgrade表做连接,以此求得薪水等级。先求出每个部门平均薪水的表t。将t和salgrade进行关联查询就可以了。select*fromsalgrades,(selectdeptno,avg(sal)avg_salfromempgroupbydeptno)twheret.avg_salbetweens.losalands.hisal;,在From子句中使用子查询,Sql的数据更新包括数据插入、删除和修改3个操作.往表中插入数据的语句是insert语句,方式有两种,一种是元组值的插入,一种是查询结果的插入元组值的插入语法如下:INSERTINTOtable(column,column.)VALUES(value,value.);一次插入操作只插入一行,SQL数据更新,insertintoemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values(1111,gao,clerk,7902,sysdate,10000,3000,40)此处插入的元组中列的个数、顺序与emp的结构完全一致,因此表名之后的列名可以省略不写insertintoempvalues(2222,gaohs,clerk,7902,sysdate,10000,3000,40)可以只插入部分列insertintoemp(empno,ename)values(3333,xiaozhang)但要求省略的列必须满足下面的条件:该列定义为允许Null值。在表定义中给出默认值,这表示如果不给出值,将使用默认值。如果不符合上面两个条件,将会报错。不能成功插入。,Insert语句(A),可以用insert语句把一个select语句的查询结果插入到一个基本表中,语法如下:Insertintotablename(column,.)select*fromtablename2创建一个临时表createtabletempasselect*fromempwhere1=2执行插入insertintossselect*fromemp;,Insert语句(A),SQL的删除操作是指从基本表中删除元组,语法如下:DELETEFROMtableWHEREcondition;其语义是从基本表中删除满足条件表达式的元组Deletefromtable表示从表中删除一切元组如果想从表中删除所有的行,不要使用delete,可使用truncatetable语句,完成相同的工作,但是速度更快。,DELETE语句(A),Update语句用于修改基本表中元组的某些列,其语法如下:UPDATEtableSETcolumn=value,column=valueWHEREcondition;其语义是:修改基本表中满足条件表达式的那些元组的列值,需修改的列值在set子句中指出。,UPDATE语句(A),事务(Transaction)是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。事务是为了保证数据库的完整性事务不能嵌套在oracle中,没有事务开始的语句。一个Transaction起始于一条DML(Insert、Update和Delete)语句,结束于以下的几种情况:用户显式执行Commit语句提交操作或Rollback语句回退。当执行DDL(Create、Alter、Drop)语句事务自动提交。用户正常断开连接时,Transaction自动提交。系统崩溃或断电时事务自动回退。,事务处理(A),Commit表示事务成功地结束,此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都以交付实施。每个Commit语句都可以看成是一个事务成功的结束,同时也是另一个事务的开始。Rollback表示事务不成功的结束,此时告诉系统,已发生错误,数据库可能处在不正确的状态,该事务对数据库的更新必须被撤销,数据库应恢复该事务到初始状态。每个Rollback语句同时也是另一个事务的开始。一旦执行了commit语句,将目前对数据库的操作提交给数据库(实际写入DB),以后就不能用rollback进行撤销。执行一个DDL,dcl语句或从SQL*Plus正常退出,都会自动执行commit命令。,Commit在创建新表时,指定的表名必须不存在,否则将出错。使用默认值:当插入行时如果不给出值,dbms将自动采用默认值。在用Create语句创建基本表时,最初只是一个空的框架,用户可以使用insert命令把数据插入表中。,表的创建(A),设计要求:建立一张用来存储学生信息的表,表中的字段包含了学生的学号、姓名、年龄、入学日期、年级、班级、email等信息,并且为grade指定了默认值为1,如果在插入数据时不指定grade得值,就代表是一年级的学生createtablestu(idnumber(6),namevarchar2(20)notnullunique,sexnumber(1)notnull,agenumber(3),sdatedate,gradenumber(2)default1,classnumber(4),emailvarchar2(50);,表的创建,使用子查询创建表的语法CREATETABLEtablecolumn(,column.)ASsubquery;新表的字段列表必须与子查询中的字段列表匹配字段列表可以省略createtableemp2asselect*fromemp;,表的创建(A),在基本表建立并使用一段时间后,可以根据实际需要对基本表的结构进行修改增加新的列用“altertableadd”语句altertableempaddaddressvarchar(20)新增加的类不能定义为“notnull”,基本表在增加一列后,原有元组在新增加的列上的值都定义为空值。删除原有的列用“altertabledrop”语句,语法格式:altertable表名dropcolumn列名altertableempdropcolumnaddress修改字段“altertable.modify.”altertableempmodify(jobvarchar(50),表结构的修改(B),在基本表不需要时,可以使用“droptable”语句撤消。在一个基本表撤消后,所有的数据都丢弃。所有相关的索引被删除droptableempcascadeconstraints可以使用RENAME语句改变表名(视图),要求必须是表(视图)的所有者RENAMEold_nameTOnew_name,表结构的修改(B),当我们创建表的时候,同时可以指定所插入数据的一些规则,比如说某个字段不能为空值,某个字段的值(比如年龄)不能小于零等等,这些规则称为约束。约束是在表上强制执行的数据校验规则.Oracle支持下面五类完整性约束:NOTNULL非空UNIQUEKey唯一键PRIMARYKEY主键FOREIGNKEY外键CHECK自定义检查约束,约束constraint(A),Oracle使用SYS_Cn格式命名约束,也可以由用户命名创建约束的时机在建表的同时创建建表后创建约束从作用上分类,可以分成两大类:表级约束:可以约束表中的任意一列或多列。可以定义出了NotNull以外的任何约束。列级约束:只能约束其所在的某一列。可以定义任何约束。,约束constraint(A),主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。主键从功能上看相当于非空且唯一一个表中只允许一个主键主键是表中能够唯一确定一个行数据的字段主键字段可以是单字段或者是多字段的组合Oracle为主键创建对应的唯一性索引,主键约束(PRIMARYKEY),主键可用下列两种形式之一定义主键子句在表的定义中加上如下子句primarykey(列)主键短语在主属性的定义之后加上primarykey字样。上述形式Oracle会自动命名约束,可自己给约束起名createtablet3(idnumber(4),constraintt3_pkprimarykey(id),主键约束(A),确保字段值不允许为空只能在字段级定义CREATETABLEemployees(employee_idNUMBER(6),nameVARCHAR2(25)NOTNULL,salaryNUMBER(8,2),hire_dateDATECONSTRAINTemp_hire_date_nnNOTNULL),非空约束(NOTNULL)(A),唯一性约束条件确保所在的字段或者字段组合不出现重复值唯一性约束条件的字段允许出现空值Oracle将为唯一性约束条件创建对应的唯一性索引CREATETABLEemployees(idNUMBER(6),nameVARCHAR2(25)NOTNULLUNIQUE,emailVARCHAR2(25),salaryNUMBER(8,2),hire_dateDATENOTNULL,CONSTRAINTemp_email_ukUNIQUE(email);,唯一性约束(UNIQUE)(A),Check约束用于对一个属性的值加以限制在check中定义检查的条件表达式,数据需要符合设置的条件createtableemp3(idnumber(4)primarykey,agenumber(2)check(age0andage0)在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件,CHECK约束(B),为了维护数据库中的数据与现实世界的一致性,关系数据库的数据与更新操作必须遵循下列三类完整性规则:实体完整性规则这条规则要求关系中在组成主键的属性上不能有空值。参照完整性规则这条规则要求“不引用不存在的实体”。例如:deptno是dept表的主键,而相应的属性也在表emp中出现,此时deptno是表emp的外键。在emp表中,deptno的取值要么为空,要么等于dept中的某个主键值。用户定义的完整性规则用户定义的完整性规则反应了某一具体的应用涉及的数据必须满足的语义要求。,关系模型的三类完整性规则(A),外键是表中的一个列,其值必须在另一表的主键或者唯一键中列出作为主键的表称为“主表”,作为外键的关系称为“依赖表”外键参照的是主表的主键或者唯一键对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除SETNULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值FOREIGNKEY(DEPTNO)REFERENCESDEPT(DEPTNO)ONDELETECASCADE|SETNULL如省略on短语,缺省为第一中处理方式。,外键约束(FOREIGNKEY)(A),可增加或删除约束,但不能直接修改altertabletablename增加addconstraintcon_nameunique(col)删除dropconstraintcom_namecascade,约束的添加和撤销(B),selectconstraint_name,constraint_typefromuser_constraintswheretable_name=aaa或者whereowner=SCOTT大写selectconstraint_name,column_namefromuser_cons_columnswhertable_name=TABLENAME,查询constraint(C),定义:视图是从若干基本表和(或)其他视图构造出来的表。在创建一个视图时,只是存放的视图的定义,也即是动态检索数据的查询语句,而并不存放视图对应的数据,在用户使用视图时才去求相对应的数据。所以视图被称作“虚表”视图的作用:可以限制对数据的访问,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。可以使复杂的查询变的简单。在编写查询后,可以方便地重用它而不必知道他的基本查询细节。提供了对相同数据的不同显示,VIEW(A),在CREATEVIEW语句后加入子查询.CREATEORREPLACEVIEWview(alias,alias.)ASsubqueryWITHREADONLY;createorreplaceviewv$_emp_deptasselectemp.deptno,ename,dnamefromempjoindeptonemp.deptno=dept.deptnowithreadonly,创建视图(A),在查询时,不需要再写完全的Select查询语句,只需要简单的写上从视图中查询的语句就可以了select*fromv$_emp_dept
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 路面混凝土施工施工设计方案
- 施工现场临时用水、电施工设计方案
- 如何与青春期孩子有效沟通
- 2026基层高血压管理指南
- 防波堤堆石混凝土及钢筋混凝土胸墙工程施工方案
- 人机协作系统设计实践心得分享技巧
- 房屋转租合同协议书模板
- 新华人寿学生平安意外伤害保险利益条款
- 创新实业深度报告:电解铝老将开启沙特新华章
- 如何加强企业税金管理分析
- 清洁教室劳动课件
- 第一单元《1.多彩的亚洲美术》课件-浙人美版初中美术七年级下册
- 无人机保险相关知识培训课件
- 课件:深入学习习近平总书记关于教育的重要论述
- 医院 全员安全生产责任制
- 超声内镜在胰腺疾病诊疗中的应用
- 供应链协同对农村电商发展的机制分析
- CIP、SIP工艺流程操作说明书
- 桩基施工安全措施方案
- 盘活利用闲置低效厂区厂房实施方案
- 高空安全培训试题及答案
评论
0/150
提交评论