【基础复习】十二:数据库与SQL语言


数据库理论

数据库知识总结
数据库范式总结

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是第三范式的模式。如果某个数据库模式中的每个关系模式都是第三范式,则称R为3NF的数据库模式。
    BCNF:BC范式。如果关系模式R是第一范式,且每个属性都不传递依赖于R的候选键,那么称R是BCNF的模式。
  • 4NF:第四范式。设R是一个关系模式,D是R上的多值依赖集合。如果D中成立非平凡多值依赖X->->Y时,X必是R的超键,那么称R是第四范式的模式。
    上题属于传递依赖,所以至多满足第二范式。答案:B。

2.感觉当时学数据库的时候并没有接触到的概念

3.什么是数据库事务

4.什么叫做SQL注入式攻击?如何防范?
答案:
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
防范SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。

  • 1.替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义
  • 2.删除用户输入内容中的所有连字符,防止攻击者顺利获得访问权限
  • 3.对于用来执行查询的数据库账户,限制其权限。用不同的用户账户执行查询、插入、更新、删除操作。由于隔离了不同账户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。
  • 4.用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,他还使得数据库权限可以被限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
  • 5.检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行。之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。
  • 6.将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将他与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理。用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。
  • 7.检查提取数据的查询所返回的记录数量。如果程序值要求返回一个记录,但实际返回的记录却超过一行,那就当做出错处理。

5.解释聚集索引和非聚集索引之间的区别。
答案:
经典教科书对聚集索引的解释是: 聚集索引的顺序就是数据的物理存储顺序,而对非聚集索引的解释是索引顺序与数据物理排列顺序无关。正是因为如此,所以一个表最多只能有一个聚集索引。

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

聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿(电话簿按照字母簿排序),后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组和索引),就像电话簿按形势和名字进行组织一样。

聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序是经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。

使用非聚集索引,非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。如果在表中未创建聚集索引,则无法保证这些行具有任何特定的顺序。

有索引就一定检索的快吗?答案是否定的。有些时候用索引还不如不用索引块。比如说我们要检索表中的所有8000条记录,如果不用索引,需要访问8000条×1000字节/8K字节=1000个页面,如果使用索引的话,首先检索索引,需要访问8000条×10字节/8K字节=10个页面得到索引检索结果,再根据索引检索结果去对应数据页面,由于是检索所有数据,所以需要在访问8000条×1000字节/8K字节=1000个页面将全部数据读取出来,一共过访问了1010个页面,这显然不如不用索引快。

SQL语言

SQL语句总结
上面博客的补充练习
比较常见的SQL面试题集
看其中的数据库部分

1.宝典上的部分SQL语言面试题

2.有数据表A,有一个字段LASTUPDATETIME,是最后更新时间,如果要查最新更新过的记录,如何写SQL语句?
答案:

select * 
from [数据表A]
where LASTUPDATETIME = (select max(LASTUPDATETIME) form [数据表A])

3.有一个数据库,只有一个表,包含着1000个记录,你能想出一种解决方案来把第5行到第7行的记录取出来吗?不要使用航标和索引。
答案:
建立数据库:

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 useid from {
    select top 3 userid 
    from (select top 7 from #T order by userid) Ta order by userid desc
} 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

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

select * 
from tb a
where exists (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)

其实剩下的全是SQL的练习...应该上面的链接练习都够了(QAQ就不搬了).
SQL语言主要就是熟悉常用的函数之类的。至于底层的原理需要一段时间后重新看回当年的笔记才能完善了




from《程序员面试宝典》
ps:某DBA的博客



posted on 2016-03-13 01:52  曾炒煮煎炖  阅读(383)  评论(0编辑  收藏  举报