SELECT COUNT(DISTINCT Sno) FROM SC;
[例19] 计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC
WHERE Cno= ' 1 '; 分组处理
[例20] 求各个课程号及相应的选课人数。 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; 查询结果:
Cno COUNT(Sno)
1 22 2 34 3 44 4 33
5 48
[例21] 查询选修了3门以上课程的学生学号。 SELECT Sno FROM SC GROUP BY Sno
HAVING COUNT(*) >3; 2 )连接查询(多表查询);
[例22] 查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno = SC.Sno;
[例23] 对[例33]用自然连接完成。
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC
WHERE Student.Sno = SC.Sno;
21
[例24]查询每一门课的间接先修课(即先修课的先修课) SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno; [例 25]
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno); [例26]查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname FROM Student, SC
WHERE Student.Sno = SC.Sno AND
/* 连接谓词*/ SC.Cno= ?2? AND SC.Grade > 90;
/* 其他限定条件 */
3 )嵌套查询(子查询)。
将第一步查询嵌入到第二步查询的条件中 SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept FROM Student
WHERE Sname= ? 刘晨 ?); 此查询为不相关子查询。
[例27]查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname ③ 最后在Student关系中 FROM Student 取出Sno和Sname WHERE Sno IN
(SELECT Sno ② 然后在SC关系中找出选 FROM SC 修了3号课程的学生学号 WHERE Cno IN
(SELECT Cno ① 首先在Course关系中找出 FROM Course “信息系统”的课程号,为3号
22
WHERE Cname= ?信息系统? ) );
4 掌握数据操纵命令:基本表数据的插入、删除、修改。 基本表数据的插入。 INSERT
INTO <表名> [(<属性列1>[,<属性列2 >?)] VALUES (<常量1> [,<常量2>] ? )
[例1] 将一个新学生元组(学号:200215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。
INSERT
INTO Student (Sno,Sname,Ssex,Sdept,Sage) VALUES ('200215128','陈冬','男','IS',18); INSERT
INTO <表名> [(<属性列1> [,<属性列2>? )] 子查询;
[例2] 对每一个系,求学生的平均年龄,并把结果存入数据库。
第一步:建表
CREATE TABLE Dept_age
(Sdept CHAR(15) /* 系名*/ Avg_age SMALLINT); /*学生平均年龄*/ INSERT
INTO Dept_age(Sdept,Avg_age) SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept; 基本表数据的修改。 UPDATE <表名>
23
SET <列名>=<表达式>[,<列名>=<表达式>]? [WHERE <条件>];
[例1] 将学生200215121的年龄改为22岁 UPDATE Student SET Sage=22
WHERE Sno=' 200215121 '; 基本表数据的删除。 DELETE
FROM <表名> [WHERE <条件>];
[例1] 删除学号为200215128的学生记录。 DELETE FROM Student
WHERE Sno= 200215128 ';
5 掌握有关视图的操作:定义视图、查询视图、更新视图、撤消视图。 定义视图 CREATE VIEW
<视图名> [(<列名> [,<列名>]?)] AS <子查询>
[WITH CHECK OPTION]; [例1] 建立信息系学生的视图。 CREATE VIEW IS_Student AS
SELECT Sno,Sname,Sage FROM Student WHERE Sdept= 'IS';
[例2]建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 。
CREATE VIEW IS_Student AS
SELECT Sno,Sname,Sage FROM Student
24
WHERE Sdept= 'IS' WITH CHECK OPTION; 撤消视图
DROP VIEW <视图名>; 例1:删除视图BT_S: DROP VIEW BT_S; 查询视图
用户角度:查询视图与查询基本表相同
[例1] 在信息系学生的视图中找出年龄小于20岁的学生。 SELECT Sno,Sage FROM IS_Student WHERE Sage<20; 视图消解转换后的查询语句为: SELECT Sno,Sage FROM Student
WHERE Sdept= 'IS' AND Sage<20; 更新视图
[例1] 将信息系学生视图IS_Student中学号200215122的学生姓名改为“刘辰”。 UPDATE IS_Student SET Sname= '刘辰'
WHERE Sno= ' 200215122 '; 转换后的语句: UPDATE Student SET Sname= '刘辰'
WHERE Sno= ' 200215122 ' AND Sdept= 'IS';
[例2] 向信息系学生视图IS_S中插入一个新的学生记录:200215129,赵新,20岁 INSERT
INTO IS_Student
VALUES(?95029?,?赵新?,20); 转换为对基本表的更新: INSERT
INTO Student(Sno,Sname,Sage,Sdept)
25