1. 关系代数表达式R×S÷T-U的运算结果是
。

A B C D
A
[解析]
传统的集合运算是二目运算,包括并、差、交、广义笛卡儿积四种运算。两个分别为n目和m目的关系R和S的广义笛卡儿积是一个(n+m)目的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有r个元组,S有s个元组,则关系R和关系S的广义笛卡儿积有r×s个元组。记作:
R×S={trts|tr∈R∧ts∈S}
根据上面的介绍,结合本题给出的关系模式实例,可以得到R×S的结果如表16-1所示。
表16-1 R×S的结果
A |
B |
C |
1 |
a |
x |
1 |
a |
y |
2 |
b |
x |
2 |
b |
y |
3 |
a |
x |
3 |
a |
y |
3 |
b |
x |
3 |
b |
y |
4 |
a |
x |
4 |
a |
y |
设两个关系R和S的元数分别为r和s(设r>s>0),那么R÷S是一个(r-s)元的元组的集合。R÷S是满足下列条件的最大关系:其中每个元组t与S中每个元组u组成新元组<t,u>必在关系R中。其具体计算公式如下:
R÷S=π1,2,...,r-s(R)-π1,2,...,r-s((π1,2,...,r-s(R)×S)-R)
根据除法运算的公式,易得R×S÷T的结果如表16-2所示。
表16-2 R×S÷T的结果
然后在这个结果的基础上减去U中存在的记录,相应的结果如表16-3所示。
表16-3 最后结果
2. 设有关系R、S和T如图16-1所示。则下列元组演算表达式的运算结果是
。
{t|(

u)((R(u)

S(u))

(

v)(T(v)→(

w)((R(w)

S(w))

w[1]
=u[1]

w[2]=v[1]

[3]=v[2]))

t[1]=u[1]))

A B C D
C
[解析]
元组演算表达式的前半部分是求U=R∪S,后半部分是求U÷T。
某数据库中有供应商关系S和零件关系P,其中;供应商关系模式S(Sno,Sname,Szip,City)中的属性分别表示:供应商代码、供应商名、邮编、供应商所在城市;零件关系模式P(Pno,Pname,Color,Weight,City)中的属性分别表示:零件号、零件名、颜色、重量、产地。要求一个供应商可以供应多种零件,而一种零件可由多个供应商供应。请将下面的SQL语句空缺部分补充完整。
Create Table SP(Sno Char(5),
Pno Char(6),
Status Char 8 ,
Qty NUMERIC 9 ,
7 (Sno,Pno),
8 (Sno),
9 (Pno));
查询供应了“红”色零件的供应商号、零件号和数量(Qty)的元组演算表达式为:
( 10
u[1]=v[1]
v[2]=w[1]
w[3]='红'
11 ))}10. A.S(u)

SP(v)

P(w) B.SP(u)

S(V)

P(w)
C.P(u)

SP(v)

S(w) D.S(u)

P(v)

SP(w)
A B C D
11.
- A.t[1]=u[1]∧t[2]=w[2]∧t[3]=v[4]
- B.t[1]=v[1]∧t[2]=u[2]∧t[3]=u[4]
- C.t[1]=w[1]∧t[2]=u[2]∧t[3]=u[4]
- D.t[1]=u[1]∧t[2]=v[2]∧t[3]=v[4]
A B C D
D
[解析]
本题的SQL语言填空部分非常容易,实际上就是要考生写出关系的主键和外键,即使考生不记得如何用SQL定义主键、外键,只要能正确找出主键、外键就能根据备选项推出正确答案。
现在我们来分析SP关系的主键和外键。SP中的字段有供应商代码、零件号、状态和数量。题目中提到“要求一个供应商可以供应多种零件,而一种零件可由多个供应商供应”,所以要确定一种零件必须知道其供应商代码和零件号。因此,SP关系的主键应为(供应商代码,零件号),即(Sno,Pno)。又因为Sno为S关系的主键,Pno为P关系的主键,所以Sno是SP关系对应S关系的外键,Pno是SP关系对应P关系的外键。所以(7)选B,设置(Sno,Pno)为SP关系的主键;(8)选C,设置Sno为SP关系对应S关系的外键;(9)选D,设置Pno为,SP关系对应P关系的外键。
(10)和(11)是按要求补充元组演算表达式。
在关系元组演算中,元组演算表达式(简称为元组表达式)的一般形式为{t|

(t)},其中t是元组变量,它表示一个元数固定的元组,

是公式,公式是由原子公式组成的。{t|

(t)}表示满足公式

的所有元组t的集合。原子公式有下列3种形式:
(1)R(u),其中R是关系名,u是元组变量。它表示u是关系R的一个元组。
(2)u[i]θv[j],其中u和v都是元组变量,θ是算术比较运算符。该原子公式表示元组u的第i个分量与元组v的第j个分量之间满足θ关系。
(3)w[i]θa或aθw[i],这里a是一个常量,表示元组w的第i个分量与常量a之间满足θ关系。
在一个公式中,如果一个元组变量的前面没有存在量词

或全称量词

等符号,那么称之为自由元组变量,否则称之为约束元组变量。在元组表达式的一般形式{t|

(t)}中,t是

中惟一的自由元组变量。
关系代数的5种基本运算可以用元组表达式表示如下:
R∪S可用{t|R(t)∨S(t)表示;
R-S可用{t|R(t)∧

S(t)}表示;
R×S可用{t(r+s)|
(

u
(r)(

v
(s)(R(u)

S(v)

t[1]=u[1]

…

t[r]=u[r]

t[r+1]=v[1]

…

t[r+s]=v[s])}表示,其中t
(r+s)表示t有r+s个属性;
π
il,...ik(R)可用{t
(k)|(

u)(R(u)

t[1]=u[i
1]

t[k]=u[i
k])}表示;
σ
F(R)可用{t|R(t)∧F')表示,其中F'是F的等价表示形式。
当了解了元组演算的相关知识以后,我们可以分析试题了。从上面的元组表达式的书写格式我们可以看出:(10)应是填写要操作的关系名,这个关系名的顺序是有要求的,因为对应的u,v,w后面有相应的操作。由于后面有条件:w[3]="红",而在关系SP,S,P中,只有关系P有颜色字段,所以P应对应w,又从u[1]=v[1]和v[2]=w[1]可以看出v和两个关系都要关联,在SP,S,P中能与两个关系都有关联的,只有SP,所以断定SP对应v。因此(10)应填S(u)∧SP(v)∧P(w)。(11)是确定结果集要选取的字段,题目要求查询供应商号、零件号和数量(Qty),前面我们已经知道了u,v,w对应的关系了,供应商号出现在S和SP两个关系中,所以t[1]=u[1]或t[1]=v[1]都行。零件号出现在了SP和P两个关系中,t[2]=v[2]或t[2]=w[1]都行,最后的数量只有SP一个关系中有,t[3]=v[4]。故答案t[1]=u[1]∧t[2]=v[2]∧t[3]=v[4]是正确的。
设有如下关系:

与元组演算表达式
{t|
u
v(R(u)
S(v)
u[3]=v[1]
u[4]=v[2]
u[1]>v[3]
t[1]=u[2])}等价的关系代数表达式是 12 ,关系代数表达式R÷S的运算结果是 13 。 设有如下关系:

则与关系代数表达式π1,4(R
S)等价的元组演算表达式为:{t|
u
v(R(u)
S(v)
16 ;关系代数表达式R÷S的结果集为 17 。16. A.u[2]=v[1]

t[1]=u[1]

t[2]=v[2]
B.u[2]=v[1]

t[1]=u[1]

t[2]=v[1]
C.u[1]=v[1]

t[1]=u[1]

t[2]=V[2]
D.u[1]=v[1]

t[1]=u[1]

t[2]=V[1]
A B C D
在SQL语言中,删除基本表的命令是 21 ,修改表中数据的命令是 22 。26. 以下SQL99语句描述的是
。
CREATETYPE Employee(
Name String,
ssn integer);
CREATE TYPE Manager
UNDER Employee(
Degree String,
Dept String);
A B C D
C
[解析]
在SQL99中,除了可以使用原有的数据类型,还可以自定义数据类型,题中SQL语句定义了两个数据类型Employee和Manager,其中Manager数据类型UNDEREmployee数据类型,用来表明Manager是Employee的一种。Manager具有普通Employee的name和ssn属性,Manager自身还具有degree和dept属性。该SQL语句描述的是Employee和Manager之间的继承类型。
关系R、S如下所示,关系代数表达式π1,5,6(σ1>5(R×S))= 28 ,它与元
组演算表达式{t|(
u)(
v)(R(u)
S(v)
29 )}

29. A.u[1]>v[5]

t[1]=u[1]

t[2]=v[5]

t[3]=v[6]
B.u[1]>v[5]

t[1]=u[1]

t[2]=v[2]

t[3]=u[3]
C.u[1]>v[2]

t[1]=u[1]

t[2]=v[2]

t[3]=v[3]
D.u[1]>v[2]

t[1]=u[1]

t[2]=u[2]

t[3]=u[3]
A B C D
C
[解析]
分析关系表达式π
1,5,6(σ
1>5(R×S)):关系表达式σ
1>5(R×S)意为从关系中选取满足条件R.A大于S.B的元组,从关系R中可以看到只有元组(10,11,12)满足条件,而关系S中可以看出只有元组(3,7,11)和元组(4,7,6)满足条件,即σ
1>5(R×S)的结果如下所示。

σ
1>5(R×S)
π
1,5,6(σ
1>5(R×S))与元组演算表达式等价的条件是u[1]>v[2],即R关系中的第一个分量大于S关系中的第二个分量;从中投影R的第一个属性列t[1]=u[1],S的第二个属性列t[2]=v[2],S的第三个属性列t[3]=v[3]。
给定供应关系SPJ(供应商号,零件号,工程号,数量),查询至少供应了3项工程(包含3项)的供应商,输出其供应商号和供应零件数量的总和,并按供应商号降序排列。
SELECT供应商号,SUM(数量)FROM SPJ
30
31
32 ;32.
- A.ORDER BY供应商号DESC
- B.GROUP BY供应商号DESC
- C.ORDER BY供应商号
- D.GROUP BY供应商号
A B C D
A
[解析]
试题(30)根据题意查询至少供应了3项工程(包括3项)的供应商,应该按照供应商号分组,而且应该加上条件工程号的数目。但是需要注意的是,一个供应商可能为同一个项目供应了多种零件,因此,在统计工程项目数的时候需要加上DISTINCT,以避免重复统计导致错误的结果。
假如按供应商号Sno='S1'分组,结果如表16-3所示。
表16-3 按工程号JNO='J1'分组
Sno |
Pno |
Jno |
Qty |
Sno |
Pno |
Jno |
Qty |
S1
S1
S1
S1 |
P1
P3
P3
P3 |
J1
J1
J2
J2 |
200
400
200
100 |
S1
S1
S1 |
P1
P6
P3 |
J3
J3
J3 |
200
300
200 |
从表16-3可以看出,如果不加DISTINCT,统计的数为7,而加了DISTINCT,统计的数是3。故试题(31)正确的答案是A。
要求按供应商号降序排列,所以应按供应商号分组,同时加上DESC按降序排列。故试题(32)正确的答案是A。
企业职工和部门的关系模式如下所示,其中部门负责人也是一个职工。
职工(职工号,姓名,年龄,月薪,部门号,电话,地址)
部门(部门号,部门名,电话,负责人代码,任职时间)
请将下面的SQL语句空缺部分补充完整。
CREATE TABLE部门(部门号CHAR(4)PRIMARY KEY,部门名CHAR(20),电话CHAR(13),负责人代码CHAR(5),任职时间DATE,FOREIGN KEY 33 );
查询比软件部所有职工月薪都要少的职工姓名及月薪的SQL语句如下:
SELECT姓名,月薪FROM职工
WHERE月薪<(SELECT 34 FROM职工
WHERE部门号= 35 ));36. 若有关系模式R(A,B,C)和S(C,D,E),关系代数表达式E
1、E
2、E
3和E
4,且如果严格按照表达式运算顺序,查询效率最高的是
。
A.E
1 B.E
2 C.E
3 D.E
4 A B C D
C
[解析]
表达式E
1是先对关系R和S进行笛卡尔积运算再做投影运算;表达式E
2是先做投影运算再进行笛卡尔积运算,然后又做投影运算;表达式E
4是先做自然连接运算再做投影运算,而表达式E
3将选取运算σB<'2007'(R)和σE='80'(S)移到了叶节点,然后进行自然连接

。这样满足条件的元组数比先进行笛卡尔积产生的元组数大大下降,甚至无需中间文件,就可将中间结果放在内存,最后在内存即可形成所需结果集,它的查询效率最高。
部门DEPT(Deptno,Name,Tel,Leader)和职工EMP(Empno,Name,Sex,Address,Deptno)实体集,若一个职工只能属于一个部门,部门负责人Leader是一个职工。关系DEPT和EMP的外码分别为 39 ;下图中a、b处的实体名分别为 40 。
等值连接
可由基本的关系运算 41 等价表达。给定关系R、S如下所示,则R
S= 42 。
对于下图所示的S和SC关系,当我们对其进行左外连接时,其结果集的属性列数为 43 ,元组个数为 44 。

45. 若给出关系Student(S_no, Sname, Sage, S_sex, SD_name, S_add, S_tel),并用SQL语言定义Student关系如下:
CREATE Student(S_no CHAR(6),
Sname CHAR(30)NOT NULL,
Sage CHAR(30),
S_sex CHAR(1),
SD_name CHAR(20),
S_add CHAR(30),
S_tel CHAR(20),
PRIMARY KEY(S_no));
采用
向Student中插入记录能被正确地执行。
- A.INSERT INTO Student(S_no, Sname, Sage, S_sex, SD_name, S_add, S_tel)
VALUES('010456', '黎敏', '18', ", ", ", ") - B.INSERT INTO Student(S_no, Sname, Sage, S_sex, SD_name, S_add, S_tel)
VALUES('010456', '黎敏', '18', '男', '计算机学院', '北京', '88661200') - C.INSERT INTO Student(S_no, Sname, Sage, S_sex, SD_name, S_add, S_tel)
VALUES(, '黎敏', '18', 'F', '计算机学院', '北京', '88661200') - D.INSERT INTO Student(S_no, Sname, Sage, S_sex, SD_name, S_add, S_tel)
VALUES('010456', , '18', 'F', '计算机学院', '北京', '88661200')
A B C D
A
[解析]
要想使插入的记录能被正确地执行,必须保证插入的字段值符合字段定义时的类型和字段长度。在选项B中,'男'占了两个字符,而定义S_sex为CHAR(1),所以不符合。在选项C中,S_no CHAR(6)没有被赋予任何值也没有给出''是不对的。在选项D中,定义中Sname CHAR(30)NOT NULL字段Sname不能为空,而在D中这一项的值为空。所以正确的选项是A。