您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 整字分解 >

小菜鸟之数据库

发布时间:2019-08-15 03:05 来源:未知 编辑:admin

  数据库复习提纲之文字版(这个只是自己整理文案,答案是查的,勿喷,谢谢,希望给别人一些帮助)

  它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的 适应高吞吐量的数据库解决方案。

  sql server数据库:美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案

  Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案。客户可以利用很多种第三方应用程序、工具。而SQL Server却只能在Windows上运行了。

  但SQL Sever在Window平台上的表现,和Windows操作系统的整体结合程度,使用方便性,和Microsoft开发平台的整合性都比Oracle强的很多。但Windows操作系统的稳定性及可靠性大家是有目共睹的,再说Microsoft公司的策略目标是将客户都锁定到Windows平台的环境当中,只有随着Windows性能的改善,SQL Server才能进一步提高。从操作平台这点上Oracle是完全优胜于SQL Server的了。

  也就是说Oracle支持多种操作系统,sql server支持window系统

  在oracle里有两个块参数pctfree(填充因子)和pctused(复用因子),可控制块确定块本身何时有,何时没有足够的空间接受新信息(对块的存储情况的分析机制)

  这样可降低数据行连接与行迁移的可能性。块的大小可设置(oltp块和dss块)

  在oracle中,将连续的块组成区,可动态分配区(区的分配可以是等额的也可以是自增长的)可减少空间分配次数

  在oraclel里表可以分为多个段,段由多个区组成,每个段可指定分配在哪个表空间里(段的类型分为:数据段、索引段、回滚段、临时段、cash段。oracle里还可对表进行分区,可按照用户定义的业务规则、条件或规范,物理的分开磁盘上的数据。

  system表空间(存放数据字典和数据管理自身所需的信息)

  不同的数据分别放在不同的表空间(数据字典与真实数据分开存放),在oracle里基表(存储系统参数信息)是加密存储,任何人都无法访问。只能通过用户可视视图查看。

  以页为最小分配单位,每个页为8k(不可控制,缺乏对页的存储情况的分析机制),可将8个连续的页的组成一个扩展,以进一步减少分配时所耗用的资源。(分配缺乏灵活性),在sql server里数据以表的方式存放,而表是存放在数据库里。

  Oracle的安全认证获得最高认证级别的ISO标准认证,而SQL Server并没有获得什么安全认证。这方面证明了Oracle的安全性是高于SQL Server的。

  SQL Server 只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据量的关键业务时。

  Oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持

  Oracle 多层次网络计算,支持多种工业标准,可以用ODBC, JDBC,OCI等网络客户连接

  SQL server 完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。

  Oracle 长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。

  游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。

  游标有两种类型:显式游标和隐式游标。在前述程序中用到的O...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句。

  游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。

  当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,进而控制程序的流程。隐式游标可以使用名字SQL来访问,但要注意,通过SQL游标名总是只能访问前一个DML操作或单行SELECT操作的游标属性。所以通常在刚刚执行完操作之后,立即使用SQL游标名来访问属性。游标的属性有四种,如下所示。

  说明:本例中,通过SQL%FOUND属性判断修改是否成功,并给出相应信息。

  参数是可选部分,所定义的参数可以出现在SELECT语句的WHERE子句中。如果定义了参数,则必须在打开游标时传递相应的实际参数。

  SELECT语句是对表或视图的查询语句,甚至也可以是联合查询。可以带WHERE条件、ORDER BY或GROUP BY等子句,但不能使用INTO子句。在SELECT语句中可以使用在定义游标之前定义的变量。

  在可执行部分,按以下格式将游标工作区中的数据取到变量中。提取操作必须在打开游标之后进行。

  游标打开后有一个指针指向数据区,FETCH语句一次返回指针所指的一行数据,要返回多行需重复执行,可以使用循环语句来实现。控制循环可以通过判断游标的属性来进行。

  第一种格式中的变量名是用来从游标中接收数据的变量,需要事先定义。变量的个数和类型应与SELECT语句中的字段变量的个数和类型一致。

  第二种格式一次将一行数据取到记录变量中,需要使用%ROWTYPE事先定义记录变量,这种形式使用起来比较方便,不必分别定义和使用多个变量。

  显式游标打开后,必须显式地关闭。游标一旦关闭,游标占用的资源就被释放,游标变成无效,必须重新打开才能使用。

  说明:该程序通过定义游标emp_cursor,提取并显示雇员7788的名称和职务。

  说明:实例中使用记录变量来接收数据,记录变量由游标变量定义,需要出现在游标定义之后。

  说明:该程序在游标定义中使用了ORDER BY子句进行排序,并使用循环语句来提取多行数据。

  说明:可以看到该循环形式非常简单,隐含了记录变量的定义、游标的打开、提取和关闭过程。Emp_record为隐含定义的记录变量,循环的执行次数与游标取得的数据的行数相一致。

  说明:该种形式更为简单,省略了游标的定义,游标的SELECT查询语句在循环中直接出现。

  虽然可以使用前面的形式获得游标数据,但是在游标定义以后使用它的一些属性来进行结构控制是一种更为灵活的方法。显式游标的属性如下所示。

  要判断游标emp_cursor是否处于打开状态,可以使用属性emp_cursor%ISOPEN。如果游标已经打开,则返回值为“真”,否则为“假”。具体可参照以下的训练。

  说明:本例使用emp_cursor%ISOPEN判断游标是否打开;使用emp_cursor%ROWCOUNT获得到目前为止FETCH语句返回的数据行数并输出;使用循环来获取数据,在循环体中使用FETCH语句;使用emp_cursor%NOTFOUND判断FETCH语句是否成功执行,当FETCH语句失败时说明数据已经取完,退出循环。

  说明:游标emp_cursor定义了两个参数:p_deptno代表部门编号,p_job代表职务。语句OPEN emp_cursor(10, CLERK)传递了两个参数值给游标,即部门为10、职务为CLERK,所以游标查询的内容是部门10的职务为CLERK的雇员。循环部分用于显示查询的内容。

  【练习1】修改Open语句的参数:部门号为20、职务为ANALYST,并重新执行。

  也可以通过变量向游标传递参数,但变量需要先于游标定义,并在游标打开之前赋值。对以上例子重新改动如下:

  Oracle支持动态SELECT语句和动态游标,动态的方法大大扩展了程序设计的能力。

  对于查询结果为一行的SELECT语句,可以用动态生成查询语句字符串的方法,在程序执行阶段临时地生成并执行,语法是:

  在变量声明部分定义的游标是静态的,不能在程序运行过程中修改。虽然可以通过参数传递来取得不同的数据,但还是有很大的局限性。通过采用动态游标,可以在程序运行阶段随时生成一个查询语句作为游标。要使用动态游标需要先定义一个游标类型,然后声明一个游标变量,游标对应的查询语句可以在程序的执行过程中动态地说明。

  说明:使用了二重循环,在外循环体中,动态生成游标的SELECT语句,然后打开。通过语句letter:=chr(ascii(letter)+1)可获得字母表中的下一个字母。

  错误处理部分位于程序的可执行部分之后,是由WHEN语句引导的多个分支构成的。错误处理的语法如下:

  错误是在标准包中由系统预定义的标准错误,或是由用户在程序的说明部分自定义的错误,参见下一节系统预定义的错误类型。

  凡是出现在WHEN后面的错误都是可以捕捉到的错误,其他未被捕捉到的错误,将在WHEN OTHERS部分进行统一处理,OTHENS必须是EXCEPTION部分的最后一个错误处理分支。如要在该分支中进一步判断错误种类,可以通过使用预定义函数SQLCODE( )和SQLERRM( )来获得系统错误号和错误信息。

  如果在程序的子块中发生了错误,但子块没有错误处理部分,则错误会传递到主程序中。

  说明:在以上查询中,因为编号为1234的雇员不存在,所以将发生类型为“NO_DATA_

  FOUND”的异常。“NO_DATA_FOUND”是系统预定义的错误类型,EXCEPTION部分下的WHEN语句将捕捉到该异常,并执行相应代码部分。在本例中,输出用户自定义的错误信息“编号错误,没有找到相应雇员!”。如果发生其他类型的错误,将执行OTHERS条件下的代码部分,显示“发生其他错误!”。

  说明:程序运行中发生除零错误,由WHEN OTHERS捕捉到,执行用户自己的输出语句显示错误信息,然后正常结束。在错误处理部分使用了预定义函数SQLCODE( )和SQLERRM( )来进一步获得错误的代码和种类信息。

  Oracle的系统错误很多,但只有一部分常见错误在标准包中予以定义。定义的错误可以在EXCEPTION部分通过标准的错误名来进行判断,并进行异常处理。常见的系统预定义异常如下所示。

  比如,如果程序向表的主键列插入重复值,则将发生DUP_VAL_ON_INDEX错误。

  定义后使用PRAGMA EXCEPTION_INIT来将一个定义的错误同一个特别的Oracle错误代码相关联,就可以同系统预定义的错误一样使用了。语法如下:

  程序设计者可以利用引发异常的机制来进行程序设计,自己定义异常类型。可以在声明部分定义新的异常类型,定义的语法是:

  RAISE也可以用来引发模拟系统错误,比如,RAISE ZERO_DIVIDE将引发模拟的除零错误。

  使用RAISE_APPLICATION_ERROR函数也可以引发异常。该函数要传递两个参数,第一个是用户自定义的错误编号,第二个参数是用户自定义的错误信息。使用该函数引发的异常的编号应该在20 000和20 999之间选择。

  说明:在此例中,自定义了两个异常:new_excp1和new_excp2,分别代表编号小于7000和编号大于8000的错误。在程序中通过判断编号大小,产生对应的异常,并在异常处理部分回退插入操作,然后显示相应的错误信息。

  说明:在本训练中,使用RAISE_APPLICATION_ERROR引发自定义异常,并以系统错误的方式进行显示。错误编号为20001和20002。

  可以参考下面的程序片断将出错信息记录到表中,其中,errors为记录错误信息的表,SQLCODE为发生异常的错误编号,SQLERRM为发生异常的错误信息。

  【练习1】修改雇员的工资,通过引发异常控制修改范围在600~6000之间。

  说明:emp_rec变量是根据emp表定义的记录变量,SELECT...INTO...语句将整个记录传给该变量。INSERT语句将整个记录变量插入emp1表,如果插入成功(SQL%FOUND为真),则提交事务,否则回滚撤销事务。试修改雇员编号为7902,重新执行以上程序。

  说明:第一个rpad函数产生对齐效果,第二个rpad函数根据工资额产生不同数目的*。该程序采用了隐式的简略游标循环形式。

  说明:该程序中将字段内容垂直排列。V_count变量记录循环次数,即部门个数。

  【训练4】 已知每个部门有一个经理,编写程序,统计输出部门名称、部门总人数、总工资和部门经理。

  说明:游标中使用到了起分组功能的SELECT语句,统计出各部门的总人数和总工资。再根据部门编号和职务找到部门的经理。该程序假定每个部门有一个经理。

  【训练5】 为雇员增加工资,从工资低的雇员开始,为每个人增加原工资的10%,限定所增加的工资总额为800元,显示增加工资的人数和余额。

  存储过程: 一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等)

  描述:dmp文件是二进制的,可以跨平台,并且包含权限,支持大字段数据,是用的最广泛的一种。

  第三种是导出为pde格式,pde格式是PL/SQL 自带的文件格式,且且适用于PL/SQL工具,编辑器无法查看,一般不常用。

  版权声明:本文为CSDN博主「导哥」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

  参数文件:这些文件告诉oracle在哪里可以找到控制文件,并定义一些参数

  警告文件:与跟踪文件类似,但是包含”期望“事件的有关信息,并通过一个集中式文件警告DBA

  控制文件:这些文件能告诉你数据文件,临时文件以及重做日志文件在哪里,还会指出与文件状态有关的其他元数据

  修改跟踪文件:这个文件有利于对oracle数据建立真正的增量备份。它不一定要放在闪回区,但是它只与数据库的备份与恢复有关

  闪回日志文件:这些文件存储数据块的“前映像”,以便完成新增加的FLASHBACK DATABASE命令

  版权声明:本文为CSDN博主「loveofmylife」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

  1.和其他数据库系统类似,Oracle字符串连接使用“”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样。

  2.除了“”,Oracle还支持使用CONCAT()函数进行字符串拼接,比如执行下面的SQL语句:

  如果CONCAT中连接的值不是字符串,Oracle会尝试将其转换为字符串,比如执行下面的SQL语句:

  与MYSQL的CONCAT()函数不同,Oracle的CONCAT()函数只支持两个参数,不支持两个以上字符串的拼接,比如下面的SQL语句在Oracle中是错误的:

  3.如果要进行多个字符串的拼接的话,可以使用多个CONCAT()函数嵌套使用,上面的SQL可以如下改写:

  在Oracle中实现分页的方法大致分为两种,用ROWNUM关键字和用ROWID关键字,下面来详细介绍一下:

  这应该是我们大部分程序里所用到的版本,因为这个版本很容易实现复用,中间ROW_部分,就是我们平常写到的sql语句,然后再将起始条数和终止条数作为专门的分页sql语句传入即可查询出我们想要的结果。

  从效率上看,上面的SQL语句在大多数情况拥有较高的效率,主要体现在WHERE ROWNUM = 20这句上,这样就控制了查询过程中的最大记录数,而在查询的最外层控制最小值。但最大值意味着如果查到了很大的范围(如百万级别的数据),查询就会从很大范围内往里减少,效率就会很低,因此,当面对大数据量时或者优化查询效率时,如果你用了ROWNUM,可以换第二种方法。

  Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率,但不能跨越多层。

  由于查询条件BETWEEN 10 AND 20是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,这个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比原始的查询低得多。

  这个和ROWNUM关键字类似,生成的顺序和rownum的语句一样,效率也一样(对于同样有ORDER BY 的ROWNUM语句来说),所以在这种情况下两种用法是一样的。

  ROWID仍旧需求ROWNUM,但方式不同,因此我将其归为另一大类,其代码为:

  从语句上看,共有4层Select嵌套查询,最内层为可替换的不分页原始SQL语句,但是他查询的字段只有ROWID,而没有任何待查询的实际表字段,具体查询实际字段值是在最外层实现的;

  首先通过ROWNUM查询到分页之后的10条实际返回记录的ROWID,最后通过ROWID将最终返回字段值查询出来并返回;

  和前面ROWNUM实现方式相比,该SQL的实现方式更加繁琐,通用性也不是非常好,因为要将原始的查询语句分成两部分(查询字段在最外层,表及其查询条件在最内层),想要复用就很困难了;

  但这种实现在特定场景下还是有优势的:比如我们经常要翻页到很后面,比如10000条记录中我们经常需要查9000-9100及其以后的数据;此时该方案效率可能要比前面的高;

  因为前面的方案中是通过ROWNUM = 9100来控制的,这样就需要查询出9100条数据,然后取最后9000-9100之间的数据,而这个方案直接通过ROWID取需要的那100条数据;

  从不断向后翻页这个角度来看,第一种实现方案的成本会越来越高,基本上是线性增长,而第三种方案的成本则不会像前者那样快速,他的增长只体现在通过查询条件读取ROWID的部分;

  因此,在我们实际项目中,基本分页都是可以单靠ROWNUM就可以实现,而在数据量只有几十万的情况下,效率也是够的,如果一定要优化,则可以考虑ROWID。

  版权声明:本文为CSDN博主「death05」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

  1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windows平台的稳定性和安全性影响了sql server的稳定性和安全性

  微观上: 从数据类型,数据库的结构等等回答2. 如何使用Oracle的游标?

  2). 显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;隐式游标是在执行插入 (insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。

  3). 显式游标的操作:打开游标、操作游标、关闭游标;PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它3. Oracle中function和procedure的区别?

  2). 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值

  3). 函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使用存储过程

  4). 在sql数据操纵语句中只能调用函数而不能调用存储过程4. Oracle的导入导出有几种方式,有何区别?

  方法1. 导入/导出的是二进制的数据, 2.plsql导入/导出的是sql语句的文本文件

  数据文件(一般后缀为.dbf或者.ora),日志文件(后缀名.log),控制文件(后缀名为.ctl)6. 怎样优化Oracle数据库,有几种方式?

  个人理解,数据库性能最关键的因素在于IO,因为操作内存是快速的,但是读写磁盘是速度很慢的,优化数据库最关键的问题在于减少磁盘的IO,就个人理解应该分为物理的和逻辑的优化, 物理的是指oracle产品本身的一些优化,逻辑优化是指应用程序级别的优化

  6). 建立表分区,将数据分别存储在不同的分区上(以空间换取时间,减少IO)

  1). 可以对表进行逻辑分割,如中国移动用户表,可以根据手机尾数分成10个表,这样对性能会有一定的作用

  2). Sql语句使用占位符语句,并且开发时候必须按照规定编写sql语句(如全部大写,全部小写等)oracle解析语句后会放置到共享池中

  如: select * from Emp where name=? 这个语句只会在共享池中有一条,而如果是字符串的话,那就根据不同名字存在不同的语句,所以占位符效率较好

  3). 数据库不仅仅是一个存储数据的地方,同样是一个编程的地方,一些耗时的操作,可以通过存储过程等在用户较少的情况下执行,从而错开系统使用的高峰时间,提高数据库性能

  4). 尽量不使用*号,如select * from Emp,因为要转化为具体的列名是要查数据字典,比较耗时

  对于多表连接查询,可能oracle的优化器并不会优化到这个程度, oracle 中多表查询是根据FROM字句从右到左的数据进行的,那么最好右边的表(也就是基础表)选择数据较少的表,这样排序更快速,如果有link表(多对多中间表),那么将link表放最右边作为基础表,在默认情况下oracle会自动优化,但是如果配置了优化器的情况下,可能不会自动优化,所以平时最好能按照这个方式编写sql

  Oracle 中Where字句时从右往左处理的,表之间的连接写在其他条件之前,能过滤掉非常多的数据的条件,放在where的末尾, 另外!=符号比较的列将不使用索引,列经过了计算(如变大写等)不会使用索引(需要建立起函数), is null、is not null等优化器不会使用索引

  数据库的数据操作比较消耗数据库资源的,尽量使用批量处理,以降低事务操作次数7. Oracle中字符串用什么符号链接?

  1). 增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍可以使用;

  2). 减少关闭时间:如果系统故障只影响表的一部份分区,那么只有这部份分区需要修复,可能比整个大表修复花的时间更少;

  3). 维护轻松:如果需要得建表,独产管理每个公区比管理单个大表要轻松得多;

  4). 均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;

  5). 改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快

  6). 分区对用户透明,最终用户感觉不到分区的存在。9. Oracle是怎样分页的?

  Nclob 可变字符类型的数据,不过其存储的是Unicode字符集的字符数据

  11. Oracle中使用了索引的列,对该列进行where条件查询、分组、排序、使用聚集函数,哪些用到了索引?

  均会使用索引, 值得注意的是复合索引(如在列A和列B上建立的索引)可能会有不同情况

  通过操作系统的定时任务调用脚本导出数据库13. Oracle中where条件查询和排序的性能比较?

  Order by使用索引的条件极为严格,只有满足如下情况才可以使用索引,

  1). order by中的列必须包含相同的索引并且索引顺序和排序顺序一致

  所以排序的性能往往并不高,所以建议尽量避免order by14. 解释冷备份和热备份的不同点以及各自的优点?

  冷备份发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法

  2).在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。

  3).因难于维护,所以要特别仔细小心,不允许“以失败而告终”。15. 解释data block , extent 和 segment的区别?

  data block 数据块,是oracle最小的逻辑单位,通常oracle从磁盘读写的就是块

  tablespace表空间,数据库中数据逻辑存储的地方,一个tablespace可以包含多个数据文件

  1). Truncate 和delete都可以将数据实体删掉,truncate 的操作并不记录到 rollback日志,所以操作速度较快,但同时这个数据不能恢复

  简言之就是存在加了锁而没有解锁,可能是使用锁没有提交或者回滚事务,如果是表级锁则不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行

  1 .使用游标可以执行多个不相关的操作.如果希望当产生了结果集后,对结果集中的数据进行多种不相关的数据操作

  3. 使用游标可以建立命令字符串,使用游标可以传送表名,或者把变量传送到参数中,以便建立可以执行的命令字符串.

  但是个人认为游标操作效率不太高,并且使用时要特别小心,使用完后要及时关闭

  1. 存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

  3. 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

  3. 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。

  4. 可以降低网络的通信量, 不需要通过网络来传送很多sql语句到数据库服务器了

  当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。

  --遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。

  --错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。

  经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;

  可选择性低的关键字,但数据的值分布差异很大时,选择性数据比较少时仍然可以利用索引提高效率

  A、正确选择复合索引中的第一个字段,一般是选择性较好的且在where子句中常用的字段上;

  B、复合索引的几个字段经常同时以AND方式出现在Where子句中可以建立复合索引;否则单字段索引;

  C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

  D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

  E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

  3. 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

  4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

  3. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大

  4. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度

  1. 可以简单的将视图理解为sql查询语句,视图最大的好处是不占系统空间

  2. 一些安全性很高的系统,不会公布系统的表结构,可能会使用视图将一些敏感信息过虑或者重命名后公布结构

  自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。

  显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。

  共享锁:共享锁使一个事务对特定数据库资源进行共享访问另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。

  排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。

  行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。

  表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档)。

  死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。

  如事务1在表A行记录#3中有一排它锁,并等待事务2在表A中记录#4中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务; 1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。死锁一般是因拙劣的事务设计而产生。死锁只能使用SQL下:alter system kill session sid,serial#;或者使用相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者使用其它工具杀掉死锁进程。

  排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁。如使用alter table语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。

  共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。

  如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。

  分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语句时,ORACLE重新分析编译此语句。

  内部闩锁:这是ORACLE中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。

  由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.要分两部分来写:

  2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置

  3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别。

  游标类似指针,游标可以执行多个不相关的操作.如果希望当产生了结果集后,对结果集中的数据进行多 种不相关的数据操作

  函数可以理解函数是存储过程的一种; 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值;两者都可以通过out参数返回值, 如果需要返回多个参数则建议使用存储过程;在sql数据操纵语句中只能调用函数而不能调用存储过程

  31. 使用oracle 伪列删除表中重复记录:30. 常见的关系型数据库有哪些

  3、简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

  1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;

  3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;

  4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。

  3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。

  3.RDBMS中的数据存储在被称为表(tables)的数据库对象中。 (解析理解 表(tables)被称为数据库对象?)

  一个数据库通常包含一个或者多个表,每个表由一个名字标识(例如“客户”或“订单”),表包含带有数据的记录。

  5.可以吧SQL分为2部分,DML(数据操作语言)、DDL(数据定义语言)

  7.SQL数据定义语言(DDL)部分使我们有能力创建或者删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束

  版权声明:本文为CSDN博主「匠人科」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

  SQL函数即数据库的内置函数,可以运用在SQL语句中实现特定的功能。SQL单行函数对于每一行数据进行计算后得到一行输出结果。SQL单行函数根据数据类型分为字符函数、数字函数、日期函数、转换函数,另外还有一些别的函数。来自百度

  计算T_CHAR中 t_date 下一个星期三的日期,并计算系统时间的t_date最后一天的日期

  ORACLE数据库中会将 char或varchar2 与 date 和 number 之间进行相互转换。如前例中日期date可以和number进行加减运算,也可以将输入的varchar2类型存入date型的数据库中,称之为隐形转换。

  注:日期格式说明表示year的:y 表示年的最后一位 yy 表示年的最后2位 yyy 表示年的最后3位 yyyy 用4位数表示年;

  表示day的:dd 表示当月第几天;ddd表示当年第几天;dy 当周第几天 简写 比如星期五或者fri;day当周第几天 全写比如星期五或者friday;

  表示hour的:hh 2位数表示小时 12进制; hh24 2位数表示小时 24小时;

  NVL(A,B) ,能够将一个空值转换成已知的值,若A为空显示A,非空显示B;

  SQL函数即数据库的内置函数,可以运用在SQL语句中实现特定的功能。SQL单行函数对于每一行数据进行计算后得到一行输出结果。SQL单行函数根据数据类型分为字符函数、数字函数、日期函数、转换函数,另外还有一些别的函数。来自百度

  ------------版权声明:本文为CSDN博主「叶清逸」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

  1.关键字AVG(平均值)、SUM(合计) ,在查询数值型的数据时可以使用AVG 和 SUM 函数。示例代码如下:

  需要注意一个问题,AVG函数只是计算不为空的数据,可以使用NVL函数解决该问题,NVL函数使分组函数无法忽略空值。

  2.关键字MAX(最大值)、MIN(最小值),可以对任意数据类型的数据使用MIN和MAX 函数select

  3. COUNT(计数)函数,COUNT(*) 返回表中记录总数,适用于任意数据类型,COUNT(expr) 返回expr不为空的记录总数。如以下两个例子:

  5.group by字句:在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中, 包含在 GROUP BY 子句中的列不必包含在SELECT 列表中。另外需要注意的是,不能

  在WHERE 子句中使用组函数,可以在 HAVING 子句中使用组函数。

  1.关键字AVG(平均值)、SUM(合计) ,在查询数值型的数据时可以使用AVG 和 SUM 函数。示例代码如下:

  需要注意一个问题,AVG函数只是计算不为空的数据,可以使用NVL函数解决该问题,NVL函数使分组函数无法忽略空值。

  2.关键字MAX(最大值)、MIN(最小值),可以对任意数据类型的数据使用MIN和MAX 函数select

  3. COUNT(计数)函数,COUNT(*) 返回表中记录总数,适用于任意数据类型,COUNT(expr) 返回expr不为空的记录总数。如以下两个例子:

  5.group by字句:在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中, 包含在 GROUP BY 子句中的列不必包含在SELECT 列表中。另外需要注意的是,不能

  在WHERE 子句中使用组函数,可以在 HAVING 子句中使用组函数。

  定义: COALESCE是一个函数, (expression_1, expression_2, ,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。

  // 场景一:你想要获取最大值,然后+1返回(即返回的值已经默认为空了),程序接收了本来不该为空的值去运算,就会出错。

  // 这样子就可以设置一个值,让你第一个不成功后,返回指定的值,如下面,返回的是1.

  Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。

  // 场景一:你想要获取最大值,然后+1返回(即返回的值已经默认为空了),程序接收了本来不该为空的值去运算,就会出错。

  // 这样子就可以设置一个值,让你第一个不成功后,返回指定的值,如下面,返回的是1.

  版权声明:本文为CSDN博主「pengjunzhen」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

  字符串数据类型还可以依据存储空间分为固定长度类型(CHAR/NCHAR) 和可变长度类型(VARCHAR2/NVARCHAR2)两种.

  所谓固定长度:是指虽然输入的字段值小于该字段的限制长度,但是实际存储数据时,会先自动向右补足空格后,才将字段值的内容存储到数据块中。这种方式虽然比较浪费空间,但是存储效率较可变长度类型要好。同时还能减少数据行迁移情况发生。

  所谓可变长度:是指当输入的字段值小于该字段的限制长度时,直接将字段值的内容存储到数据块中,而不会补上空白,这样可以节省数据块空间。

  CHAR类型,定长字符串,会用空格填充来达到其最大长度。非NULL的CHAR(12)总是包含12字节信息。CHAR字段最多可以存储2,000字节的信息。如果创建表时,不指定CHAR长度,则默认为1。另外你可以指定它存储字节或字符,例如 CHAR(12 BYTYE) CHAR(12 CHAR).一般来说默认是存储字节,你可以查看数据库参数

  如果串的长度小于或等于250(0x01~0xFA), Oracle 会使用1 个字节来表示长度。对于所有长度超过250 的串,都会在一个标志字节0xFE 后跟有两个字节来表示长度。因此,如果有一个包含“Hello World”的VARCHAR2(80),则在块中可能如图12.-1 所示

  这是一个包含UNICODE格式数据的定长字符串。NCHAR字段最多可以存储2,000字节的信息。它的最大长度取决于国家字符集。另外查询时,如果字段是NCHAR类型,则需要如下书写

  不要使用VARCHAR数据类型。使用VARCHAR2数据类型。虽然VARCHAR数据类型目前是VARCHAR2的同义词,VARCHAR数据类型将计划被重新定义为一个单独的数据类型用于可变长度的字符串相比,具有不同的比较语义。

  变长字符串,与CHAR类型不同,它不会使用空格填充至最大长度。VARCHAR2最多可以存储4,000字节的信息。

  这是一个包含UNICODE格式数据的变长字符串。 NVARCHAR2最多可以存储4,000字节的信息。

  NUMBER(P,S)是最常见的数字类型,可以存放数据范围为10^130~10^126(不包含此值),需要1~22字节(BYTE)不等的存储空间。

  P 是Precison的英文缩写,即精度缩写,表示有效数字的位数,最多不能超过38个有效数字

  S是Scale的英文缩写,可以使用的范围为-84~127。Scale为正数时,表示从小数点到最低有效数字的位数,它为负数时,表示从最大有效数字到小数点的位数

  INTEGER是NUMBER的子类型,它等同于NUMBER(38,0),用来存储整数。若插入、更新的数值有小数,则会被四舍五入。

  浮点数可以有一个十进制数点任何地方从第一个到最后一个数字,或者可以在所有有没有小数点。指数可能(可选) 用于以下数量增加的范围 (例如, 1.777e-20)。刻度值不适用于浮点数字,因为可以显示在小数点后的位数的数量不受限制。

  二进制浮点数不同数量的值由 Oracle 数据库内部存储的方式。使用小数精度数存储值。完全相同号码存储范围和数量由支持的精度内的所有文本。正是因为使用小数精度(数字 0 到 9) 表示文本存储文本。使用二进制精度 (数字 0 和 1) 存储二进制浮点数。这种存储方案不能代表所有确切地使用小数精度的值。频繁地,将值从十进制转换为二进制的精度时出现的错误时撤消值回从二进制转换为十进制精度。在字面 0.1 是一个这样的例子。

  BINARY_FLOAT 是 32 位、 单精度浮点数字数据类型。可以支持至少6位精度,每个 BINARY_FLOAT 的值需要 5 个字节,包括长度字节。

  在数字的列中,浮点数有小数精度。在 BINARY_FLOAT 或 BINARY_DOUBLE 的列中,浮点数有二进制的精度。二进制浮点数支持的特殊值无穷大和 NaN (不是数字)。

  您可以指定列在表 2-4 范围内的浮点数。数字文本中定义了用于指定浮点数的格式。

  Float(n),数 n 指示位的精度,可以存储的值的数目。N 值的范围可以从 1 到 126。若要从二进制转换为十进制的精度,请将 n 乘以 0.30103。要从十进制转换为二进制的精度,请用 3.32193 乘小数精度。126 位二进制精度的最大值是大约相当于 38 位小数精度。

  日期类型用于存储日期数据,但是并不是使用一般的格式(2012-08-08)直接存储到数据库的。

  DATE是最常用的数据类型,日期数据类型存储日期和时间信息。虽然可以用字符或数字类型表示日期和时间信息,但是日期数据类型具有特殊关联的属性。为每个日期值,Oracle 存储以下信息: 世纪、 年、 月、 日期、 小时、 分钟和秒。一般占用7个字节的存储空间。

  这是一个7字节或12字节的定宽日期/时间数据类型。它与DATE数据类型不同,因为TIMESTAMP可以包含小数秒,带小数秒的TIMESTAMP在小数点右边最多可以保留9位

  内置的LOB数据类型包括BLOB、CLOB、NCLOB、BFILE(外部存储)的大型化和非结构化数据,如文本、图像、视屏、空间数据存储。BLOB、CLOB、NCLOB类型

  它存储非结构化的二进制数据大对象,它可以被认为是没有字符集语义的比特流,一般是图像、声音、视频等文件。BLOB对象最多存储(4 gigabytes-1) * (database block size)的二进制数据。

  二进制文件,存储在数据库外的系统文件,只读的,数据库会将该文件当二进制文件处理

  它存储变长字符串,最多达2G的字符数据(2GB是指2千兆字节, 而不是2千兆字符),与VARCHAR2 或CHAR 类型一样,存储在LONG 类型中的文本要进行字符集转换。ORACLE建议开发中使用CLOB替代LONG类型。支持LONG 列只是为了保证向后兼容性。CLOB类型比LONG类型的限制要少得多。 LONG类型的限制如下:

  6.LONG列不能出现在WHERE子句或完整性约束(除了可能会出现NULL和NOT NULL约束)

  5.2 LONG RAW 类型,能存储2GB 的原始二进制数据(不用进行字符集转换的数据)

  用于存储二进制或字符类型数据,变长二进制数据类型,这说明采用这种数据类型存储的数据不会发生字符集转换。这种类型最多可以存储2,000字节的信息

  在数据库中的每一行都有一个地址。然而,一些表行的地址不是物理或永久的,或者不是ORACLE数据库生成的。

  例如,外部表的ROWID(如通过网关访问DB2表)不是​​标准的ORACLE的rowid。

  ORACLE使用通用的ROWID(UROWIDs)的存储地址的索引组织表和外表。索引组织表有逻辑urowids的,和国外表的外urowids,。UROWID这两种类型的存储在ROWID伪(堆组织的表的物理行id)。

  创建基于逻辑的rowid在表中的主键。逻辑的rowid不会改变,只要主键不改变。索引组织表的ROWID伪UROWID数据类型。你可以访问这个伪列,你会堆组织表的ROWID伪(即使用一个SELECT ...ROWID语句)。如果你想存储的rowid索引组织表,那么你就可以定义一列的表型UROWID到列检索值的ROWID伪。

  Mysql数据库的约束类型有:主键约束(Primary Key),外键约束(Foreign Key),非空约束(Not Null),唯一性约束(Unique),默认约束(Default)。一.主键约束(Primary Key) 主键约束要求主键列的数据唯一,并且不能为空。主键分为两种类型:单字段主键和多字段联合主键。1.单字段主键在定义列的同时指定主键,语法规则:字段名 数据类型 Primary Key [默认值]

  一般在建表时我们会选择将主键放在所有列后。2.多字段联合主键主键由多个字段联合组成。语法规则:Primary Key[字段1,字段2,....,字段n]

  主键由多个字段联合组成。语法规则:Primary Key[字段1,字段2,....,字段n]

  外键用来在两个表的数据之间建立连接,它可以是一列或者多列。一个表可以有一个或者多个外键。一个表的外键可以为空,若不为空,则每一个外键值必须等于另一个表中主键的某个值。

  主表(父表):对于两个具有关联关系的表而言,相关联字段中的主键所在的那个表即是主表。

  从表(子表):对于两个具有关联关系的表而言,相关联字段中的外键所在的那个表即是从表。

  唯一性约束要求该列唯一,允许为空,但是只能出现一个空值。唯一约束可以保证一列或者几列不出现重复值。

  声明:Unique在表中可以有一个或者多个字段声明,而Primary Key,只能有一个。

  序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。

  其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。

  序列的创建语法如下: CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE nNOMAXVALUE}] [{CYCLENOCYCLE}] [{CACHE nNOCACHE}]; INCREMENT BY 用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的。

  START WITH 定义序列的初始值(即产生的第一个值),默认为1。

  MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

  事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。

  通俗的说的话,事务就是一件事情,要么成功执行到底,要么回到起点,什么都不做。

  原子性(Atomicity):正如原子时自然界最小颗粒,具有不可再分的特征一样。意思就是说,咱的事务是一个逻辑单元,不能再拆分了,比如整体的执行。

  一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。比如说银行之间的转账,从A账户向B账户转入1000元。系统先减少A账户1000元,然后再为B账户增加1000元。如果全部执行成功的话,则数据库就处于一致性状态。如果仅仅A账户金额修改,B账户没有增加的话,那么数据库就处于不一致的状态。因此,一致性必须通过原子性来保证。

  隔离型(Isolation):各个事务执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态。并发事务之间是不能互相影响的。

  持久性(Durability):事务一旦提交,对数据所做的改变都要记录到存储器中,通常就是保存进物理数据库。

  我们设计数据库的目的是什么?当然是为了我们使用起来方便,管理起来方便等等。这样,我们就需要一套科学的、规则的规范来满足它。

  范式的英文名称是 Normal Form,它是英国人d(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。

  好处:数据库的设计范式是数据库设计所需要满足的规范,刚刚也说过,它是为了满足我们使用和管理的需要,由此可见,它是对原先数据的优化,使我们处理数据更为便利。

  不足:数据往往种类繁多,而且每种数据之间又互相关联,因此,在设计数据库时,所需要满足的范式越多,那表的层次及结构也就越复杂,最终造成数据的处理困难。这样,还不如不满足这些范式呢。所以在使用范式的时候也要细细斟酌,是否一定要使用该范式,必须根据实际情况做出选择。一般情况下,我们使用前三个范式已经够用了,不再使用更多范式,就能完成对数据的优化,达到最优效果。

  规范定义:第一范式是指数据库表中的每一列都是不可分割的基本数据项;同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。

  有两个点:实体的属性的不可分割性(原子性)、实体的属性的不重复性 / 不能有多个值。

  解释一下实体和属性:就好比一个客户(实体),他有姓名(属性),年龄(属性),电话(属性),地址(属性)等属性。说通俗点就是表中的一行数据。

  这个说的就是实体的属性不可再分,就好比一个人的电话号码分为三种:手机号码、家庭电话以及办公电话。这样,我们在设计表时,就不能这样设计:

  2.实体的属性的不重复性 / 不能有多个值(其实就是一个属性栏里不能出现多个值,毕竟同一个属性栏中的值的属性也必然是一样的)

  即不能出现多个或者是重复的实体的属性。注意,这里是属性的不重复或单一性,什么叫属性不重复?打个比方,如手机号码、家庭电话以及办公电话三者都属于电话号码这一属性,而当我们在设计表时,在电话号码这一属性中就可能会出现这个人的三个号码,刚也说了,这三个号码都属于电话号码这一属性,因此属于相同属性,这样就违反了实体的属性的不重复性这一特性。又因为三个号码出现在了同一个属性中,因此也就同时违反了实体的属性不能有多个值这一特性。

  显然,我们可以看到,Tel这一栏存放的是客户的联系电话,但是对于每个客户而言,他们都具有三个电话(手机号码、家庭电话以及办公电话),这样,我们在设计时就不能将这三个相同的属性放在同一个属性列表当中,因此,上面这张表违反了数据库设计的第一范式。具体解决方案如下:

  1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不能被称为关系型数据库。也就是说,只要是关系型数据库,就一定要满足第一范式。

  是在第一范式( 1NF) 的基础上建立起来的,即满足第二范式( 2NF)必须先满足第一范式( 1NF)。

  规范定义:如果关系模型R为第一范式,并且数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,即符合第二范式。R中的每一个非主属性完全函数依赖于R的某个候选键,则称R为第二范式(如果A是关系模式R的候选键的一个属性,则称A是R的主属性,否则称A是R的非主属性)。

  候选键(候选关键字段):就是可以区别一个个实体的最少属性组合,是每个实体的唯一标识。一个表可能有多个候选键,从这些候选键中选择一个作为主键。

  比如,一个学生信息表,其中每一个学生都拥有Id,Name,Age,Sex,Add等属性,我们假设Id存放的是学生的身份证号码,这样Id就可以作为每个学生的唯一标识,那么这个Id就可以被称为候选键。又因为它作为每个学生的唯一标识,那么我们可以理解为它与其他属性完全相关,这就是完全函数依赖。

  这时,我们假设Id和Name作为学生的唯一标识,也就是候选键,这样做显然是不行的。因为即使去掉Name,我们也同样可以确定一个学生,也就是说,作为候选键的属性组合,必须都有自己的作用。而且,假设又出现了一个字段(属性)银行卡号,那么,这个银行卡号仅与Id有关,而不与Name相关,这样,就出现了非关键字段对候选关键字段的部分函数依赖,那么这个属性组合是不符合要求的,应当重新选择。

  该表中一个学生可以选多门课,一门课有多个学生,学生姓名可能出现重名。因此学号和课程号可以唯一确定一条记录,因此用学号和课程号做主键。表中姓名、专业通过学号就能唯一确定,但是课程名却只与课程号有关,这样就形成了部分函数依赖,违背了第二范式。

  2.数据更新异常:假如现在有一门“计算机导论”要加入表中,但是由于没有学生考这一门课,那么这么课程就不能加入到表中(只有课程号和课程名而没有其他信息)。

  规范定义:在满足第二范式的基础上,在实体中不存在非主键属性传递函数依赖于主键属性。

  3. 每一个表都不包含其他表已经包含的非主关键字信息。通俗的说:就是表中每一列都要与主键直接相关,而不是间接相关。

  就比如上面的例子中,在成绩表中可以出现学号,但是不能出现与学号相关的其他信息,就是这个意思。

  版权声明:本文为CSDN博主「史博辉的开发日记」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

  trueTechArticle小菜鸟之数据库, 数据库复习提纲之文字版(这个只是自己整理文案,答案是查的,勿喷,谢谢,希望给别人一些帮助) 1 、 Oracle和 SQL...

http://aedelfrith.com/zhengzifenjie/214.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有