数据库练习题

数据库知识点汇总
1、Oracle和 SQL server2005的区别
Oracle数据库:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。
它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的 适应高吞吐量的数据库解决方案。
sql server数据库:美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案
两者的区别:
(1)操作的平台不同
• Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案。客户可以利用很多种第三方应用程序、工具。而SQL Server却只能在Windows上运行了。
•   但SQL Sever在Window平台上的表现,和Windows操作系统的整体结合程度,使用方便性,和Microsoft开发平台的整合性都比Oracle强的很多。但Windows操作系统的稳定性及可靠性大家是有目共睹的,再说Microsoft公司的策略目标是将客户都锁定到Windows平台的环境当中,只有随着Windows性能的改善,SQL Server才能进一步提高。从操作平台这点上Oracle是完全优胜于SQL Server的了。
• 也就是说Oracle支持多种操作系统,sql server支持window系统
(2)文体结构不同
• oracle的文件体系结构为:
数据文件 .dbf(真实数据)
日志文件 .rdo
控制文件 .ctl
参数文件 .ora
sql server的文件体系结构为:
.mdf (数据字典)
.ndf (数据文件)
.ldf (日志文件)
(3)存储结构不同
• oracle存储结构:
在oracle里有两个块参数pctfree(填充因子)和pctused(复用因子),可控制块确定块本身何时有,何时没有足够的空间接受新信息(对块的存储情况的分析机制)
这样可降低数据行连接与行迁移的可能性。块的大小可设置(oltp块和dss块)
在oracle中,将连续的块组成区,可动态分配区(区的分配可以是等额的也可以是自增长的)可减少空间分配次数
在oraclel里表可以分为多个段,段由多个区组成,每个段可指定分配在哪个表空间里(段的类型分为:数据段、索引段、回滚段、临时段、cash段。oracle里还可对表进行分区,可按照用户定义的业务规则、条件或规范,物理的分开磁盘上的数据。
这样大大降低了磁盘争用的可能性。
oracle有七个基本表空间:
·system表空间(存放数据字典和数据管理自身所需的信息)
·rbs回滚表空间
·temp临时表空间
·tools交互式表空间
·users用户默认表空间
·indx索引表空间
·dbsys福数据表空间
不同的数据分别放在不同的表空间(数据字典与真实数据分开存放),在oracle里基表(存储系统参数信息)是加密存储,任何人都无法访问。只能通过用户可视视图查看。
• sql server 存储结构
以页为最小分配单位,每个页为8k(不可控制,缺乏对页的存储情况的分析机制),可将8个连续的页的组成一个‘扩展’,以进一步减少分配时所耗用的资源。(分配缺乏灵活性),在sql server里数据以表的方式存放,而表是存放在数据库里。
sql server有五个基本数据库: www.2cto.com
·master(数据字典)
·mode(存放样版)
·tempdb(临时数据库)
·msdb(存放调度信息和日志信息)
·pubs(示例数据库)
真实数据与数据字典存放在一起。对系统参数信息无安全机制。
(4)安全性
Oracle的安全认证获得最高认证级别的ISO标准认证,而SQL Server并没有获得什么安全认证。这方面证明了Oracle的安全性是高于SQL Server的。
(5)性能不同
SQL Server 多用户时性能不佳
Oracle 性能最高, 保持windowsNT下的TPC-D和TPC-C的世界记录。
(6)开放性
SQL Server 只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据量的关键业务时。
Oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持
(7)客户端支持及应用模式
SQL Server C/S结构,只支持windows客户,可以用ADO,DAO,OLEDB ,ODBC连接.
Oracle 多层次网络计算,支持多种工业标准,可以用ODBC, JDBC,OCI等网络客户连接
意见:
SQL server 完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。
Oracle 长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。

  1. 如何使用Oracle的游标?
    一,游标的概念与作用
       摘自百度百科:游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成的一个临时文件,提供了在查询结果集中向前或向后浏览数据、处理结果集中数据的能力。有了游标,用户就可以访问结果集中任意一行数据,在将游标放置到某行之后,可以在该行或从该位置的行块上执行操作。
    其实就是用于存放查询出来的多条记录的一个临时变量,我们可以从这个变量中取出我们需要的信息字段。
    二,游标的分类
        游标有两种类型:显式游标和隐式游标。
      一般我们用到的SELECT…INTO…查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。但是如果要提取多行数据,就需要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句。 游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。
      简单的DML操纵语句和单行查询语句会使用隐式游标,这些语句分别是插入insert语句,更新update语句,删除delete语句,单行select查询语句。
    当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,进而控制程序的流程。隐式游标可以使用名字SQL来访问,但要注意,通过SQL游标名总是只能访问前一个DML操作或单行SELECT操作的游标属性。所以通常在刚刚执行完操作之后,立即使用SQL游标名来访问属性。
      游标的属性有以下四种
        1.SQL%ROWCOUNT 返回值为一个整型数字 代表DML语句成功执行的数据行数
        2.SQL%FOUND 布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功
        3.SQL%NOTFOUND 布尔型 值为true表示插入、删除、更新或单行查询操作失败。
        4.SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假
    三,游标的使用
        隐式游标的使用主要就是以上的四种属性的使用,使用它们来进行一些流程控制。
        显示游标的声明和使用
          cursor cursor_name[ 参数1 参数类型,参数2,参数类型…] is select 语句;
        游标的使用步骤:
          1.声明一个游标
          2.打开游标 open 游标名(参数1,参数2…);
          3.使用循环遍历游标,从游标中取值。fetch 游标名 into 变量名,循环的退出条件是 游标名%notfound;
          4.关闭游标 close 游标名;
        游标的遍历(两种方式)
          1.使用loop循环遍历
            例如 :

declare
              cursor outemp is select * from emp;
              ouem emp%rowtype;//也可以是%type,但是必须和表中的类型一致。
            begin
              open outemp;
              loop
                fetch outemp into ouem;
                exit when outemp%notfound;//退出条件
                dbms_output.put_line(ouem.ename || ’ ’ ||ouem.sal);
              end loop;
              close outemp;
            end;
      2.使用for循环遍历游标
        例如:

declare
              cursor outfor is select * from emp;
            begin
              for vrow in outfor loop
                dbms_output.put_line(vrow.ename || ’ ’ || vrow.sal);
              end loop;
            end;

使用for循环遍历游标的好处:1.不用声明额外的变量,2.不用打开和关闭游标,3.写法简单。
    系统引用游标
      1. 声明游标 : 游标名 sys_refcursor
      2. 打开游标: open 游标名 for select语句;
      3. 从游标中取数据
      4. 关闭游标
     例如:

--输出员工表中所有的员工姓名和工资
        declare
          vrows sys_refcursor;
          vrow emp%rowtype;
        begin
          open vrows for select * from emp;
          loop
            fetch vrows into vrow;
            exit when vrows%notfound;
            dbms_output.put_line('姓名:'||vrow.ename ||' 工资: ' || vrow.sal);
          end loop;
          close vrows;
        end;

以上就是游标的基础,使用游标时一定要记得关闭游标,还有就是在定义变量时需要注意定义的类型必须要和表中的字段类型一致,否则会出错。

  1. Oracle中function和procedure的区别?
    1). 可以理解函数是存储过程的一种
    2). 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值
    3). 函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使用存储过程
    4). 在sql数据操纵语句中只能调用函数而不能调用存储过程

  2. Oracle的导入导出有几种方式,有何区别?
    1.dmp文件方式
    描述:dmp文件是二进制的,可以跨平台,并且包含权限,支持大字段数据,是用的最广泛的一种。

导出语法:exp 用户名/密码@监听器路径/数据库实例名称 file=e:数据库文件.dmp full=y ignore=y ;其中full = y ,表示整个数据库操作; ignore=y,忽略错误,继续操作;
重点内容

导出举例:exp jojo/jojo@localhost/my_database file=e:my_database.dmp full=y ignore=y

导入语法:imp 用户名/密码@监听器路径/数据库实例名称 file=e:数据库文件.dmp full=y ignore=y ;

导入举例:imp jojo/jojo@localhost/my_database file=e:my_database.dmp full=y ignore=y

2.sql文件方式
SQL文件可用文本编辑器查看,有利于可读性,但效率不如dmp文件,适合小数据量导入导出。尤其注意的是表中不能有大字段(blob,clob,long),如果有,会提示不能导出(提示如下: table contains one or more LONG columns cannot export in sql format,user Pl/sql developer format instead)

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

  1. Oracle中有哪几种文件?
    Oracle单实例下一共有8种主要的文件类型,分别是
    参数文件:这些文件告诉oracle在哪里可以找到控制文件,并定义一些参数
    跟踪文件:这通常是一个服务器进程对某种异常错误做出响应时产生的诊断文件
    警告文件:与跟踪文件类似,但是包含”期望“事件的有关信息,并通过一个集中式文件警告DBA
    数据文件:存放数据表,索引以及其他段的文件
    临时文件:这些文件用于完成基于磁盘的排序和临时存储
    控制文件:这些文件能告诉你数据文件,临时文件以及重做日志文件在哪里,还会指出与文件状态有关的其他元数据
    重做日志文件:这些就是事物日志
    密码文件:这些文件用于通过网络完成管理活动的用户进行认证。
    从oracle10g开始又增加了2种可选的文件
    修改跟踪文件:这个文件有利于对oracle数据建立真正的增量备份。它不一定要放在闪回区,但是它只与数据库的备份与恢复有关
    闪回日志文件:这些文件存储数据块的“前映像”,以便完成新增加的FLASHBACK DATABASE命令
    与数据库有关的其他类型文件
    转储文件:这些文件有exp导出并由imp导入
    数据泵文件:这些文件有expdp导出并由inpdp导入

  2. Oracle中字符串用什么符号链接?
    Oracle数据库中,使用“||”进行字符串连接
    代码如下:
    SELECT ‘工号为’||FNumber||‘的员工姓名为’||FName FROM T_Employee
    WHERE FName IS NOT NULL

除了“||”,Oracle还支持使用CONCAT()函数进行字符串拼接,比如执行下面的SQL语句:
SELECT CONCAT(‘工号:’,FNumber) FROM T_Employee

  1. Oracle是怎样分页的?
    Oracle在这里插入图片描述
    mysql在这里插入图片描述

  2. Oralce怎样存储文件,能够存储哪些文件?
    Oracle 能存储 clob、nclob、 blob、 bfile
    Clob 可变长度的字符型数据,也就是其他数据库中提到的文本型数据类型
    Nclob 可变字符类型的数据,不过其存储的是Unicode字符集的字符数据
    Blob 可变长度的二进制数据
    Bfile 数据库外面存储的可变二进制数据

  3. Oracle中使用了索引的列,对该列进行where条件查询、分组、排序、使用聚集函数,哪些用到了索引?
    均会使用索引, 值得注意的是复合索引(如在列A和列B上建立的索引)可能会有不同情况

  4. 数据库怎样实现每隔30分钟备份一次?
    通过操作系统的定时任务调用脚本导出数据库

  5. Oracle中where条件查询和排序的性能比较?
    Order by使用索引的条件极为严格,只有满足如下情况才可以使用索引,
    1). order by中的列必须包含相同的索引并且索引顺序和排序顺序一致
    2). 不能有null值的列
    所以排序的性能往往并不高,所以建议尽量避免order by

  6. 解释冷备份和热备份的不同点以及各自的优点?
    冷备份发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法
    热备份是在数据库运行的情况下,采用归档方式备份数据的方法
    冷备的优缺点:
    1).是非常快速的备份方法(只需拷贝文件)
    2).容易归档(简单拷贝即可)
    3).容易恢复到某个时间点上(只需将文件再拷贝回去)
    4).能与归档方法相结合,作数据库“最新状态”的恢复。
    5).低度维护,高度安全。
    冷备份不足:
    1).单独使用时,只能提供到“某一时间点上”的恢复。
    2).在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
    3).若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
    4).不能按表或按用户恢复。

热备的优缺点
1).可在表空间或数据文件级备份,备份时间短。
2).备份时数据库仍可使用。
3).可达到秒级恢复(恢复到某一时间点上)。
4).可对几乎所有数据库实体作恢复。
5).恢复是快速的,在大多数情况下在数据库仍工作时恢复。
热备份的不足是:
1).不能出错,否则后果严重。
2).若热备份不成功,所得结果不可用于时间点的恢复。
3).因难于维护,所以要特别仔细小心,不允许“以失败而告终”。

  1. 解释data block , extent 和 segment的区别?
    data block 数据块,是oracle最小的逻辑单位,通常oracle从磁盘读写的就是块
    extent 区,是由若干个相邻的block组成
    segment段,是有一组区组成
    tablespace表空间,数据库中数据逻辑存储的地方,一个tablespace可以包含多个数据文件

  2. 比较truncate和delete命令 ?
    1). Truncate 和delete都可以将数据实体删掉,truncate 的操作并不记录到 rollback日志,所以操作速度较快,但同时这个数据不能恢复
    2). Delete操作不腾出表空间的空间
    3). Truncate 不能对视图等进行删除
    4). Truncate是数据定义语言(DDL),而delete是数据操纵语言(DML)

  3. 解释什么是死锁,如何解决Oracle中的死锁?
    简言之就是存在加了锁而没有解锁,可能是使用锁没有提交或者回滚事务,如果是表级锁则不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行
    解决办法:

1). 查找出被锁的表 
select b.owner,b.object_name,a.session_id,a.locked_mode 
from v$locked_object a,dba_objects b 
where b.object_id = a.object_id; 
     
select b.username,b.sid,b.serial#,logon_time 
from v$locked_object a,v$session b 
where a.session_id = b.sid order by b.logon_time; 
2). 杀进程中的会话 
alter system kill session "sid,serial#"; 
  1. 简述oracle中 dml、ddl、dcl的特点
    Dml 数据操纵语言,如select、update、delete,insert
    Ddl 数据定义语言,如create table 、drop table 等等
    Dcl 数据控制语言, 如 commit、 rollback、grant、 invoke等

  2. 说说oracle中的经常使用到得函数
    Length 长度、 lower 小写、upper 大写, to_date 转化日期, to_char转化字符
    Ltrim 去左边空格、 rtrim去右边空格,substr取字串,add_month增加或者减掉月份、to_number转变为数字

18.怎样创建一个存储过程,游标在存储过程中怎么使用?有什么好处?
附:存储过程的一般格式,游标使用参考问题
1 .使用游标可以执行多个不相关的操作.如果希望当产生了结果集后,对结果集中的数据进行多种不相关的数据操作
2. 使用游标可以提供脚本的可读性
3. 使用游标可以建立命令字符串,使用游标可以传送表名,或者把变量传送到参数中,以便建立可以执行的命令字符串.
但是个人认为游标操作效率不太高,并且使用时要特别小心,使用完后要及时关闭
存储过程优缺点:
优点:

  1. 存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
  2. 可保证数据的安全性和完整性。
    3. 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
    通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
  3. 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
  4. 可以降低网络的通信量, 不需要通过网络来传送很多sql语句到数据库服务器了
  5. 使体现企业规则的运算程序放入数据库服务器中,以便集中控制
    当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
    缺点:
  6. 可移植性差
  7. 占用服务器端多的资源,对服务器造成很大的压力
  8. 可读性和可维护性不好

C

reate  [or replace]  procedure 过程名字(参数 …)as 
vs_ym_sn_end CHAR(6);     --同期终止月份 
CURSOR cur_1 IS   --定义游标(简单的说就是一个可以遍历的结果集) 
SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,SUM(usd_amt)/10000 usd_amt_sn 
FROM BGD_AREA_CM_M_BASE_T 
  WHERE ym >= vs_ym_sn_beg 
  AND ym <= vs_ym_sn_end 
GROUP BY area_code,CMCODE; 
BEGIN 
--用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。 
vs_ym_beg := SUBSTR(is_ym,1,6); 
vs_ym_end := SUBSTR(is_ym,7,6); 
vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,"yyyymm"), -12),"yyyymm"); 
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,"yyyymm"), -12),"yyyymm"); 
--先删除表中特定条件的数据。 
DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym; 
  --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount 
DBMS_OUTPUT.put_line("del上月记录="||SQL%rowcount||"条"); 

INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt) 
SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000 
FROM BGD_AREA_CM_M_BASE_T 
  WHERE ym >= vs_ym_beg 
  AND ym <= vs_ym_end 
GROUP BY area_code,CMCODE; 

DBMS_OUTPUT.put_line("ins当月记录="||SQL%rowcount||"条"); 
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。 
FOR rec IN cur_1 LOOP 
  UPDATE xxxxxxxxxxx_T 
  SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn 
   WHERE area_code = rec.area_code 
   AND CMCODE = rec.CMCODE 
   AND ym = is_ym; 
END LOOP; 
COMMIT; 
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。 
EXCEPTION 
   WHEN OTHERS THEN 
      vs_msg := "ERROR IN xxxxxxxxxxx_p("||is_ym||"):"||SUBSTR(SQLERRM,1,500); 
   ROLLBACK; 
   --把当前错误记录进日志表。 
   INSERT INTO LOG_INFO(proc_name,error_info,op_date) 
   VALUES("xxxxxxxxxxx_p",vs_msg,SYSDATE); 
   COMMIT; 
   RETURN; 
END; 
  1. 怎样创建一个一个索引,索引使用的原则,有什么优点和缺点
创建标准索引: 
CREATE  INDEX 索引名 ON 表名 (列名)  TABLESPACE 表空间名; 
创建唯一索引: 
CREATE unique INDEX 索引名 ON 表名 (列名)  TABLESPACE 表空间名; 
创建组合索引: 
CREATE INDEX 索引名 ON 表名 (列名1,列名2)  TABLESPACE 表空间名; 
创建反向键索引: 
CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名; 

索引使用原则:
索引字段建议建立NOT NULL约束
经常与其他表进行连接的表,在连接字段上应该建立索引;
经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;
可选择性高的关键字 ,应该建立索引;
可选择性低的关键字,但数据的值分布差异很大时,选择性数据比较少时仍然可以利用索引提高效率
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的第一个字段,一般是选择性较好的且在where子句中常用的字段上;
B、复合索引的几个字段经常同时以AND方式出现在Where子句中可以建立复合索引;否则单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
频繁DML的表,不要建立太多的索引;
不要将那些频繁修改的列作为索引列;
索引的优缺点:
有点:

  1. 创建唯一性索引,保证数据库表中每一行数据的唯一性

  2. 大大加快数据的检索速度,这也是创建索引的最主要的原因

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

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

  5. 索引创建在表上,不能创建在视图上

  6. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

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

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

  9. 怎样创建一个视图,视图的好处, 视图可以控制权限吗?
    create view 视图名 as select 列名 [别名] … from 表 [unio [all] select … ] ]
    好处:

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

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

  12. 简化查询
    可以控制权限的,在使用的时候需要将视图的使用权限grant给用户

  13. 怎样创建一个触发器, 触发器的定义, 触发器的游标怎样定义
    CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件
     ON表名
     [FOR EACH ROW]
     BEGIN
      pl/sql语句
    CURSOR 游标名 is SELECT * FROM 表名 (定义游标)
      END
     其中:
     触发器名:触发器对象的名称。
     由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
    触发时间:指明触发器何时执行,该值可取:
    before—表示在数据库动作之前触发器执行;
    after—表示在数据库动作之后出发器执行。
    触发事件:指明哪些数据库动作会触发此触发器:
       insert:数据库插入会触发此触发器;

  14. oracle创建表的几种方式;应该注意些什么

  15. 使用图形工具创建表

  16. 使用数据ddl语句创建表

  17. 可以在plsql代码中动态创建表

  18. 怎样将一个旧数据库数据移到一个新的数据库

  19. Imp/exp将数据库中的数据导入到新的库中

  20. 如果是存储迁移直接将存储设备挂到新机器上

  21. 主键有几种;
    字符型,整数型、复合型

  22. oracle的锁又几种,定义分别是什么;

  23. 行共享锁 (ROW SHARE)

  24. 行排他锁(ROW EXCLUSIVE)
    3 . 共享锁(SHARE)

  25. 共享行排他锁(SHARE ROW EXCLUSIVE)

  26. 排他锁(EXCLUSIVE)
    使用方法:

SELECT * FROM order_master WHERE vencode="V002" 
FOR UPDATE WAIT 5; 
LOCK TABLE order_master IN SHARE MODE; 
LOCK TABLE itemfile IN EXCLUSIVE MODE NOWAIT; 

ORACLE锁具体分为以下几类:
1.按用户与系统划分,可以分为自动锁与显示锁
自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。
显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。
2 . 按锁级别划分,可分为共享锁与排它锁
共享锁:共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。
排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
3.按操作划分,可分为DML锁、DDL锁
DML锁又可以分为,行锁、表锁、死锁
行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。
表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行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锁、共享DDL锁、分析锁
排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁。如使用alter table语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。
共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。
如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。
分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语句时,ORACLE重新分析编译此语句。
4.内部闩锁
内部闩锁:这是ORACLE中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。

  1. 在java种怎样调用oracle存储过程;
    在java中使用 CallableStatement调用存储过程
创建需要的测试表:create table Test(tid varchar2(10),tname varchar2(10)); 
  第一种情况:无返回值. 
      create or replace procedure test_a(param1 in varchar2,param2 in varchar2) as 
       begin 
            insert into test value(param1,param2); 
     end; 

Java调用代码:

package com.test; 
import java.sql.*; 
import java.io.*; 
import java.sql.*; 
public class TestProcA 
{ 
   public TestProcA(){ 
   } 
   public static void main(String []args) 
   { 
        ResultSet rs = null; 
        Connection conn = null; 
        CallableStatement proc = null; 
        try{ 
       Class.forName("oracle.jdbc.driver.OracleDriver"); 
conn =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test", "test", "test"); 
          proc = conn.prepareCall("{ call test_a(?,?) }"); 
          proc.setString(1, "1001"); 
          proc.setString(2, "TestA"); 
          proc.execute(); 
        }catch(Exception e){ 
     e.printStackTrace(); 
}finally{ 
           try{ 
       if(null!=rs){ 
                 rs.close(); 

          if(null!=proc){ 
                    proc.close(); 
          } 

          if(null!=conn){ 
                    conn.close(); 
          } 
       }  
           }catch(Exception ex){ 
           } 
        } 
   } 
} 

第二种情况:有返回值的存储过程(返回值非列表).
存储过程为:

create or replace procedure test_b(param1 in varchar2,param2 out varchar2) 
as 
begin 
    select tname into param2 from test where tid=param1; 
end; 

Java调用代码:

package com.test; 
import java.sql.*; 
import java.io.*; 
import java.sql.*; 

public class TestProcB 
{ 
   public TestProcB(){ 
   } 
   public static void main(String []args) 
   { 
        Connection conn = null; 
        CallableStatement proc = null; 
       
        try{ 
          Class.forName("oracle.jdbc.driver.OracleDriver"); 
          conn =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test", "test", "test"); 
          proc = conn.prepareCall("{ call test_b(?,?) }"); 
          proc.setString(1, "1001"); 
          proc.registerOutParameter(2, Types.VARCHAR); 
          proc.execute(); 
          System.out.println("Output is:"+proc.getString(2)); 
        }catch(Exception e){ 
     e.printStackTrace(); 
}finally{ 
           try{ 
          if(null!=proc){ 
                    proc.close(); 
          } 

          if(null!=conn){ 
                    conn.close(); 
          } 

           }catch(Exception ex){ 
           } 
        } 
   } 
} 

第三种情况:返回列表.

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

create or replace package tpackage as 
type t_cursor is ref cursor; 
procedure test_c(c_ref out t_cursor); 
end ; 

create or replace package body tpackage as 
procedure test_c(c_ref out t_cursor) is 
   begin 
      open c_ref for select * from test; 
  end test_c; 
end tpackage; 

Java调用代码:

package com.test; 
import java.sql.*; 
import java.io.*; 
import java.sql.*; 

public class TestProcB 
{ 
   public TestProcB(){ 
   } 
   
   public static void main(String []args) 
   { 
        Connection conn = null; 
        CallableStatement proc = null; 
        ResultSet rs =  null; 
        try{ 
          Class.forName("oracle.jdbc.driver.OracleDriver"); 
          conn =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test", "test", "test"); 
          proc = conn.prepareCall("{? = call tpackage.test_b(?) }"); 
           
          proc.registerOutParameter(1, OracleTypes.CURSOR); 
          proc.execute(); 
          while(rs.next()){ 
              System.out.println(rs.getObject(1) + "\t" + rs.getObject(2)); 
          } 
        }catch(Exception e){ 
     e.printStackTrace(); 
}finally{ 
           try{ 
          if(null!=rs){ 
              rs.close(); 
             if(null!=proc){ 
                    proc.close(); 
             } 

             if(null!=conn){ 
                    conn.close(); 
             } 
          } 
          }catch(Exception ex){ 
           } 
        } 
   } 
} 
  1. rowid,rownum的定义
  2. rowid和rownum都是虚列
  3. rowid是物理地址,用于定位oracle中具体数据的物理存储位置
  4. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别。

28.Oracle中存储过程、游标、函数的区别
游标类似指针,游标可以执行多个不相关的操作.如果希望当产生了结果集后,对结果集中的数据进行多 种不相关的数据操作
函数可以理解函数是存储过程的一种; 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值;两者都可以通过out参数返回值, 如果需要返回多个参数则建议使用存储过程;在sql数据操纵语句中只能调用函数而不能调用存储过程

  1. 使用oracle 伪列删除表中重复记录:
    Delete table t where t.rowid!=(select max(t1.rowid) from table1 t1 where t1.name=t.name)

  2. 常见的关系型数据库有哪些
    1、Oracle
    Oracle是1983年推出的世界上第一个开放式商品化关系型数据库管理系统。它采用标准的SQL结构化查询语言,支持多种数据类型,提供面向对象存储的数据支持,具有第四代语言开发工具,支持Unix、Windows NT、OS/2、Novell等多种平台。除此之外,它还具有很好的并行处理功能。Oracle产品主要由Oracle服务器产品、Oracle开发工具、Oracle应用软件组成,也有基于微机的数据库产品。主要满足对银行、金融、保险等企业、事业开发大型数据库的需求。
    2、DB2
    DB2是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本。
    DB2主要应用于大型应用系统,具有较好的可伸缩性,可支持从大型机到单用户环境,应用于所有常见的服务器操作系统平台下。 DB2提供了高层次的数据利用性、完整性、安全性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和SQL命令。
    DB2采用了数据分级技术,能够使大型机数据很方便地下载到LAN数据库服务器,使得客户机/服务器用户和基于LAN的应用程序可以访问大型机数据,并使数据库本地化及远程连接透明化。
    DB2以拥有一个非常完备的查询优化器而著称,其外部连接改善了查询性能,并支持多任务并行查询。 DB2具有很好的网络支持能力,每个子系统可以连接十几万个分布式用户,可同时激活上千个活动线程,对大型分布式应用系统尤为适用。
    3、Microsoft SQL Server
    SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。
    Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。
    4、Microsoft Access
    Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
    Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软OFFICE的一个成员, 在包括专业版和更高版本的office版本里面被单独出售。2018年9月25日,最新的微软Office Access 2019在微软Office 2019里发布。
    MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库)。
    5、MySQL
    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
    MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
    MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

  3. SQL结构化查询语言(Structured Query Language)有哪些内容
    1.关键词

SELECT,UPDATE,DELETE,INSERECT,WHERE

2.RDBMS(Relational Database Management System)关系型数据库管理系统

比如MS SQL Server,IBM DB2,Oracle,MySQL,Microsoft Access

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

表是相关数据项的集合,它由列和行组成

4.数据库表

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

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

6.查询和更新指令构成了SQL的DML部分,

SELECT-从数据库表中获取数据

UPDATE-更新数据库表中的数据

DELETE-从数据库表中删除数据

INSERT INTO-向数据库表中插入数据

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

SQL中最重要的DDL语句

-CREATE DATABASE 创建新数据库

-ALTER DATABASE 修改数据库

-CREATE TABLE 创建新表

-ALTER TABLE 变更(改变)数据库表

-DROP TABLE 删除表

-CREATE INDEX 创建索引(搜索键)

-DROP INDEX(删除索引)

  1. 单行函数有哪些
    LOWER(‘SQL Course’)=sql course
    UPPER(‘SQL Course’)=SQL COURSE
    CONCAT(‘Good’, ‘Morning’)=
    SUBSTR(‘String’,1,3)=Str
    LENGTH(‘String’)=6
    INSTR(‘String’, ‘r’)=3
    ROUND(45.926, 2)=45.93
    TRUNC(45.926, 2)=45.92
    TO_CHAR
    NVL
    DECODE
    AVG
    COUNT
    MAX
    MIN
    SUM

  2. 分组函数有哪些
    1、COUNT ()返回查寻的行数
    例如:select count(*) from table;
    2、MAX() 返回表达式的最大值
    例如:select a, max(b) from table group by a;
    3、MIN() 返回表达式的最小值
    例如:select a, min(b) from table group by a;
    4、SUM() 返回表达式的总合
    例如:select a, sum(b) from table group by a;
    5、AVG() 返回表达式的平均值
    例如:select a, avg(b) from table group by a。

  3. 多表查询有哪几种方式???有点不清楚

–内连接(inner可以不写)
select g1.name,g2.Name,price,productiondate,g2.Amount
FROM GoodsType g1 inner join Goods g2 on g1.IO=g2.Typeld
select * from Goods
select * from GoodsType

–外连接分(左外连接)和(右外连接)

–左外连接( left join)
select g2.Name,Price,ProductionDate,Amount,g1.name
FROM Goods G1 left join GoodsType G2 on G1.Typeld=G2.IO

–右外连接(right join–空值的会显示出来)
select g2.Name,Price,ProductionDate,Amount,g1.name
FROM Goods G1 right join GoodsType G2 on G1.Typeld=G2.IO

–全外连接(full outer(可以不写) join–空值的会显示出来)
select g1.name,g2.Name,price,productiondate,g2.Amount
FROM GoodsType g1 full outer join Goods g2 on g1.IO=g2.Typeld

–交叉连接(笛卡尔积)查询所有的值
select g1.name,g2.Name,price,productiondate,g2.Amount
FROM GoodsType g1 cross join Goods g2 where g1.IO=g2.Typeld

  1. 子查询中空值和多值怎么处理
    not in子句中过滤掉空值
    为了避免not in子查询中出现空值,影响查询结果,可以对这部分子查询的结果进行非空过滤。
    not in转换为not exists
    多职用distinct

  2. Oracle的主要数据类型
    Oracle中的数据类型有:字符型、数字型、日期型等。具体介绍如下:
    1、字符型:char(n):用于标识固定长度的字符串。
      当实际数据不足定义长度时,使用空格补全右边不足位。varchar(n):可变字符串类型。
      为SQL标准规定的,数据库必须实现的数据据类型。可以存储空字符串。

varchar2(n):可变字符串类型,是oracle在varchar的基础上自行定义的可变长度字符串
类型。当做为列类型使用时,最大长度可被定义为4000;当做为变量类型使用时,长度
可被定义为32767。不可以存储空字符串。
2、数值型:可用于存储整数、浮点数。
  number(m,n):m表示有效数字的总位数(最大为38位),n表示小 数位数。
3、日期时间型:
  date:包含Year(年)、Month(月) 、Day(天)、Hour(时)、Minutes(分)、Second(秒)
  说明:(yyyy表示4位年分;mm表示月份;dd表示天;hh表示时;mi表示分;ss表示秒)
4、大对象类型:lob:用于存储大对象类型。例如:文本信息长度超过4000、二进制文件等。最大容量为4GB。
  lob分类:clob:用于存储大型文本数据。(例如:备注信息)
  blob:用于存储二进制数据。(例如:图片文件)
  bfile:作为独立文件存在的二进制数据。
5、特殊数据:
  null与空字符串:null与空字符串,都要用is null或is not null进行比较。
单引号:想将单引号做为字符中使用,请通过单引号进行转义。
6、注意:oracle中,没有布尔类型,可利用字符串或数值(1/0)表示

  1. 常见的约束有哪些
    1.非空(NOT NULL)约束:所定义的列不绝对不能为空;
      例如:将已经创建好的表BOOK中的bookname字段修改为不为空:
      利用 ALTER TABLE…MODIFY …NOT NULL;
    ALTER TABLE BOOK MODIFY bookname NOT NULL;

2.主键(PRIMARY KEY)约束:唯一的标识表中的每一行;
  例如:为已经创建好的表book中的bookid字段添加名称为“BOOK_PK的主键”
  利用ALTER TABLE … ADD CONSTRAINT BOOK_PK PRIMARY KEY(字段);
ALTER TABLE BOOK ADD CONSTRAINT BOOK_PK PRIMARY KEY(bookid);

3.唯一(UNIQUE)约束:每列字段的值不能相同;
  例如:为表usertable中的phone字段添加唯一约束
  利用ALTER TABLE … ADD CONSTRAINT BOOK_PK PRIMARY KEY(字段);
ALTER TABLE usertable ADD CONSTRAINT PHONE_UK unique (phone);

4.外键(FOREIGN KEY)约束:用来维护从表与主表之间的引用完整性;
  例如dept为主表,emp为从表(外键表),emp中的外键列deptno引用dept中的键
ALTER TABLE emp ADD CONSTRAINT EMP_TEPTNO_FK FOREIGN KEY(deptno) REFERENCES dept(deptno);
  级联删除:删除引用表(主表)中的被引用列时,外键表中对应的数据也将被删除(实现方式如下)
ALTER TABLE emp ADD CONSTRAINT EMP_TEPTNO_FK FOREIGN KEY(deptno) REFERENCES dept ON DELETE CASCADE;

5.条件(CHECK)约束:表中每行都要满足该约束条件。
  例如:创建已给学生表(Student),为年龄列(Age)定义一个disable状态的Check约束(Age>0 and Age<120)(建表时的部分代码如下:)
Age int constraint AGE_CK check(Age>0 and Age<120) disable,

  1. 什么是序列

Sequence 是oracle提供的用于产生一系列唯一数字的数据库对象。由于oracle中没有设置自增列的方法,所以我们在oracle数据库中主要用序列来实现主键自增的功能。

怎么样创建序列
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减 默认是 1
[START WITH n] //开始的值,递增默认是 minvalue 递减是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中

  1. 事务控制的四大特性
    事务的四大特性是:
     原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
     一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
     隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
     持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

  2. 数据库设计范式如何应用在数据库设计中
    https://www.cnblogs.com/xy-ouyang/p/10531858.html
    第一范式。在数据表存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么表的设计不满足第一范式。第一范式要求字段的数据具有原子性,不可再分。
    第二范式,前提是满足第一范式。在数据表设计的过程中,如果有复合主键,且表中有字段并不是由整个主键来确定,而是依赖主键中的某个字段(主键的部分);存在字段依赖主键的的部分的问题,称之为【部分依赖】。第二范式要求不能出现部分依赖。
    第三范式,前提是先满足第二范式。理论上讲,一张表中所有的字段都应该直接依赖主键(逻辑主键,代表的是业务主键), 如果表设计中存在一个字段,并不直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键,把这种不是直接依赖主键而是依赖非主键字段的依赖关系称之为【传递依赖】。第三范式就是要解决传递依赖的问题。第三范式要求所有字段都依赖主属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值