数据库查询SQL 实验报告Word格式.docx
《数据库查询SQL 实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《数据库查询SQL 实验报告Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
实验报告
1
实验目的
1.熟悉数据库的交互式SQL工具。
2.熟悉通过SQL对数据库进行单表查询、连接查询的操作。
2
实验工具KingbaseES
利用KingbaseES及其交互式查询工具ISQLW来熟悉SQL。
3
实验内容和要求
1.
在实验二中建立数据库的基础上,完成课本例3.16-60的各种查询;
2.
根据以下要求认真填写实验报告,记录所有的实验用例。
4实验方法及步骤
例3.16/*查询全体学生的学号和姓名*/
SELECTSNO,SNAME
FROM"
S-C"
."
STUDENT"
注意:
SELECTSNO,SNAMEFROM这些的大小写随意,但是"
必须是指定大小写,要是改变大小写则可以用"
.student
加分号,引号会自动变红色.在SQL语句中用/*注释内容*/注释。
例3.17查询全体学生的姓名、学号、所在系
SELECTSNAME,SNO,SDEPTFROM"
例3.18查询全体学生的详细记录
SELECT*FROM"
例3.19查询全体学生的姓名及其出生年份
SELECTSNAME,2014-SageFROM"
因为2014-Sage在生成表格的时候出现了“?
”无法显示,改错方法就是在2014-Sage后面直接加“空格键和别名”如在下题给它取别名W
SELECTSNAME,2014-SageWFROM"
例3.20查询全体学生的姓名、出生年份和所在院系,要求用小写字母表示系名
SELECTSNAME,'
YEAROFBIRTH:
'
2014-SAGE,LOWER(SDEPT)
指定别名:
SELECTSNAMEname,'
birth,2014-SAGEbirthday,LOWER(SDEPT)department
例3.21查询选修了课程的学生学号
SELECTSNOFROM"
SC"
;
查询结果中有许多重复行,若想去掉重复,则指定DISTINCT。
若没有指定,则默认为all。
等价于SELECTallSNOFROM"
SELECTDistinctSNO
例3.22查询计算机科学系全体学生的名单
SELECTSNAME
WHERESDEPT='
CS'
例3.23查询所有年龄在20岁以下的学生姓名及其年龄
SELECTSNAME,SAGe
WHEREsage<
20;
例3.24查询考试成绩不及格的学生学号
SELECTDISTINCTsnoFROM"
WHEREgrade<
60;
这里使用了DISTINCT短语,当一个学生有多门课程不及格,他的学号也只列一次。
这里表明没有学生不及格。
例3.25查询年龄在20-23岁之间的学生姓名、系别和年龄
SELECTSNAME,SDEPT,SAGEFROM"
WHEREsageBETWEEN20AND23;
例3.26查询年龄不在20-23岁之间的学生姓名、系别和年龄
WHEREsageNOTBETWEEN20AND23;
例3.27查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别
SELECTSNAME,Ssex
WHEREsdeptin('
'
MA'
IS'
);
例3.28查询既不是计算机科学系(CS)、数学系(MA)也不是信息系(IS)学生的姓名和性别
WHEREsdeptnotin('
例3.29查询学号为200215121的学生的详细情况
WHERESNOLIKE'
200215121'
例3.30查询所有姓刘的学生的姓名、学号和性别
SELECTsname,sno,ssexFROM"
wheresnamelike'
刘%'
(百分号)代表任意长度(长度可以为0)的字符串。
例3.31查询姓“欧阳”且全名为三个汉字的的学生的姓名
SELECTsnameFROM"
欧阳-'
_(下划线)代表任意单个字符
例3.32查询名字中第二个字为“阳”的学生的姓名和学号
SELECTsname,sno
wheresnamelike'
-阳%'
例3.33查询所有不姓刘的学生的姓名、学号和性别
SELECTsname,sno,ssex
wheresnamenotlike'
例3.34查询DB\_DESIGN课程的课程号和学分
SELECTcno,ccredit
COURSE"
whereCnamelike'
DB\_DESIGN'
ESCAPE'
\'
whereCname='
数据库'
例3.35查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况
SELECT*
DB\_%i__'
ESCAPE'
例3.36某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。
查询缺少成绩的学生学号和相应的课程号。
SELECTsno,cno
wheregradeisnull;
例3.37查询所以有成绩学生的学号和课程号
wheregradeisNOTnull;
例3.38查询计算机科学系年龄在20岁以下的学生姓名
SELECTsname
whereSDEPT='
ANDSAGE<
例3.39查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
SELECTsno,grade
wherecno='
3'
orderbygradedesc;
desc是降序,ASC是升序,系统默认升序。
orderbygrade;
例3.40查询全体学生情况,查询结果按所在系的系号升序排列;
同一系的学生按年龄降序排列。
orderbysdept,sagedesc;
例3.41查询学生总人数
SELECTCOUNT(*)
例3.42查询选修了课程的学生人数
SELECTCOUNT(DISTINCTSNO)
例3.43查询选修了1号课程的学生平均成绩
SELECTAVG(GRADE)
WHERECNO='
1'
例3.44查询选修了2号课程的学生最高分数
SELECTMAX(GRADE)
WHERECno='
2'
例3.45查询学生200215012选修课程的总学分数
SELECTSUM(CCREDIT)FROM"
.SC,"
.COURSEWHERESNO='
200215012'
ANDSC.CNO=COURSE.CNO;
例3.46查询各个课程号及其选课人数
SELECTCNO,COUNT(SNO)FROM"
.SCGROUPBYCNO;
例3.47查询选修了两门以上课程的学生学号
SELECTSNOFROM"
.SCGROUPBYSNOHAVINGCOUNT(*)>
2;
例3.48查询平均成绩大于等于80分的学生学号和平均成绩
SELECTSNO,AVG(GRADE)FROM"
.SCWHEREAVG(GRADE)>
=80GROUPBYSNO;
服务器消息:
[KingbaseESServer]ERROR:
在WHERE子句中不能使用聚集函数
.SCGROUPBYSNOHAVINGAVG(GRADE)>
=80;
例3.49查询每个学生及其选修课程的情况
SELECTSTUDENT.*,SC.*FROM"
.STUDENT,"
.SCWHERESTUDENT.SNO=SC.SNO;
例3.50对例3.49用自然连接完成
SELECTSTUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE
FROM"
例3.51查询选修2号课程且成绩在90分以上的所有学生的学号和姓名
SELECTSTUDENT.sno,snameFROM"
.SCWHERESTUDENT.SNO=SC.SNOANDSC.CNO='
ANDSC.GRADE>
=90;
例3.52查询每一门课的间接先修课(即先修课的先修课)
SELECTFIRST.CNO,SECOND.CPNO
.COURSEFIRST,"
.COURSESECOND
WHEREFIRST.CPNO=SECOND.CNO;
例3.53外连接(每个学生的基本情况及其选课情况)
.STUDENTleftouterjoin"
.SCon(student.sno=sc.sno);
/*也可以使用USING来去掉结果中重复的值*/
SELECTSTUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADEFROM"
.SCUSING(SNO);
例3.54查询每个学生的学号、姓名、选修的课程名及其成绩
SELECTSTUDENT.SNO,SNAME,CNAME,GRADEFROM"
.COURSEWHERESTUDENT.SNO=SC.SNOANDSC.CNO=COURSE.CNO;
例3.55查询与“刘晨”在同一个系学习的学生
分步查询
SELECTSDEPTFROM"
.STUDENTWHERESNAME='
刘晨'
/*确定“刘晨”所在系名*/
SELECTSNO,SNAME,SDEPTFROM"
.STUDENTWHERESDEPT='
查询所有在CS系的学生
法1.嵌套查询SELECTSNO,SNAME,SDEPTFROM"
.STUDENTWHERESDEPTin(SELECTSDEPTFROM"
法2.自身连接SELECTS1.SNO,S1.SNAME,S1.SDEPTFROM"
.STUDENTS1,"
.STUDENTS2WHERES1.SDEPT=S2.SDEPTANDS2.SNAME='
法3.带有比较运算符的子查询SELECTSNO,SNAME,SDEPTFROM"
.STUDENTWHERESDEPT=(SELECTSDEPTFROM"
例3.56查询选修了课程名为“信息系统”的学生学号和姓名
SELECTSNO,SNAME/*3.最后在student关系中查询sno和sname*/
.STUDENT
WHERESNOIN
(SELECTSNO/*2.然后在SC关系中找出选修了3号课程的学生学号*/
FROM"
.SC
WHERECNOIN
(SELECTCNO/*1.首先在course关系中找出'
信息系统'
的课程,结果为3号*/
.COURSE
WHERECNAME='
)
连接查询
SELECTSTUDENT.SNO,SNAMEFROM"
.COURSE
WHERESTUDENT.SNO=SC.SNOAND
SC.CNO=COURSE.CNOAND
COURSE.CNAME='
例3.57查询每个学生超过他自己选修课程平均成绩的课程号
SELECTSNO,CNOFROM"
.SCx
WHEREGrade>
=(selectAVG(Grade)
.SCy
WHEREy.sno=x.sno);
x是SC的别名,这题是相关子查询。
求解相关子查询不能像求解不相关子查询那样一次将子查询求解出来,然后求解父查询。
内层查询由于与外层查询有关,因此必须反复求值。
例3.58查询非计算机系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECTSName,sageFROM"
.STUDENT
ANY(selectsage
.student
WHEREsdept='
)
ANDSDEPT<
>
聚集函数求法:
(selectMAX(sage)
例3.59查询非计算机系中比计算机科学系所有学生年龄都小的学生姓名和年龄
SELECTSName,sage
ALL
(selectsage
或者用聚集函数:
(selectmin(sage)
事实上,用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高。
例3.60查询所有选修了1号课程的学生姓名
WHEREEXISTS
(SELECT*
WHERESNO=STUDENT.SNOANDCNO='
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
使用存在量词EXISTS后,若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值。
5实验结果及总结
1.SELECTSNO,SNAMEFROM这些的大小写随意,但是"
2.查询结果中有许多重复行,若想去掉重复,则指定DISTINCT。
3.(百分号)代表任意长度(长度可以为0)的字符串。
4.desc是降序,ASC是升序,系统默认升序。
5.求解相关子查询不能像求解不相关子查询那样一次将子查询求解出来,然后求解父查询。
6.用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高。
7.带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。