// Select SNAME FROM S Where NOT EXISTS(Select * FROM SC,C Where SC.CNO=C.CNO
AND CNAME='李明 ' AND SC.SNO=S.SNO)
b) 列出有二门以上 ( 含两门 ) 不及格课程的学生姓名及其平均成绩
//Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE) FROM S,SC,(Select SNO FROM
SC Where SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2)A Where
S.SNO=A.SNO AND SC.SNO=A.SNO GROUP BY S.SNO,S.SNAME
c) 列出既学过“ 1”号课程,又学过“ 2”号课程的所有学生姓名
// Select S.SNO,S.SNAME FROM S,(Select SC.SNO FROM SC,C Where SC.CNO=C.CNO
AND C.CNAME IN('1','2') GROUP BY SNO HAVING COUNT(DISTINCT CNO)=2)SC
Where S.SNO=SC.SNO
d) 列出“ 1”号课成绩比“ 2”号同学该门课成绩高的所有学生的学号
//Select S.SNO,S.SNAME FROM S,(Select SC1.SNO FROM SC SC1,C C1,SC SC2,C C2
Where SC1.CNO=C1.CNO AND C1.NAME='1' AND SC2.CNO=C2.CNO AND C2.NAME='2'
AND SC1.SCGRADE>SC2.SCGRADE)SC Where S.SNO=SC.SNO
e) 列出“ 1”号课成绩比“ 2”号课成绩高的所有学生的学号及其“ 1”号课和“ 2”号
课的成绩
//Select S.SNO,S.SNAME,SC.[1 号 课 成 绩 ],SC.[2 号 课 成 绩 ] FROM S,(Select
SC1.SNO,[1 号课成绩 ]=SC1.SCGRADE,[2号课成绩 ]=SC2.SCGRADE FROM SC SC1,C C1,SC
SC2,C C2 Where SC1.CNO=C1.CNO AND C1.NAME='1' AND SC2.CNO=C2.CNO AND
C2.NAME='2' AND SC1.SCGRADE>SC2.SCGRADE)SC Where S.SNO=SC.SNO
24、动态查询如何实现?表的结构变化后,如果不需要修改程序,如何设计和实现查询?
将查询封装进存储过程中, 通过调用存储过程实现动态调用; 表结构发生变化后修改相
应的存储过程即可再不修改程序的情况下实现查询。
25、触发器分为事前触发和事后触发, 这两种触发有和区别。 语句级触发和行级触发有何区
别?
事前触发器运行于触发事件发生之前, 而事后触发器运行于触发事件发生之后。 通常事
前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,
而行级触发在触发器所影响的每一行触发一次。
26、游标的作用?如何知道游标已经到了最后?
游标用于定位结果集的行, 通过判断全局变量 @@FETCH_STATUS可以判断是否到了最后,
通常此变量不等于 0 表示出错或到了最后。
27、请说出数据库中存储过程和函数的区别 ?
存储过程是用户定义的一系列 sql 语句的集合, 涉及特定表或其它对象的任务, 用户可
以调用存储过程。
函数通常是数据库已定义的方法, 它接收参数并返回某种类型的值并且不涉及特定用户
表。