假设供应商S和供应情况SPJ的关系模式分别为:S(Sno,Sname,Status,City)和SPJ(Sno,Pno,Jno,Qty)。要查询出“零件号:Pno等于‘P3’的供应商名Sname”,()是能正确查询的关系代数表达式。
A.
B.
C.
D.
参考答案:B
解析:
解答本题,首先应对关系运算的符号有所了解:投影运算(∏)、自然连接()、选择运算(σ)、差运算(-)。
要查询的结果是“零件号Pno等于‘P3’的供应商名Sname”,因此最后得到的关系模式应该只包括一个字段“供应商名sname”。理解这个之后,再逐一分析每一个关系代数表达式的含义。
1)表达式A。首先对其进行分解:关系表达式σPno=’p3’(SPJ)是一个选择运算,它的结果是从SPJ关系模式中选择出零件号Pno=’p3’的所有记录。而∏Sname(S)则是从关系模型S中投影出Sname(供应商)这一列。这样生成的两个新关系模式显然没有共同的列,因此对这两个关系模式进行自然连接是没有意义的。即使有结果也肯定不能够产生只有一个Sname列的关系模式,因此选项A显然是不正确的。
2)表达式B。这个表达式与表达A比较接近,只是先将关系模式S与σPno=’p3’(SPJ)的结果进行自然连接,这样就可以得到“零件号为p3的生产厂商信息”,再从这个关系模式中进行投影运算,选出Sname列,显然是能够得到正确答案的。
3)表达式C。这个表达式首先对S和SPJ表进行自然连接,将得到一个信息比较冗余的厂商与零件对应表,对这个关系模式进行选择操作,选择出“Pno≠’p3’”的记录,然后再进行投影操作,只选择出Sname这一列,得到的是一个生产零件号不是p3的厂商名称。
而∏Sname(S)则是选择出所有的厂商名称,这两个进行差运算,粗看好像是对的。但是由于生产零件号不是p3的厂商,有可能同时也会生产零件号是p3的零件。因此得到的结果将是“只生产零件号Pno等于‘p3’的供应商名Sname”,显然是不符合题意的。
4)表达式D。这个表达式与表达式C完成的功能相同,不过它是先进行选择运算,然后再自然连接,能够减少运算量。但结果仍然是“只生产零件号Pno等于‘p3’的供应商名Sname”,因此也不符合题意。