在请求分页[1]系统中,常采用哪几种页面置换算法?答:a.最佳置换算法;b.先进先出算法;c.最近最久未使用LRU置换算法;d.Clock置换算法; e.此外,还有最少使用置换算法和页面缓冲算法。数据库1.基础知识点:1NF:第一范式[2]。如果关系模式[3] R的所有属性的值域中每一个值都是不可再分解的值, 则称R属于第一范式模式。 第一范式的模式要求属性值不可再分裂成更小部分, 即属性项不能是属 性组合或由组属性组成。 2NF:第二范式[4]。如果关系模式 R为第一范式,并且 R中每一个非主属性[5]完全函数依赖[6]于 R 的某个候选键,则称 R 为第二范式模式。 (如果 A 是关系模式 R 的候选键的一个属性, 则称A是R的主属性,否则称A是R的非主属性。)3NF:第三范式[7]。 如果关系模式 R 是第二范式,且每个非主属性都不传递依赖于 R 的候选键,则称 R 是第三 范式的模式。 BCNF : BC模式。如果关系模式 R是第一范式,且每个属性都不传递依赖于R的候选键,那么称 R为BCNF的模式。4NF:第四范式[8]。设 R是一个关系模式,D是R上 的多值依赖[9]集合。如果 D中成立非平凡多值依赖 XuY时,X必是R的超键,那么称 R是 第四范式的模式。2.试题1)设有关系R(S,D,M),其函数依赖集 F=(S~ D,Dt M)。则关系R至多满足2NF。解析: 属于依赖关系,所有至多满足第二范式。2)找出表 ppp 里面 num 最小的数,不能使用 min 函数。 答: select * from ppp where num1)) 。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 employeegroup 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 语句: selectto_char(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.存储过程[10]和函数的区别是什么?答:存储过程是用户定义的一系列 SQL 语句的集合,涉及特定表或其他对象的任务,用户 可以调用存储过程。而函数通常是数据库已定义的方法,它接受参数并返回某种类型的值, 并且不涉及特定用户表。4.事务是什么?答:事务是作为一个逻辑单元[11]执行的一系列操作。 一个逻辑工作单元必须有 4个属性, 称为 ACID( 原子性[12]、一致性、隔离性[13]和持久性 )属性,只有这样才能称为一个事务。5.游标[14]的作用是什么?如何知道游标已经到了最后?答:游标用于定位结果集的行。通过判断全局变量[15] @@FETCH_STATUS 可以判断其是否到 了最后。通常此变量不等于 0 表示出错或到了最后。6.触发器[16]分为事前触发和事后触发,这两种触发有何区别?语句级触发和行级触发有何区 别?答: 事前触发器运行于触发事件发生之前, 而事后触发器运行于触发事件发生之后。 语句级 触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。7.什么叫做 SQL 注入式攻击?如何防范?答:所谓 SQL 注入式攻击,就是攻击者把 SQL 命令插入到 Web 表单的输入域页面请求的 查询字符串中,欺骗服务器执行恶意的 SQL 命令。在某些表单中,用户输入的内容直接用 来构造动态 SQL 命令,或作为存储过程的输入参数,这类表单特别容易受到 SQL 注入式攻 击。防范 SQL 注入式攻击闯入:只要在利用表单输入的内容构造 SQL 命令之前,把所有输 入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。第一, 替换单引号,即把所 有单独出现的单引号改成两个单引号,防止攻击者修改 SQL 命令的含义。第二,删除用户 输入内容中的所有连字符, 防止攻击者顺利获得访问权限。 第三, 对于用来执行查询的数据 库账户, 限制其权限。 第四,用存储过程来执行所有的查询。 第五, 检查用户输入的合法性, 确信输入的内容只包含合法的数据。 数据检查应当在客户端和服务器端都执行。 第六, 将用户登录名称、密码等数据加密保存。第七,检查提取数据的查询所返回的记录数量。8.为了防止在查询记录的时候被其他用户更改记录, 应该采用什么方法?如何用查询语句实现该方法? 答: 添加一个“时间戳[17]”类型的字段就可以了。 timestamp 这种数据类型[18]会根据当前时间自动产生一个时间字符串,确保这些数在数据库中是唯一的。 timestamp 一般用做给表行加版 本戳的机制,存储大小为 8 个字节。一个表只能有一个 timestamp 列。每次插入或更新包含 timestamp 列的行时, timestamp 列中的值均会更新。这一属性使 timestamp 列不适合作为键 使用,尤其是不能作为主键使用。对行的任何更新都会更改 timestamp 值,从而更改键值。9.有一个数据库,只有一个表,包含着 1000 个记录,你能想出一种解决方案来把第五行到第七行的记录取出来么?不要使用航标和索引。答:第一步建立数据库:declare @i int set @i=1 create table #T(userid int) while (@iANY(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 userid10.什么是聚集索引?什么是非聚集索引?什么是主键? 答:表中经常有一个列或列的组合, 其值能唯一地标识表中的每一行。 这样的一列或多列称 为表的主键。 聚集索引确定表中数据的物理顺序。 一个表中只能包含一个聚集索引。 非聚集 索引与课本中的索引类似。 数据存储在一个地方, 索引存储[19]在另一个地方, 索引带有指针指 向数据的存储位置。 索引中的项目按索引键值的顺序存储[20], 而表中的信息按另一种顺序存储。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 表示零件数量。整个数据库如下表SnoPnoQty168r13168r24168r37169r21169r35170r48171r75172r21172r73请问下面的 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);
在请求分页[1]系统中,常采用哪几种页面置换算法?
答:a.最佳置换算法;b.先进先出算法;c.最近最久未使用LRU置换算法;d.Clock置换算法; e.此外,还有最少使用置换算法和页面缓冲算法。
数据库
1.基础知识点:
1NF:第一范式[2]。如果关系模式[3] R的所有属性的值域中每一个值都是不可再分解的值, 则称R
属于第一范式模式。 第一范式的模式要求属性值不可再分裂成更小部分, 即属性项不能是属 性组合或由组属性组成。 2NF:第二范式[4]。如果关系模式 R为第一范式,并且 R中每一个非
主属性[5]完全函数依赖[6]于 R 的某个候选键,则称 R 为第二范式模式。 (如果 A 是关系模式 R 的候选键的一个属性, 则称A是R的主属性,否则称A是R的非主属性。)3NF:第三范式[7]。 如果关系模式 R 是第二范式,且每个非主属性都不传递依赖于 R 的候选键,则称 R 是第三 范式的模式。 BCNF : BC模式。如果关系模式 R是第一范式,且每个属性都不传递依赖于
R的候选键,那么称 R为BCNF的模式。4NF:第四范式[8]。设 R是一个关系模式,D是R上 的多值依赖[9]集合。如果 D中成立非平凡多值依赖 XuY时,X必是R的超键,那么称 R是 第四范式的模式。
2.试题
1)设有关系R(S,D,M),其函数依赖集 F={S~ D,Dt M}。则关系R至多满足2NF。解析: 属于依赖关系,所有至多满足第二范式。
2)找出表 ppp 里面 num 最小的数,不能使用 min 函数。 答: select * from ppp where num1)) 。
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_char(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.存储过程[10]和函数的区别是什么?
答:存储过程是用户定义的一系列 SQL 语句的集合,涉及特定表或其他对象的任务,用户 可以调用存储过程。而函数通常是数据库已定义的方法,它接受参数并返回某种类型的值, 并且不涉及特定用户表。
4.事务是什么?
答:事务是作为一个逻辑单元[11]执行的一系列操作。 一个逻辑工作单元必须有 4个属性, 称为 ACID( 原子性[12]、一致性、隔离性[13]和持久性 )属性,只有这样才能称为一个事务。
5.游标[14]的作用是什么?如何知道游标已经到了最后?
答:游标用于定位结果集的行。通过判断全局变量[15] @@FETCH_STATUS 可以判断其是否到 了最后。通常此变量不等于 0 表示出错或到了最后。
6.触发器[16]分为事前触发和事后触发,这两种触发有何区别?语句级触发和行级触发有何区 别?
答: 事前触发器运行于触发事件发生之前, 而事后触发器运行于触发事件发生之后。 语句级 触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。
7.什么叫做 SQL 注入式攻击?如何防范?
答:所谓 SQL 注入式攻击,就是攻击者把 SQL 命令插入到 Web 表单的输入域页面请求的 查询字符串中,欺骗服务器执行恶意的 SQL 命令。在某些表单中,用户输入的内容直接用 来构造动态 SQL 命令,或作为存储过程的输入参数,这类表单特别容易受到 SQL 注入式攻 击。防范 SQL 注入式攻击闯入:只要在利用表单输入的内容构造 SQL 命令之前,把所有输 入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。第一, 替换单引号,即把所 有单独出现的单引号改成两个单引号,防止攻击者修改 SQL 命令的含义。第二,删除用户 输入内容中的所有连字符, 防止攻击者顺利获得访问权限。 第三, 对于用来执行查询的数据 库账户, 限制其权限。 第四,用存储过程来执行所有的查询。 第五, 检查用户输入的合法性, 确信输入的内容只包含合法的数据。 数据检查应当在客户端和服务器端都执行。 第六, 将用
户登录名称、密码等数据加密保存。第七,检查提取数据的查询所返回的记录数量。
8.为了防止在查询记录的时候被其他用户更改记录, 应该采用什么方法?如何用查询语句实
现该方法? 答: 添加一个“时间戳[17]”类型的字段就可以了。 timestamp 这种数据类型[18]会根据当前时间自
动产生一个时间字符串,确保这些数在数据库中是唯一的。 timestamp 一般用做给表行加版 本戳的机制,存储大小为 8 个字节。一个表只能有一个 timestamp 列。每次插入或更新包含 timestamp 列的行时, timestamp 列中的值均会更新。这一属性使 timestamp 列不适合作为键 使用,尤其是不能作为主键使用。对行的任何更新都会更改 timestamp 值,从而更改键值。
9.有一个数据库,只有一个表,包含着 1000 个记录,你能想出一种解决方案来把第五行到
第七行的记录取出来么?不要使用航标和索引。
答:第一步建立数据库:
declare @i int set @i=1 create table #T(userid int) while (@iANY(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.什么是聚集索引?什么是非聚集索引?什么是主键? 答:表中经常有一个列或列的组合, 其值能唯一地标识表中的每一行。 这样的一列或多列称 为表的主键。 聚集索引确定表中数据的物理顺序。 一个表中只能包含一个聚集索引。 非聚集 索引与课本中的索引类似。 数据存储在一个地方, 索引存储[19]在另一个地方, 索引带有指针指 向数据的存储位置。 索引中的项目按索引键值的顺序存储[20], 而表中的信息按另一种顺序存储。
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);
题目解答
答案
解析:返回与 168 号供应商所提供零件相同编号的情况。
若想得到与 168 号供应上所提供零件相同的全部供应商的全部产品情况?
解析: Select * from SP where Sno in (select Sno from SP where Pno in (select Pno from SP from SP where Sno='168'));
或者: Select * from SP SPX where exists (select * from SP SPY where SPY .Sno='168'and exists (select * from SP SPZ where SPZ.Sno=SPX.Sno and SPZ.Pno=SPY.Pno));