计算机专业就业指导(Java)之基础技术测试篇(三)

基础技术测试篇(三)

1.3 各种常用的数据库

例题20  NULL在数据库中是什么含义?在SQL Server数据库中有哪些设计NULL的操作?

答案:NULL这个值表示UNKNOW(未知),它并不是 表示“”(空字符串)。与NULL这个值的任何比较都会生产一个NULL值。因为不能把任何值与一个未知值进行比较,并在逻辑上获得一个结果。SQL Server数据库在默认情况下会有ANSI_NULLS,因此,判断是否等于NUll,不能用=NULL和<>NULL,而是要用IS NULL和 IS NOT NULL操作符。设置字段值为NULL时,可以用update XX set YY=NULL。此时,NULL外面不要加引号。插入新记录时,可以用insert XXX(YYY)values(NULL)。此时,NULL外面也不要加引号。

Tips:NULL是个非常特殊的、令人讨厌的值,所以有不少应聘者在这个问题上跌跟头也就不意外了。什么值与NULL的 运算结果都是NULL,常常导致语句错误。所以在设计数据表结构时,常常设置defalut值,避免NULL的出现。但这样会增大数据文件的体积,浪费资源。当表中数值很稀疏时,这种浪费是非常惊人的。

例题21:SQL Server 中有几种不同类型的触发器?

答案:触发器是一种专用类型的存储过程,它被捆绑到SQL Server 的表或视图上。在SQL Server里,有INSTEAD-OF和AFTER两种类型的触发器。INSTEAD_OF触发器是替代数据操纵语言()语句对表执行语句的 存储过程。例如,如果有一个用于TableAu的INSTEAD-OF-UPDATE触发器,同时对这个表执行一条更新语句,那么INSTERD-OF-UPDATE触发器里的代码会执行。AFTER触发器则在DML语句在数据库里使用之后才执行。。这些类型的触发器对于监视发生在数据库表里的数据变化十分好用。

 Tips:触发器是一种特殊的存储过程,它不能被显示地调用,而是在向表中插入记录时、更改记录时或者删除记录时,才被自动地激活。   触发器可以用来对表实施复杂的完整性约束,,保持数据的一致性,当触发器所保护的数据发生改变时,触发器会自动被激活,响应并 同时执行一定的操作,从而发现对数据的不完整性约束或不正确的修改。触发器可以查询其他表,同时也可以执行复杂的T-SQL语句。触发器和引发触发器执行的命令被当作一次事务处理,因此就具备了事务的所有特征。

 例题22:在SQL Server 中怎样利用一个UPDATE语句通过表B中的三个列更新表A中的三个列?

答案:

创建数据库

USE tempdb

GO

Create TABLE #t1 (c1 int NOT NULL,c2 char(5),c3 char(5),c4 char (5))

Create TABLE #t2 (c1 int NOT NULL,c2 char(5),c3 char(5),c4 char (5))

GO

数据赋值

Insert #t1 values (1,'hello','there','fred')

Insert #t2 values (1,'how','are','you?')

更新数据

Update #t1 SET #t1.c2 =#t2.c2, #t1.c3=#t2.c3,#t1.c4 =#t2.c4  FROM #t2

Where #t1.c1=#t2.c1

检查结果

Select * FROM #t1


 Tips:答案中的代码说明了如何组合使用FROM子句和JOIN操作,以达到用其他表中数据更新指定列的目的。在设计关系表达式时,要决定是否需要单一行匹配多个行(一对多关系),或者需要多个行匹配被联接表中的单一行以更新所有行(多对一关系)。 在一对多关系中,SQL Server始终使用它找到的最后一行更新数据,却无法控制最后一行所在的位置。在多处理器的计算机上,查询可能是同步进行的,相同的查询最后一行的位置可能会不同。因此,在SQL Server中建议尽量不要使用一对多关系。   如果待更新的表与FROM子句中的表相同,并且FROM子句只包含对该表的一个引用,别名可能未被指定。如果待更新表在FROM子句中出现了多次,只有该表的一个引用可以省略表的别名,对该表的所有其他引用必须包含一个表的别名。

 例题23:在SQL Server中,某表的一列允许NUll值。如果希望在其值为非NULL时,该列是唯一的。怎样才能以编程的方式实现这一行为?如果在该列上设置一个UNIQUEYE约束,则只能包含一个值为NULL的记录。如果使用触发器实现这一约束,你可以推荐一个更简单的方法以保证所有的非NUll值唯一么?

 答案:

USE tempdb

Create table t1(c1 int NULL ,c2 char(5) NULL)

Create trigger mytrigger on t1 for insert,update as

BEGAIN 

IF(select max(cnt)from(select count(i.1)

as cnt from t1,inserted i where t1.c1=i.c1 group gy i.c1)x)>1

ROLLBACK TRAN

END

Tips:本题的目的是确保列中所有的非空(Non-NULL)值都是唯一的。但是SQL Server没有实现非NULL值唯一的内建机制,因此我们需要通过自定义的CHECK约束来实现这一机制。此外,还可以使用INSTEAD-OF触发器来实现这一功能。
例题24:我们常常向重复的表添加列。怎样才能在不重新初始化整个发布的情况下添加一个列?

答案:在SQL Server中,可以使用sp_repladdcolumn存储过程向重复的表添加列,而不需要重新初始化整个发布。该存储过程会自动在订阅服务器上添加该列。例如,如果pubs数据库中的authors表已发布,则可以通过执行以下存储过程将newcol整数列添加到该表中:

sp_repladdcolumn @source_object ='authors'

  ,@column='newcol'

  ,@typetext='TNT'

  ,@publication_to_add ='<name of publication authors is included in>'
  

Tips:我们只能使用sp_repladdcolumn存储过程向重复的表添加新列,而不能用它来管理表中现有的列。如需从已发布表中删除现有的列,可以使用sp_repldropcolumn存储过程。

例题25:请解释Oracle中冷备份和热备份的不同点以及各自的优点。

答案:热备份针对归档模式的数据库,在数据库仍处于工作状态时进行备份。而冷备份指的是在数据库关闭后进行备份,适用于所有模式的数据库。热备份的优点在于备份时,数据库仍然可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在 非归档模式下,数据库性能会比归档模式稍好。

例题26:Oracle的主要内存结构有哪些?

答案:软件代码区:用于存储正在执行的或可以执行的程序代码。

系统全局区(SGA):一组由Oracle分配的共享的内存结构,可包含一个数据库实例的数据或控制信息。

程序全局区(PGA):包含单个用户或服务器数据和控制信息的内存结构,它是在用户进程连接到Oracle并创建一个由Oracle自动分配的。PGA包含的是有关进程正在使用的操作系统资源信息以及进程的状态信息,而其他的进程所使用的Oracle的共享资源在SGA中

排序区:Oracle利用该内核排序数据。

Tips:Oracle数据库的总体结构如下图所示:

                                                                       Oracle数据库的总体结构图

    每个Oracle数据库都是有Oracle Instance(实例)与数据库(数据文件、控制文件、重做日志文件)组成,其中实例就是用户同数据库交互的媒介,用户通过与一个实例相连来操作数据库。而实例又是由统一的内存结构(SGA,PGA,UGA)和一批内存驻留进程组成。实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识,它们两个是相同的。当数据库启动时,系统首先在服务器内存中分配系统 全局区(SGA),构成Oracle的内存结构,,然后启动若干个常驻内存的操作系统进程,即组成Oracle的进程结构,内存区域和后台进程合称为一个Oracle实例。

例题27:Oracle安装过程中提供的两个内置账户的权限是什么?

答案:SYS和SYSTEM是每个Oracle数据库系统默认安装的两个账户。它们的默认密码分别是:change_on_install和manager。SYS是所有内部数据库表、结构、过程包的拥有者,此外它还拥有V$和数据字典视图,并创建所有封装的数据库角色(DBA、CONNECT、RESOURCE等)。SYS是一个唯一能访问特定内部数据字典的用户。SYSTEM也是在安装ORACLE时创建的用户,用于DBA任务的 管理。

Tips:有两个概念需要解释一下。

(1)V$:以V$开头的表被称为系统性能表,记录Oracle运行过程中的信息,保存在内存中,用户可以查看。

(2)数据字典视图:数据字典是系统维护的,用户不能进行查看,理论上不能查看,但是不能查看又对用户不公平,因此系统 提供了视图的形式供用户查看,这样用户就可以使用标准的select语句进行数据的查看,这就 相当于SQL Server中的系统表。在Oracle中存在三类数据字典视图分别是以“all_”、“dba_”、“user_”开头进行命名。这三类视图有什么区别呢?可以这么说:前缀为user_的数据字典视图表示这个视图中只存储当前用户的信息。

前缀为dba_的数据字典视图,包含了数据库拥有的所有对象和权限的信息。

前缀为all_的数据字典视图,包含了用户当前可以访问的全部对象和权限信息,该对象也可能是其他用户授权的。

例题28:Oracle中的临时表有几种?使用临时表的主要原因是什么?

答案:临时表在Oracle数据库中起到建立一个临时性的存放某些数据集的作用。临时表一般分为事务临时表和会话临时表两种。

当事务结束时,就会清空事务临时表。所以在数据库临时表中插入数据后,只要事务没有提交,该表中的数据就会存在。但是,在事务提交或者回滚以后,该表中的数据就会删除。而且,这个变化不会在重做日志中显示。当然,如果会话结束,事务临时表的数据也会被清空。

会话临时表是指数据只在当前会话内有效的临时表。关闭当前会话或者进行新的连接之后iou,数据表中的内容就会被清除。

Oracle的临时表在应用系统中有很大的作用,它可以 让用户只能够操作各自的数据而互不干扰,不用担心会破坏或影响其他会话或者事务中的数据,这也是数据安全 的一种解决方法。

Tips:两种临时表的语法:

 create global temporary table 临时表名 on commit divserveldelete rows


 

用divserver 时就是会话临时表,用delete是就是事务临时表例:

1.会话临时表

 

--建立临时表

create global temporary table temp_tbl

(col_a varchar2(30))

on  commit divserver rows

--插入数据

insert into temp_tbl values('test session table')

--提交

commit

--查询数据

select * from temp_tbl

--可以看到数据'test session table'记录还在

--结束回话,重新登录,再查询数据select * from temp_tbl,这时候记录已不存在,因为系统在结束会话时自动清除记录


2.事务级临时表

--建立临时表

create global temporary table temp_tbl

(col_a varchar2(30))

on commit delete rows

--插入数据

insert into temp_tbl values('test transaction table')

--提交

commit

--查询数据

select * from temp_tbl


这时候可以看到刚才插入的记录'test transaction table'已不存在了。同样,如果不提交而直接结束会话,重新登录记录也不存在。

例题29:MySql中如何支持中文?

答案:MySql默认建立的Instance是latinl字符集的。为了解决这个问题,在建立数据库时就必须先配置好支持中文的语言环境。

首先要在建立数据库时指定默认的 语言,例如:

 create database Newdatabase DEFAULT CHARSET=utf8   COLLATE=utf8_bin

否则默认的语言一般为:

 DEFAULT CHARACTER SET latinl

其次,在建立表的时候也需要指定默认的支持语言,例如:

create  table test_chs(

  Host char(60) collate utf8_bin NOT NULL deault,

User char(16) collate utf8_bin NOT NULL default

)ENGINE=MyISAM DEFALUT  CHARSET=UTF8 COLLATE=utf8_bin;


这样,在浏览表的时候,中文字段可以正确地显示。

Tips:MySql数据库没有正式的中文版本,所以一直以来对中文的支持并不是很好,虽然在安装时可以选择GBK或者GB2312字符集,但是在直接使用时往往还是不能够正确地显示中文信息。当使用SQL语句包含中文的数据插入到MySql数据库中时,可以使用设置数据库和表中字符集的方式来解决,而当使用JDBC将包含中文的数据插入到MySql数据库中时,则可以在数据库链接URL字符串中设置字符集,具体格式如下:

  String url="jdbc:mysql://localhost:3306database?useUnicode=true&characterEncoding=UTF-8"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值