数据库面试题笔试题
数据库面试题笔试题
1.基础知识点:
1NF:第一范式。如果关系模式R的所有属性的值域中每一个值都是不可再分解的值,则称R属于第一范式模式。第一范式的模式要求属性值不可再分裂成更小部分,即属性项不能是属性组合或由组属性组成。2NF:第二范式。如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称R为第二范式模式。(如果A是关系模式R的候选键的一个属性,则称A是R的主属性,否则称A是R的非主属性。) 3NF:第三范式。如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。 BCNF:BC模式。如果关系模式R是第一范式,且每个属性都不传递依赖于R的候选键,那么称R为BCNF的模式。4NF:第四范式。设R是一个关系模式,D是R上的多值依赖集合。如果 D中成立非平凡多值依赖X→→Y时,X必是R的超键,那么称R是第四范式的模式。
2.试题
1) 设有关系R(S,D,M),其函数依赖集F={S→D,D→M}。则关系R至多满足2NF。 解析:属于依赖关系,所有至多满足第二范式。
2) 出表ppp里面num最小的数,不能使用min函数。 答:select * from ppp where num<=all(select num from ppp) 或者:select top 1 num from ppp order by num。
3) 出表ppp里面最小的数,可以使用min函数。 答:select * from ppp where num=(select Min(num) from ppp)。
4) 选择表ppp2中num重复的记录。 答: select * from ppp2 where num in(select num from ppp2 group by num having(count(num)>1))。
5) 写出复制表、拷贝表和四表联合的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 关联条件
6) 在SQL Server中如何用SQL语句建立一张临时表? 答: create table #Temp(字段1 类型,字段2 类型…) 注意,临时表要在表名前面加 “#”。
7) %代表任意长度(长度可以为0)的字符串,_ 代表任意单个字符。如果用户要查询的语句本身就含有%或_,这时就要使用escape’<换码字符>’短语对通配符进行转义了。
8) 集函数SUM,AVG中的列必须是数值型。
综合的是选择题
9) 每一个部门的每个工种的工资最大值? select dept_id,job_cat,max(salary)from employee group by dept_id,job_cat;
10) 在primary 和unique两种约束的情况下,Oracle数据库会隐形创建一个唯一索引。
11) 在select语句中包含一个where关键词,group by关键词一般在where关键词之后,order by 关键词一般在select语句中所有关键词之后。
12) select last_name,salary from employees order by salary; select last_name,salary from employees order by 2 asc; 这两个SQL语句是相同的结果。
13) 如果你想把时间显示成像“2005111014:44: 17”这样的格式,SQL语句: select to_c
har(sydate,’yyyymmdd hh24:mi:ss’)from dual;
14) select语句中用来连接字符串的符号是+。
15) 如果要从字符串“Hello world”中提取出“ello world”这样的结果,SQL语句: select lower(trim('H’from 'Hello world’))from dual;
3.存储过程和函数的区别是什么?
答:存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常是数据库已定义的方法,它接受参数并返回某种类型的值,并且不涉及特定用户表。
4.事务是什么?
答:事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须有4个属性,称为ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能称为一个事务。
5.游标的作用是什么?如何知道游标已经到了最后?
答:游标用于定位结果集的行。通过判断全局变量@@FETCH_STATUS可以判断其是否到了最后。通常此变量不等于0表示出错或到了最后。
6.触发器分为事前触发和事后触发,这两种触发有何区别?语句级触发和行级触发有何区别?
答:事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。
7.什么叫做SQL注入式攻击?如何防范?
答:所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。防范SQL注入式攻击闯入:只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。第一,替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。第二,删除用
户输入内容中的所有连字符,防止攻击者顺利获得访问权限。第三,对于用来执行查询的数据库账户,限制其权限。第四,用存储过程来执行所有的查询。第五,检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行。第六,将用户登录名称、密码等数据加密保存。第七,检查提取数据的查询所返回的记录数量。
8.为了防止在查询记录的时候被其他用户更改记录,应该采用什么方法?如何用查询语句实现该方法?
答: 添加一个“时间戳”类型的字段就可以了。timestamp这种数据类型会根据当前时间自动产生一个时间字符串,确保这些数在数据库中是唯一的。timestamp一般用做给表行加版本戳的机制,存储大小为8个字节。一个表只能有一个timestamp列。每次插入或更新包含timestamp列的行时,timestamp列中的值均会更新。这一属性使timestamp列不适合作为键使用,尤其是不能作为主键使用。对行的任何更新都会更改timestamp值,从而更改键值。
9.有一个数据库,只有一个表,包含着1000个记录,你能想出一种解决方案来把第五行到
第七行的记录取出来么?不要使用航标和索引。
答:第一步建立数据库:
declare @i int
set @i=1
create table #T(userid int)
while (@i<=10)
begin
insert into #T
select @i
set @i=@i+1
end
select userid from
(select top 3 userid from(selec top 7 userid from #T order by userid)Ta order by userid desc
多表查询sql语句面试题)TB order by userid
删除数据库: drop table #T
提取数据:
select top 3 userid from T where userid not in(select top 4 userid from T order by userid)order by userid
或者:select top 7 userid from T where userid >ANY(select top 4 userid from T order by userid)order by userid
或者:select top 7 userid from T where userid >ALL(select top 4 userid from T order by userid)order by userid
10.什么是聚集索引?什么是非聚集索引?什么是主键?
答:表中经常有一个列或列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键。聚集索引确定表中数据的物理顺序。一个表中只能包含一个聚集索引。非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储。
11.现有一张表,有两个字段:ID,NAME。ID为主键。如果希望查询出所有拥有2个或更多ID 的NAME,查询语句应该如何写?
答:select [Name] from [table] group by(name) having(count([ID]>=2)。
12.设供应商供应零件的关系模式为SP(Sno,Pno,Qty),其中Sno表示供应商号,Pno表示零件号,Qty表示零件数量。整个数据库如下表:
Sno Pno Qty
168 r1 3
168 r2 4
168 r3 7
169 r2 1
169 r3 5
170 r4 8
171 r7 5
172 r2 1
172 r7 3
请问下面的SQL语句返回值是什么?
Select * from SP SPY where exists (select * from SP SPZ where Sno)
解析:在exists 中的子查询在这个例子中只返回一个值。因为从子查询中返回的行数至少有一行exits返回为true,这使得表中的所有记录都被显示了出来。
请问下面的SQL语句返回值是什么?
Select * from SP SPY where exists (select * from SP SPZ where Sno=’168’ and SPZ.Pno=SPY.Pno);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。