WHERE X.SNO=’S1’ AND NOT EXISTS (SELECT * FROM SPJ Y
WHERE Y.JNO=J.JNO AND Y.PNO=X.PNO))
(3)
1)把全部红色零件的颜色改成蓝色;
UPDATE P SET COLOR=’蓝’ WHERE COLOR=’红’
2)由S10供给J4的零件P6改为由S8供应,请作必要的修改。
UPDATE SPJ SET SNO=’S8’ WHERE SNO=’S10’ AND PNO=’P6’ AND JNO=’J4’ 若不能直接修改主码,则可如下操作:先添加新记录,再删除老记录 Insert into spj
select ’S8’,jno,pno,qty from spj
where SNO=’S10’ AND PNO=’P6’ AND JNO=’J4’
delete from spj where SNO=’S10’ AND PNO=’P6’ AND JNO=’J4’
3)从供应商关系中删除S2的记录,并从供应零件关系中删除相应的记录。 Delete from spj where sno=’s2’ Delete from s where sno=’s2’
4)请将 (S2, J8, P4, 200) 插入供应零件关系。 Insert into spj values(’S2’,’J8’,’P4’,200) 5)将工程J2的预算改为40万元。 Update J SET BG=40 WHERE JNO=’J2’
6)删除工程J8订购的S4的零件。题意为:删除工程J8订购的S4提供零件的供应关系记录。
DELETE FROM SPJ WHERE JNO=’J8’ AND SNO=’S4’ (4)
CREATE VIEW P_SPJ_VIEW AS SELECT P.*,SPJ.SNO,SPJ.JNO,QTY FROM P,SPJ
WHERE P.PNO=SPJ.PNO
1)找出工程代码为J2的工程使用的所有零件名称、数量。 SELECT PNAME,QTY FROM P_SPJ_VIEW WHERE JNO=?J2?
2)找出使用上海产的零件的工程号。 SELECT JNO
FROM P_SPJ_VIEW WHERE CITY=’上海’
6、在嵌入式SQL中如何区分SQL语句和主语句的?举例说明。 解:
在嵌入式SQL中,为了能够区分SQL语句与主语言语句,所有SQL语句都必须加前缀EXEC SQL。SQL语句的结束标志则随主语言的不同而不同,例如在PL/1和C中以分号(;)结束,在COBOL中以END-EXEC结束。这样,以C或PL/1作为主语言的嵌入式SQL语句的一般形式为:EXEC SQL
45
数据库原理及应用 举例:如下一条交互形式的SQL语句:DROP TABLE S 嵌入到C程序中,应写作:EXEC SQL DROP TABLE S
7、在嵌入式SQL中如何解决数据库工作单元与程序工作单元之间沟通的? 解:
嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据。把SQL语句中使用的主语言程序变量称为主变量(Host Variable),主变量在数据库工作单元与程序工作单元之间起相互信息或数据沟通作用。主变量在宿主语言程序与数据库之间的作用可参阅图3.5。
宿主语言 向SQL提供参数 得到SQL语句的结果和状态 从宿主语言中获取参数 操作数据库 主变量 SQL语句 获取数据 DB 对主变量赋值或设置状态信息
图3.5 主变量的通信与传递数据的作用示意图
主变量根据其作用的不同,分为输入主变量、输出主变量和指示主变量。输入主变量由应用程序对其赋值,SQL语句引用;输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序;一个主变量可以附带一个任选的指示主变量,指示主变量是一个整型变量,用来“指示”所指主变量的值的情况,指示主变量可以指示输入主变量是否希望设置为空值,可以检测输出主变量是否是空值(指示主变量为负值指示所指主变量为空值)。一个主变量可能既是输入主变量又是输出主变量。在SQL语句中使用这些变量时,需在主变量名前加冒号“:”作为标记,以区别于表中的字段(或属性)名。
SQL语句在应用程序中执行后,系统要反馈给应用程序若干信息,这些信息送到SQL的通信区SQLCA(SQL Communication Area)。SQLCA用语句EXEC SQL INCLUDE加以定义。SQLCA是一个数据结构(即SQLCA结构中含有能反映不同执行后状况的多个状态变量如:SQLCODE、SQLERRD1、SQLERRMC、SQLWARN、SQLERRM等),SQLCA中有一个存放每次执行SQL语句后返回代码的状态变量SQLCODE。当SQLCODE为零时,表示SQL语句执行成功,否则返回一个错误代码(负值)或警告信息(正值),一般程序员应该在每个SQL语句之后测试SQLCODE的值。以便根据当前SQL命令执行情况决定后续的处理。
8、SQL的集合处理方式与宿主语言的单记录处理方式之间如何协调? 解:
我们知道一个SQL语句一般能处理一组记录,而主语言一次只能处理一个记录,为此必须协调两种处理方式,使它们相互协调地处理。嵌入式SQL中是引入游标(Cursor)机制来解决这个问题的。
游标是系统为用户开设的一个数据内存缓冲区,用来存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录,并赋给主变量,再由主语言程序作进一步处理。与游标有关的SQL语句有下列4个:
(1)游标定义语句DECLARE。游标是与某个查询结果相联系的符号名,用SQL的DECLARE语句定义,它是说明性语句,定义时游标定义中的SELECT语句并不马上执行。(情况与视图的定义相似)
(2)游标打开语句OPEN。此时执行游标定义中的SELECT语句,同时游标缓冲区中含有SELECT语句执行后对应的所有记录,游标也处于活动状态。游标指针指向游标中记录结果第一行之前。
(3)游标推进语句FETCH。此时执行游标向前推进一行。并把游标指针指向的当前记录
46
读出,放到FETCH语句中指定的对应主变量中。FETCH语句常置于主语言程序的循环结构中,通过循环逐一处理游标中的一个个记录。
(4)游标关闭语句CLOSE。关闭游标,使它不再和原来的查询结果相联系,同时释放游标占用的资源。关闭的游标可以再次打开、得到新的游标记录后再使用游标、再关闭。
在游标处于活动状态时,可以修改和删除游标指针指向的当前记录。
9、对于简易教学管理数据库有如下3个基本表:S(SNO,SN,AGE,SEX)、SC(SNO,CNO,SCORE)、C(CNO,CN,TH),其含义为SNO(学号),SN(姓名),AGE(年龄),SEX(性别),SCORE(成绩),CNO(课程号),CN(课程名),TH(教师名)。试用SQL语言表达如下查询及操作:
(1)检索年龄大于16岁的女学生的学号和姓名。 (2)检索姓刘的学生选修的所有课程名与教师名。 (3)检索没有选修数据库课程的学生的学号与姓名。 (4)检索至少选修两门课程的学生的学号与姓名。
(5)检索选修课程包含姓张老师所授全部课程的学生的学号与姓名。 (6)把王非同学的学生信息及其选课情况等全部删除。 (7)在课程表中添加一门新课程,其信息为:('C8','信息系统概论','孙力')。
(8)在选修关系表SC中添加所有学生对'C8'课程的选修关系记录,成绩暂定为60,请用一条命令完成本批量添加任务。
(9)把选“信息系统概论”课程的男学生的成绩暂全部初始化重新设置为0。
(1) SELECT SNO,SN
FROM S
WHERE AGE>16 AND SEX='女'; (2) 方法一(联接查询方式): SELECT CN,TH FROM S,SC,C
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND SN like '刘%'; 方法二(嵌套查询方式): SELECT CN,TH FROM C
WHERE CNO IN
(SELECT CNO FROM SC
WHERE SNO IN (SELECT SNO FROM S
WHERE SN like '刘%'));
(3) SELECT SNO,SN
FROM S
WHERE SNO NOT IN (SELECT SNO FROM S
WHERE SNO IN (SELECT SNO FROM SC
WHERE CNO IN
47
数据库原理及应用 (SELECT CNO FROM C
WHERE CN='数据库'))); 或
SELECT SNO,SN FROM S
WHERE SNO NOT IN (SELECT SNO FROM S,SC,C WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND CN='数据库');
(4) 方法一:SELECT DISTINCT X.SNO
FROM SC X WHERE SNO IN (SELECT SNO FROM SC Y
WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO);
方法二:SELECT DISTINCT X.SNO
FROM SC X,SC Y
WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO);
方法三:SELECT SNO
FROM SC
GROUP BY SNO HAVING COUNT(*)>=2;
(5)SELECT DISTINCT SX.SNO,SN
FROM SC X,S SX WHERE NOT EXISTS (SELECT * FROM C
WHERE TH LIKE '张%' AND NOT EXISTS (SELECT * FROM SC Y
WHERE X.SNO=Y.SNO AND C.CNO=Y.CNO)) AND X.SNO=SX.SNO ; 或
SELECT DISTINCT X.SNO,X.SN FROM S X
WHERE NOT EXISTS (SELECT * FROM C
WHERE TH LIKE '张%' AND NOT EXISTS (SELECT * FROM SC Y
WHERE X.SNO=Y.SNO AND C.CNO=Y.CNO)); (6) DELETE FROM SC
WHERE SNO =
(SELECT SNO FROM S
WHERE SN='王非');
DELETE FROM S WHERE SN='王非';
48