1、第三章 习题4 .针对上题中建立的四个表试用 SQL 语言完成第 2 章习题 5 中的查询。答案: (1)求供应工程 J1 零件的供应商号码 SNO;SELECT SNO FROM SPJ WHERE JNO=J1;(2)求供应工程 J1 零件 P1 的供应商号码 SNO; SELECT SNO FROM SPJ WHERE JNO=J1 AND PNO=P1;(3)求供应工程 J1 零件为红色的供应商号码 SNO;SELECT SNO /*这是嵌套查询*/ FROM SPJ WHERE JNO=J1AND PNO IN /*找出红色的零件的零件号码 PNO */ (SELECT PNO FR
2、OM P /*从 P 表中找*/ WHERE COLOR=红 );或 SELECT SNO FROM SPJ,P /*这是两表连接查询*/ WHERE JNO=J1 /*这是复合条件连接查询*/ AND SPJ.PNO=P.PNO AND COLOR=红 ; (4)求没有使用天津供应商生产的红色零件的工程号 JNO;*解析:第一种解法是使用多重嵌套查询,第二种方法的子查询是一个多表连接。注意:从 J 表入手,以包含那些尚未使用任何零件的工程号。SELECT JNO FROM J WHERE NOT EXISTS(SELECT * FROM SPJ WHERE SPJ.JNO=J.JNO AND
3、 SNO IN /*天津供应商的 SNO*/ (SELECT SNO FROM S WHERE CITY=天津 ) AND PNO IN /*红色零件的 PNO*/ (SELECT PNO FROM P WHERE COLOR=红);或 SELECT JNO FROM J WHERE NOT EXISTS (SELECT * FROM SPJ, S, P WHERE SPJ.JNO=J.JNO AND SPJ.SNO=S.SNO AND SPJ.PNO=P.PNO AND S.CITY=天津 AND P. COLOR=红 ); /注:本例中父查询和子查询均引用了 Student 表,可以像自身
4、连接那样用别名将父查询中的 Student 表与子查询中的 Student 表区分开:/ (5)求至少用了供应商 S1 所供应的全部零件的工程号 JNO (类似于 P113 例 44)。解析:它所表达的语义为:不存在这样的零件 y,供应商 S1 供应了 y,而工程 x没有选用 y。用 SQL 语言表示如下:SELECT DISTINCT JNO FROM SPJ SPJZ WHERE NOT EXISTS (SELECT * FROM SPJ SPJX WHERE SNO=S1 AND NOT EXISTS (SELECT * FROM SPJ SPJY WHERE SPJY.PNO=SPJX
5、.PNO AND SPJY.JNO=SPJZ.JNO AND SPJY.SNO=S1) ) ; 5 .针对习题 3 中的四个表试用 SQL 语言完成以下各项操作: (1) 找出所有供应商的姓名和所在城市。 (2) 找出所有零件的名称、颜色、重量。 (3) 找出使用供应商 S1 所供应零件的工程号码。 (4) 找出工程项目 J2 使用的各种零件的名称及其数量。 (5) 找出上海厂商供应的所有零件号码。 (6) 找出使用上海产的零件的工程名称。 (7) 找出没有使用天津产的零件的工程号码。 (8) 把全部红色零件的颜色改成蓝色。 (9) 由 S5 供给 J4 的零件 P6 改为由 S3 供应,请作
6、必要的修改。 (填空题)(10) 从供应商关系中删除 S2 的记录,并从供应情况关系中删除相应的记录。(11) 请将 (S2,J6,P4 ,200) 插入供应情况关系。答案: (1) 找出所有供应商的姓名和所在城市。 SELECT SNAME, CITY FROM S; (2) 找出所有零件的名称、颜色、重量。 SELECT PNAME, COLOR, WEIGHT FROM P; (3) 找出使用供应商 S1 所供应零件的工程号码。 SELECT JNO FROM SPJ WHERE SNO=S1; (4) 找出工程项目 J2 使用的各种零件的名称及其数量。 SELECT P.PNAME,
7、SPJ.QTY FROM P, SPJ WHERE P.PNO=SPJ.PNO AND SPJ.JNO=J2; (5) 找出上海厂商供应的所有零件号码。 SELECT DISTINCT PNO FROM SPJ WHERE SNO IN (SELECT SNO FROM S WHERE CITY=上海); (6) 找出使用上海产的零件的工程名称。 SELECT JNAME FROM J, SPJ, S WHERE J. JNO=SPJ. JNO AND SPJ. SNO=S.SNO AND S.CITY=上海; 或 SELECT JNAME FROM J WHERE JNO IN (SELEC
8、T JNO FROM SPJ, S WHERE SPJ. SNO=S.SNO AND S.CITY=上海); (7) 找出没有使用天津产的零件的工程号码。 SELECT JNO FROM J WHERE NOT EXISTS (SELECT * FROM SPJ WHERE SPJ.JNO=J.JNO AND SNO IN (SELECT SNO FROM S WHERE CITY=天津); 或 SELECT JNO FROM J WHERE NOT EXISTS (SELECT * FROM SPJ, S WHERE SPJ.JNO=J.JNO AND SPJ.SNO=S.SNO AND S
9、.CITY=天津); (8) 把全部红色零件的颜色改成蓝色。 UPDATE P SET COLOR=蓝 WHERE COLOR=红 ; (9) 由 S5 供给 J4 的零件 P6 改为由 S3 供应,请作必要的修改。 UPDATE SPJ SET SNO=S3 WHERE SNO=S5 AND JNO=J4 AND PNO=P6; (10) 从供应商关系中删除 S2 的记录,并从供应情况关系中删除相应的记录。 DELETE FROM SPJ WHERE SNO=S2; DELETE FROM S WHERE SNO=S2; 解析:注意删除顺序,应该先从 SPJ 表中删除供应商 S2 所供应零件
10、的记录,然后从 S 表中删除 S2。(11) 请将 (S2,J6,P4 ,200) 插入供应情况关系。 INSERT INTO SPJ(SNO, JNO, PNO, QTY) VALUES (S2,J6,P4,200); /*插入的属性值与指明列要对应*/ 或 INSERT INTO SPJ VALUES (S2,P4,J6,200); /*插入的记录在每个属性列上有值,并且属性列要和表定义中的次序对应*/ 设有一个 SPJ 数据库,包括 S、P 、J、SPJ 四个关系:供应商 S(SNO 、SNAME、STATUS、CITY)零件 P(PNO,PNAME、COLOR、WEIGHT)工程项目 J(JNO,JNAME,CITY )供应情况 SPJ(SNO,PNO,JNO,QTY )试用 SQL 语言完成以下查询:(1)求供应工程 J1 零件为红色的供应商号码 SNO。(3 分)(2)求没有使用天津供应商生产的红色零件的工程号 JNO 。(3 分)(3)求至少用了供应商 S1 所供应的全部零件的工程号 JNO。(4 分)