数据库真题复习.docx
《数据库真题复习.docx》由会员分享,可在线阅读,更多相关《数据库真题复习.docx(11页珍藏版)》请在冰点文库上搜索。
数据库真题复习
⑵查询全部列
例2:
查询全体学生的详细记录
SELECT*
FROMStudent;
⑶查询经过计算的值
例3:
查询全体学生的姓名及其出生年份
SELECTSname,2012-Sageas出生年份
FROMStudent;
2.选择表中的若干元组
⑴消除取值重复的行
例4:
查询所有选修过课的学生的学号
SELECTDISTINCTSno
FROMSC;
⑵查询满足条件的元组
查询条件
谓词
比较
=,>,<,>=,<=,!
=,><,!
>,!
<,NOT+含上述比较运算符的条件表达式
确定范围
BETWEENAND,NOTBETWEENAND
确定集合
IN,NOTIN
字符匹配
LIKE,NOTLIKE
空值
ISNULL,ISNOTNULL
多重条件
AND,OR
②比较大小
例5查询考试成绩有不及格的学生的学号
SELECTDISTINCTSno
FROMSC
WHEREGrade<60;
②确定范围
例6查询年龄在20至23岁之间的学生的姓名、系别和年龄。
SELECTSname,Sdept,Sage
FROMStudent
WHERESageBETWEEN20AND23;
③确定集合
例7查询信息系(IS)、数学系(MA)、计算机科学系(CS)的学生的姓名和性别
SELECTSname,Sdept,Sage
FROMStudent
WHERESdeptIN(‘IS’,’MA’,’CS’);
④字符匹配
SQL单字符:
_多字符:
%转义字符:
\
ACCESS单字符:
?
多字符:
*转义字符:
[]
例8查姓“欧阳”且全名为3个汉字的学生的姓名
SELECTSname
FROMStudent
WHERESnameLIKE‘欧阳__’;
注意:
一个汉字占两个字符的位置
例9查以“DB_”开头,且倒数第3个字符为i的课程的详细情况
SELECT*
FROMCourse
WHERECnameLIKE‘DB\_%i__’ESCAPE’\’;
⑤涉及空值的查询
例10查询缺考学生的学号和相应的课程号
SELECTSno,Cno
FROMSC
WHEREGradeISNULL;
⑥多重条件查询
例11查CS系年龄在20岁以下的学生姓名
SELECTSname
FROMStudent
WHERESdept=’CS’ANDSage<20;
3.对查询结果排序
例12查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列
SELECT*
FROMStudent
ORDERBYSdept,SageDESC
例13查询选修了课程的学生人数
SELECTCOUNT(DISTINCTSno)
FROMSC;
5.对查询结果分组
例14查询各个课程号与相应的选课人数
SELECTCno,COUNT(Sno)
FROMSC
GROUPBYCno;
该SELECT语句对SC表按Cno的取值进行分组,所以具有相同Cno值的元组为一组,然后对每一组作用集函数COUNT以求得该组的学生人数。
如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。
WHERE子句是不能用集函数作为条件表达式的。
WHERE子句与HAVING短语的根本区别在于作用对象不同。
WHERE子句作用于基本表或视图,从中选择满足条件的元组。
HAVING短语作用于组,从中选择满足条件的组。
例15查询信息系选修了3门以上课程的学生的学号。
简单起见,这里假设SC表中有一列Dept,它记录了学生所在系。
SELECTSno
FROMSC
WHEREDept=’IS’
GROUPBYSno
HAVINGCOUNT(*)>3;
1.2.2连接查询
1.等值与非等值连接查询
例16查询每个学生及其选修课程的情况
SELECTStudent.*,SC.*
FROMStudent,SC
WHEREStudent.Sno=SC.Sno;
2.自身连接
例17查询一门课的先修课的先修课
SELECTfirst.kh,second.xxk
FROMKCasfirst,KCassecond
WHEREfirst.xxk=second.kh;
3.外连接
SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROMStudent,SC
WHEREStudent.Sno=SC.Sno(*);
(ACCESS)
SELECTStudent.*,SC.*
FROMStudentLEFTJOINSCONStudend.Sno=SC.Sno;
1.2.3嵌套查询
1.带有IN谓词的子查询
例18查询选修了课程名为’信息系统’的学生学号和姓名
SELECTSno,Sname
FROMStudent
WHERESnoIN
(SELECTSno
FROMSC
WHERECnoIN
(SELECTCno
FROMCourse
WHERECname=’信息系统’));
2.带有比较运算符的子查询
例19查询与“刘晨”在同一个系学习的学生
SELECTSno,Sname,Sdept
FROMStudent
WHERESdept=
(SELECTSdept
FROMStudent
WHERESname=’刘晨’);
3.带有ANY或ALL谓词的子查询
>ANY等价于>min()>ALL等价于>max()
=ANY等价于IN=ALL无意义
!
=ANY无意义!
=ALL等价于NOTIN
例20查询其他系中比IS系所有学生年龄都小的学生名单
SELECTSname,Sage
FROMStudent
WHERESage(SELECTSage
FROMStudent
WHERESdept=’IS’)
ANDSdept><’IS’
ORDERBYSageDESC;
本查询同样也可以用集函数实现
SELECTSname,Sage
FROMStudent
WHERESage<
(SELECTMIN(Sage)
FROMStudent
WHERESdept=’IS’)
ANDSdept<>’IS’
ORDERBYSageDESC;
4.带有EXISTS谓词的子查询
EXISTS代表存在量词。
带有EXISTS谓词的子查询不返回任何实际数据,它只产生逻辑真值“true”或逻辑假值“false”。
例21查询所有选修了1号课程的学生姓名
SELECTSname
FROMStudent
WHEREEXISTS
(SELECT*
FROMSC
WHERESno=Student.SnoANDCno=’1’);
一些带EXISTS或NOTEXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带IN谓词、比较运算符、ANY、ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。
例如,带有IN谓词的例19可以用如下带EXISTS谓词的子查询等价替换:
SELECTSno,Sname,Sdept
FROMStudentS1
WHEREEXISTS
(SELECT*
FROMStudentS2
WHERES2.Sdept=S1.SdeptAND
S2.Sname=’刘晨’);
由于带EXISTS量词的相关子查询只关心内层查询是否有返回值,并不需要查具体值,因此其效率并不一定低于不相关子查询,甚至有时是最有效的方法。
例22查询选修了全部课程的学生姓名。
SELECTSname
FROMStudent
WHERENOTEXISTS
(SELECT*
FROMCourse
WHERENOTEXISTS
(SELECT*
FROMSC
WHERESno=Student.Sno
ANDCno=Course.Cno));
例23查询至少选修了学生95002选修的全部课程的学生号码
SELECTDISTINCTSno
FROMSCSCX
WHERENOTEXISTS
(SELECT*
FROMSCSCY
WHERESCY.Sno=’95002’AND
NOTEXISTS
(SELECT*
FROMSCSCZ
WHERESCZ.Sno=SCX.SnoANDSCZ.Cno=SCY.Cno));
1.2.4集合查询
集合操作主要包括并操作UNION、交操作INTERSECT和差操作MINUS
例24查询计算机科学系的学生及年龄不大于19岁的学生
SELECT*
FROMStudent
WHERESdept=’CS’
UNION
SELECT*
FROMStudent
WHERESage<=19;
1.3数据更新
1.3.1插入数据
1.插入单个元组
例1插入一条选课记录(’95020’,’1’)。
INSERT
INTOSC(Sno,Cno)
VALUES(‘95020’,’1’);
2.插入子查询结果
例2对每一个系,求学生的平均年龄,并把结果存入数据库
CREATETABLEDeptage
(SdeptCHAR(15)
Avgageint)
INSERT
INTODeptage(Sdept,Avgage)
SELECTSdept,AVG(Sage)
FROMStudent
GROUPBYSdept;
1.3.2修改数据
1.修改某一个元组的值
例3将学生95001的年龄改为22岁
UPDATEStudent
SETSage=22
WHERESno=’95001’;
2.修改多个元组的值
例4将所有学生的年龄都增加1岁
UPDATEStudent
SETSage=Sage+1;
3.带子查询的修改语句
例5将计算机科学系全体学生的成绩置零
UPDATESC
SETGrade=0
WHERE‘CS’=
(SELECTSdept
FROMStudent
WHEREStudent.Sno=SC.Sno);
1.3.3删除数据
1.删除某一个元组的值
例6删除学号为95019的学生记录
DELETE
FROMStudent
WHERESno=’95019’;
2.删除多个元组的值
例7删除所有的学生选课记录
DELETE
FROMSC;
3.带子查询的删除语句
DELETE
FROMSC
WHERE‘CS’=
(SELECTSdept
FROMStudent
WHEREStudent.Sno=SC.Sno);
FROMStudent
WHERESdept=’IS’;
WITHCHECKOPTION;