SQL语句题目练习
1、有两个关系S(A,B,C,D)和T(C,D,E,F),写出与下列查询等价的SQL表达式:
这里插入LaTeX公式有点不太美观就直接上题目了。
(1)
说实话,关系代数这块有几个星期没碰都快忘光了233.
σ是选择的意思,这里的意思是从S中选择A是10的S.
SELECT *
FROM S
WHERE A='10';
(2)
Π是投影的意思,那么就是S上A、B的投影。
SELECT A,B
FROM S;
(3)
⋈下面未加条件,是自然连接的意思,它会把重复的属性去掉,而且进行比较的分量必须是相同的属性组。
SELECT A,B,S.D,S.D,E,F
FROM S,T
WHERE S.C=T.C AND S.D=T.D;
(4)
这里是一个等值连接,把条件加入到WHERE子句中即可。
SELECT *
FROM S,T
WHERE S.C=T.C;
(5)
同上一题差不多。
SELECT *
FROM S,T
WHERE S.A<T.E;
(6)
这题的意思是S上C、D的投影和T的笛卡尔积。
SELECT S.C,S.D,T.*
FROM S,T;
2、用SQL语句建立第2章习题6中的4个表;针对建立的4个表用SQL完成第二章习题6中的查询。
emmm,看来我又要把那个题出来一遍了,等会啊。
我在下面敲代码的时候大小写切换手都抽筋了,大家一定不要学我,属性名全大写算了
S表:
CREATE TABLE S
(Sno CHAR(2) UNIQUE,
Sname CHAR(6),
Status CHAR(2),
City CHAR(4));
P表:
CREATE TABLE P
(Pno CHAR(2) UNIQUE,
Pname CHAR(6),
Color CHAR(2)
Weight INT);
J表:
CREATE TABLE J
(Jno CHAR(2) UNIQUE,
Jname CHAR(8),
City CHAR(4));
SPJ表:
CREATE TABLE SPJ
(Sno CHAR(2),
Pno CHAR(2),
Jno CHAR(2),
QTY INT);
插入数据过程略去
(1)求供应工程J1零件的供应商号码SNO;
SELECT DISTINCT Sno /*去除掉了重复的SNO*/
FROM SPJ
WHERE Jno='J1';
(2) 求供应工程J1零件P1的供应商号码SNO;
SELECT DISTINCT Sno /*去除掉了重复的SNO*/
FROM SPJ
WHERE Jno='J1' AND Pno='P1';
(3) 求供应工程J1零件为红色的供应商号码SNO;
SELECT Sno
FROM SPJ,P
WHERE Jno='J1'
AND SPJ.Pno=P.Pno
AND Color='红'; /*给的限定条件是J1以及颜色为红*/
(4) 求没有使用天津供应商生产的红色零件的工程号JNO;
SELECT DISTINCT Jno
FROM SPJ
WHERE Jno NOT IN /*查询未使用的*/
(SELECT Jno
FROM SPJ,P,S
WHERE S.City='天津'
AND Color='红'
AND S.Sno=SPJ.Sno
AND P.Pno=SPJ.Pno);
(5) 求至少用了供应商S1所供应的全部零件的工程号JNO ;
SELECT Jno
FROM SPJ
WHERE Pno >ALL /*这里我不确定可不可以这样写,因为没有数据让我实践*/
/*S1供应的零件是P1和P2,我这里的意思是查询Pno是P1和P2的JNO*/
(SELECT DISTINCT Pno
FROM SPJ
WHERE Sno='S1')
3、针对上题中的四个表试用SQL语言完成以下各项操作:
(1)找出所有供应商的姓名和所在城市
SELECT Sname,City
FROM S;
(2)找出所有零件的名称、颜色、重量
SELECT Pname,Color,Weight
FROM P;
(3)找出使用供应商S1所供应零件的工程号码
SELECT DISTINCT Jno
FROM SPJ
WHERE Sno='S1';
(4)找出工程项目J2使用的各种零件的名称及其数量
SELECT Pname,QTY
FROM SPJ,P
WHERE P.Pno=SPJ.Pno AND SPJ.Jno='J2';
(5)找出上海厂商供应的所有零件号码
SELECT Pno
FROM SPJ,S
WHERE S.Sno=SPJ.Sno AND City='上海';
(6) 找出使用上海产的零件的工程名称
SELECT Jname
FROM SPJ,S,J
WHERE S.Sno=SPJ.Sno AND S.City='上海' AND J.Jno=SPJ.Jno;
(7) 找出没有使用天津产的零件的工程号码
SELECT DISTINCT Jno
FROM SPJ
WHERE Jno NOT IN
(SELECT DISTINCT Jno
FROM SPJ,S
WHERE S.Sno=SPJ.Sno
AND S.City='天津';
(8) 把全部红色零件的颜色改成蓝色
UPDATE P
SET Color='蓝'
WHERE Color='红';
(9) 由S5供给J4的零件改为由S3供应
UPDATE SPJ
SET Sno='S3'
WHERE Sno='S5' AND Jno='S4' AND Pno='P6';
(10) 从供应商关系中删去供应商号是S2的记录,并从供应情况关系中删除相应的记录。
DELETE
FROM S
WHERE Sno='S2';
DELETE
FROM SPJ
WHERE Sno='S2';
(11) 请将(S2,J6,P4,200)插入供应情况关系
INSERT INTO SPJ
VALUES ('S2','J6','P4',200);
4、请为三建工程项目及建立一个供应情况的视图,包括供应商代码(Sno)、零件代码(Pno)、供应数量(QTY)
三建工程的供应情况视图:
CREATE VIEW SANJIAN
AS SELECT Sno,SPJ.Pno,QTY
FROM SPJ,J
WHERE SPJ.Jno=J.Jno AND J.Jname='三建';
(1) 找出三建工程项目使用的各种零件代码及其数量
SELECT DISTINCT Pno,QTY
FROM SANJIAN
(2) 找出供应商S1的供应情况
SELECT DISTINCT *
FROM SANJIAN
WHERE Sno='S1';
这几个题目中我觉得有点问题的就是2中的第5小题,其他的基本看着题目都能写出来。
参考文献:
[1]萨师煊,王珊,数据库系统概论.5版.北京:高等教育出版社,2014.
[2]David老师的PPT.