发布时间 : 星期六 文章《数据库系统概论》复习总结更新完毕开始阅读
(8)除:
给定关系R (X,Y) 和S (Y,Z),其中X,Y,Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在 X 属性列上的投影:元组在X上分量值x的象集Yx包含S在Y上投影的集合,记作: R÷S = {tr [X] | tr ?R∧πY (S) ? Yx }
例如:设关系R、S分别为下图的(a)和(b),R÷S的结果为图(c)
?例:设有一个SPJ数据库,包括S,P,J,SPJ四个关系模式: S( SNO,SNAME,STATUS,CITY); P(PNO,PNAME,COLOR,WEIGHT); J(JNO,JNAME,CITY);
SPJ(SNO,PNO,JNO,QTY);
供应商表S由供应商号码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成;零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成;工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成;供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项
5
目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。 试用关系代数完成如下查询:
(1) 求供应工程J1零件的供应商号码SNO; (2) 求供应工程J1零件P1的供应商号码SNO; (3) 求供应工程J1零件为红色的供应商号码SNO;
(4) 求没有使用天津供应商生产的红色零件的工程号JNO;
(5) 求至少用了供应商S1所供应的全部零件的工程号JNO。 解:
(1)求供应工程J1零件的供应商号码SNO:
πSno(σJno=?J1?(SPJ))
(2)求供应工程J1零件P1的供应商号码SNO:
πSno(σJno=?J1?∧Pno=?P1?(SPJ))
(3)求供应工程J1零件为红色的供应商号码SNO:
πSno(σJno=?J1?(σCOLOR=?红?(P)?? SPJ))或 πSno(σJno=?J1?(SPJ)??(σCOLOR=?红?(P))
(4)求没有使用天津供应商生产的红色零件的工程号JNO:
πJno(SPJ)- πJNO(σcity=?天津?∧Color=?红?(S?? SPJ?? P))或 πJno(SPJ)- πJNO(σcity=?天津?(S)?? SPJ ?? σColor=?红?(P)) (5)求至少用了供应商S1所供应的全部零件的工程号JNO:
πJno,Pno(SPJ)? πPno(σSno=?S1?(SPJ))
?第三章 关系数据库标准语言SQL(重点)
? 本章内容:SQL概述、数据定义、数据查询、数据更新、视图
? 本章主要考点:基本概念、??数据查询的基本语句操作、数据更新语句 1、SQL语言是(C)语言。
A.层次数据库 B.网络数据库 C.关系数据库 D.非数据库 2、SQL语言具有两种使用方式,分别称为交互式SQL和(C)。
A.提示式SQL B.多用户SQL C.嵌入式SQL D.解释式SQL
3、假定学生关系是S(S#,SNAME,SEX,AGE),课程关系是C(C#,CNAME,TEACHER),学生选课关系是SC(S#,C#,GRADE)。要查找选修“COMPUTER”课程的“女”学生姓名,将涉及到关系(D)。
A.S B.SC,C C.S,SC D.S,C,SC
4、如下面的数据库的表中,若职工表的主关键字是职工号,部门表的主关键字是部门号,SQL
操作(B)不能执行。
A.从职工表中删除行(?025?,?王芳?,?03?,720) B.将行(?005,?,?乔兴?,?04?,750)插入到职工表中
C.将职工号为,?001?的工资改为700
D.将职工号为,?038?的部门号改为?03?
5、在SQL语言中,用来测试一个集合里是否有重复元组存在,使用下列哪一个关键字(A) A.UNIQUE B.DISTINCT C.EXISTS D.NOT IN ??6、SQL数据查询语句 SELECT语句格式:
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ]
6
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ]; (注:SQL语句中不区分大小写) ①单表查询
(1)选择表中的若干列: 查询指定列:
例:查询全体学生的学号与姓名
SELECT Sno,Sname FROM Student;
查询所有列:(将<目标列表达式>指定为 *) 例:查询全体学生的详细记录。
SELECT * FROM Student;
查询结果计算的值:
例:查全体学生的姓名及其出生年份。
SELECT Sname,2012-Sage /*假定当年的年份为2012年,减去年龄即得出生年份*/ FROM Student;
(2)选择表中的若干元组 取消取值重复的行:(指定DISTINCT关键词,去掉表中重复的行) 例:查询选修了课程的学生号码
SELECT DISTINCT Sno (使用DISTINCT关键词取消了重复学号的行) FROM SC;
查询满足条件的行:(WHERE语句)
例:查询计算机科学系全体学生的名单。(比较) SELECT Sname FROM Student
WHERE Sdept =?CS?;
例:查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄(确定范围) SELECT Sname,Sdept,Sage FROM Student
WHERE Sage BETWEEN 20 AND 23; 例:查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。(确定集合) SELECT Sname,Ssex FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
例:查询学号为200215121的学生的详细情况。(字符匹配) SELECT *
7
FROM Student
WHERE Sno LIKE ?200215121';
例:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩
的学生的学号和相应的课程号。(空值) SELECT Sno,Cno FROM SC
WHERE Grade IS NULL /*不能用?=?代替IS*/ 例:查询计算机系年龄在20岁以下的学生姓名。(多重条件) SELECT Sname FROM Student
WHERE Sdept= 'CS' AND Sage<20; (3)ORDER BY子句
可以按一个或多个属性列排序。升序:ASC;降序:DESC;缺省值为升序 例:查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。 SELECT Sno,Grade FROM SC
WHERE Cno= ' 3 '
ORDER BY Grade DESC; (4)聚集函数
COUNT([DISTINCT|ALL] *) 统计元组个数
COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数 SUM([DISTINCT|ALL] <列名>) 计算一列值的总和 AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值 MAX([DISTINCT|ALL] <列名>) 求一列中的最大值 MIN([DISTINCT|ALL] <列名>) 求一列中的最小值 例:计算1号课程的学生平均成绩。
SELECT AVG(Grade) FROM SC
WHERE Cno= ' 1 '; ②多表查询 (1)等值查询
例:查询每个学生及其选修课程的情况 SELECT Student.*,SC.* FROM Student,SC
WHERE Student.Sno = SC.Sno;
(2)嵌套查询
带有IN谓词的子查询:
例:查询与“刘晨”在同一个系学习的学生
SELECT Sno,Sname,Sdept FROM Student
WHERE Sdept IN
(SELECT Sdept FROM Student
WHERE Sname=? 刘晨 ?); 带有比较运算符的子查询:(当内查询的结果是一个值时,可以用=代替IN)
8