数据库理论

1 设有关系R(S,D,M),其函数依赖集F={S->D,D->M},则关系R至多满足

A、1NF B、2NF C、3NF D、BCNF

分析:数据库模式的4个范式问题。

1NF:第一范式。如果关系模式R的所有属性的值域中每个值都是不可再分解的值,则称R属于第一范式模式。如果某个数据库模式都是第一范式的,则称该数据库模式属于第一范式的数据库模式。

2NF:第二范式。如果关系模式R为第一范式,并且R中每个非主属性完全函数依赖于R的某个候选键,则称R为第二范式模式。(如果A是关系模式R的候选键的一个属性,则称A是R的主属性,否则A是R的非主属性)

3NF:第三范式。如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R为第三范式的模式。

BCNF:BC范式。如果关系模式R是第一范式,且每个属性都不传递依赖于R的候选键,即为R的BC范式。

4NF:第四范式。设R是一个关系模式,D是R上的多值依赖集合。如果D中成立非平凡多值依赖X->Y时,X必是R的超键,那么称R是第四范式的模式。

上题属于传递依赖,所以至多满足第二范式。


2 存储过程和函数的区别是什么?

分析:存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值,并且不涉及特定用户表。


3 数据库事物?

分析:数据库事物是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

   事物的开始与结束可以由用户显示控制。如果用户没有显示地定义事物,则由DBMS按默认规定自动划分事物。事物具有原子性、一致性、独立性及持久性等特点。

(1)原子性:指一个事物要么全部执行,要么不执行。也就是说,一个事物不可能只执行一半就停止了。

(2)一致性:指事物的运行并不改变数据库中数据的一致性。

(3)独立性:两个以上事物不会出现交错执行状态。因为这样会导致数据不一致。

(4)持久性:事物运行成功以后,就系统的更新是永久的。不会无缘无故的回滚。


4 游标的作用是什么,如何知道游标已经到了最后?

分析:游标用于定位结果集的行。通过判断全局变量@@FETCH_STATUS可以判断其是否到了最后。通常此变量不等于0表示出错或到了最后。

 

5 触发器分为事前触发和事后触发,这两种触发有何区别?语句级触发和行级触发有何区别?

分析:事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件之后。语句级触发器可以发生在语句执行前或执行后,而行级触发在触发器所影响的每一行触发一次.


6 SQL注入式攻击,如何防范?

分析:SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。


防范SQL注入式攻击闯入,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。

(1)替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。

(2)删除用户输入内容中的所有连字符,防止攻击者顺利获得访问权限。

(3)对于用来执行查询的数据库账户,限制其权限。

(4)用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。

(5)检查用户输入的合法性,确信输入的内容只包含合法的数据。

(6)将用户登录名称、密码等数据加密保存。

(7)检查提取数据的查询所返回的记录数量。


7 聚集索引和非聚集索引之间的区别?

分析:聚集索引的顺序就是数据的物理存储顺序,而对非聚集索引的解释是索引顺序与数据物理排列顺序无关。正因为如此,所以一个表最多只能有一个聚集索引

在SQL Server中,索引是通过二叉树的数据结构来描述的,对于聚集索引:索引的叶节点就是数据节点。而非聚集索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。


聚集索引确定表中的数据物理顺序。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引)。

聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。

使用非聚集索引,数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储。


SQL语言

1 找出表ppp里面num最小的数,不能使用min函数。

select * from ppp where num<=all(select num from ppp)
select top 1 num from ppp order by num




2 找出表ppp里面最小的数,可以使用min函数。

select * from ppp where num=(select Min(num) from ppp)



3 选择表ppp2中num重复的记录

select * from ppp 
where num in(select num from ppp2 group by num having(count(num)>1))



4 写出复制表、复制表和四表联查的SQL语句。

分析:

复制表(只复制结构,源表名:A,新表名:B):

select * into B from A where 1=0




复制表(复制数据,源表名:A,新表名:B):

select * into B from A



四表联查

select * from A,B,C,D where 关联条件




5 在SQL Server中如何用SQL语句建立一张临时表。

分析:

create table #Temp(字段1 类型,字段2 类型……)

注意:临时表要在表名前面加#。


6 有数据表A,有一个字段LASTUPDATETIME,是最后更新时间,如果要查最新更新过的记录,如何写?

SQL codeselect *
from 数据表A
where LASTUPDATETIME=(select max(LASTUPDATETIME) from 数据表A)



7 要查找数据表中第30到40条记录,有字段ID,但是ID并不连续。如何写SQL语句?

分析:

SQL codeselect * from tb a
where exits (select 1 from (
   select top 10 id from (select top 40 id from tb order by id desc) as c
)as b where b.id=a.id



8 请问下列语句是否可以正确运行,为什么?

update table1
set name=(select name from table2 t1 inner join table1)
    t2 on  t1.id=t2.id)where name is null



分析:不能。

select name from table2 t1 inner join table1)
    t2 on  t1.id=t2.id)

这一句返回的是一个表结果集,而update语句少了条件值。返回的是结果集,更新的结果并没有指定,会出现非一对一情况。


SQL语言客观题

1 primary、unique两种约束会隐性创建一个唯一索引。


2 group by一般在select语句的 where关键词之后。


3 order by一般在select语句的 所有关键词之后。


4 分析下列2句SQL语句:

select last_name,salary from employees order by salsry;//默认升序
select last_name,salary from employees order by 2 asc;//asc是升序,desc降序

两个语句是结果是相同的。


5 若把时间显示成像”20051110 14:44:17“这样的格式,应该如何使用语句?选用第二种。

to_date日期转换

select to_date(sydate,'yyyymmdd hh24:mi:ss')from dual;


to_char日期显示

select to_char(sydate,'yyyymmdd hh24:mi:ss')from dual;



from  dual:用来调度系统函数。


6 如果要从字符串"Hello world"中提取”ello world“这样的结果,如何使用语句?

select lower (trim('H'from 'Hello World'))from dual;



trim()移除字符串。

LTRIM(字串):将所有字串起头的空白移除。

RTRIM(字串):将所有字串结尾的空白移除。

lower(str):返回根据当前字符集映射,所有字符改变为小写,即返回小写的字符串。


7 下面哪些是DML的执行状态?C、D

A commit B merge C update D delete E create F drop


DML数据操纵语言,Data Manipulation Language: 插、删、改、排、检

插:Append在数据库文件的末尾添加记录,INSERT在指定记录前添加记录。

删:DELETE对数据库中记录作删除标识。PACK将标有删除标志的记录彻底清除掉。ZAP去掉数据库文件的所有记录。

改:连接Join操纵和投影操作projection。

排序操作:改变物理存储的排序方式,如SORT命令按指定关键字串把DBF文件中记录排序。从物理存储角度看,数据库发生了变化。但从逻辑角度看,新的关系与排序前是等价的。

检索:从数据库中检索出满足条件的数据。它可以是一个数据项,一个记录或一组记录。BROWSE单元实现对数据的浏览操作,SELECT选出满足一定条件和范围的记录。


8 select语句用来连接字符串的符号是:A、+

A + B & C || D |


补充:

修改或删除列。ALTER TABLE用于在已有表中添加。

在表中添加列。ALTER TABLE table_name     ADD column_name  datetype

删除表中的列。ALTER TABLE table_name     DROP  COLUMN column_name

改变表中列的数据类型。ALTER TABLE table_name    ALTER COLUMN column_name  datatype


主键不允许为NULL。 unique约束能够约束一列保证该列值唯一,但允许该列有空值。




《程序员面试宝典》 第五版 欧立奇 P290~P299