数据库查询SQL 实验报告.docx

上传人:b****5 文档编号:5614153 上传时间:2022-12-29 格式:DOCX 页数:16 大小:189.26KB
下载 相关 举报
数据库查询SQL 实验报告.docx_第1页
第1页 / 共16页
数据库查询SQL 实验报告.docx_第2页
第2页 / 共16页
数据库查询SQL 实验报告.docx_第3页
第3页 / 共16页
数据库查询SQL 实验报告.docx_第4页
第4页 / 共16页
数据库查询SQL 实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据库查询SQL 实验报告.docx

《数据库查询SQL 实验报告.docx》由会员分享,可在线阅读,更多相关《数据库查询SQL 实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

数据库查询SQL 实验报告.docx

数据库查询SQL实验报告

 

实验报告

 

课程名称:

数据库系统概论

学院:

工程学院

专业:

年级:

班级:

姓名:

学号:

指导教师:

 

年月日

教务处制

实验名称:

数据库查询1

时间:

2015-11-26

地点:

三教205机房

班组:

教师评语

成绩

教师签名

实验报告

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这些的大小写随意,但是"S-C"."STUDENT"必须是指定大小写,要是改变大小写则可以用"S-C".student

加分号,引号会自动变红色.在SQL语句中用/*注释内容*/注释。

例3.17查询全体学生的姓名、学号、所在系

SELECTSNAME,SNO,SDEPTFROM"S-C"."STUDENT"

例3.18查询全体学生的详细记录

SELECT*FROM"S-C"."STUDENT"

例3.19查询全体学生的姓名及其出生年份

SELECTSNAME,2014-SageFROM"S-C"."STUDENT"

注意:

因为2014-Sage在生成表格的时候出现了“?

”无法显示,改错方法就是在2014-Sage后面直接加“空格键和别名”如在下题给它取别名W

SELECTSNAME,2014-SageWFROM"S-C"."STUDENT"

例3.20查询全体学生的姓名、出生年份和所在院系,要求用小写字母表示系名

SELECTSNAME,'YEAROFBIRTH:

',2014-SAGE,LOWER(SDEPT)

FROM"S-C"."STUDENT"

指定别名:

SELECTSNAMEname,'YEAROFBIRTH:

'birth,2014-SAGEbirthday,LOWER(SDEPT)department

FROM"S-C"."STUDENT"

例3.21查询选修了课程的学生学号

SELECTSNOFROM"S-C"."SC";

注意:

查询结果中有许多重复行,若想去掉重复,则指定DISTINCT。

若没有指定,则默认为all。

SELECTSNOFROM"S-C"."SC";等价于SELECTallSNOFROM"S-C"."SC";

SELECTDistinctSNO

FROM"S-C"."SC";

例3.22查询计算机科学系全体学生的名单

SELECTSNAME

FROM"S-C"."STUDENT"

WHERESDEPT='CS';

例3.23查询所有年龄在20岁以下的学生姓名及其年龄

SELECTSNAME,SAGe

FROM"S-C"."STUDENT"

WHEREsage<20;

例3.24查询考试成绩不及格的学生学号

SELECTDISTINCTsnoFROM"S-C"."SC"WHEREgrade<60;

这里使用了DISTINCT短语,当一个学生有多门课程不及格,他的学号也只列一次。

这里表明没有学生不及格。

例3.25查询年龄在20-23岁之间的学生姓名、系别和年龄

SELECTSNAME,SDEPT,SAGEFROM"S-C"."STUDENT"WHEREsageBETWEEN20AND23;

例3.26查询年龄不在20-23岁之间的学生姓名、系别和年龄

SELECTSNAME,SDEPT,SAGEFROM"S-C"."STUDENT"WHEREsageNOTBETWEEN20AND23;

例3.27查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别

SELECTSNAME,Ssex

FROM"S-C"."STUDENT"

WHEREsdeptin('CS','MA','IS');

 

例3.28查询既不是计算机科学系(CS)、数学系(MA)也不是信息系(IS)学生的姓名和性别

SELECTSNAME,Ssex

FROM"S-C"."STUDENT"

WHEREsdeptnotin('CS','MA','IS');

例3.29查询学号为200215121的学生的详细情况

SELECT*FROM"S-C"."STUDENT"WHERESNOLIKE'200215121';

例3.30查询所有姓刘的学生的姓名、学号和性别

SELECTsname,sno,ssexFROM"S-C"."STUDENT"wheresnamelike'刘%';

注意:

(百分号)代表任意长度(长度可以为0)的字符串。

例3.31查询姓“欧阳”且全名为三个汉字的的学生的姓名

SELECTsnameFROM"S-C"."STUDENT"wheresnamelike'欧阳-';

注意:

_(下划线)代表任意单个字符

例3.32查询名字中第二个字为“阳”的学生的姓名和学号

SELECTsname,sno

FROM"S-C"."STUDENT"

wheresnamelike'-阳%';

例3.33查询所有不姓刘的学生的姓名、学号和性别

SELECTsname,sno,ssex

FROM"S-C"."STUDENT"

wheresnamenotlike'刘%';

例3.34查询DB\_DESIGN课程的课程号和学分

SELECTcno,ccredit

FROM"S-C"."COURSE"

whereCnamelike'DB\_DESIGN'ESCAPE'\';

SELECTcno,ccredit

FROM"S-C"."COURSE"

whereCname='数据库'

例3.35查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况

SELECT*

FROM"S-C"."COURSE"

whereCnamelike'DB\_%i__'ESCAPE'\';

例3.36某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。

查询缺少成绩的学生学号和相应的课程号。

SELECTsno,cno

FROM"S-C"."SC"

wheregradeisnull;

例3.37查询所以有成绩学生的学号和课程号

SELECTsno,cno

FROM"S-C"."SC"

wheregradeisNOTnull;

例3.38查询计算机科学系年龄在20岁以下的学生姓名

SELECTsname

FROM"S-C"."STUDENT"

whereSDEPT='CS'ANDSAGE<20;

例3.39查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。

SELECTsno,grade

FROM"S-C"."SC"

wherecno='3'

orderbygradedesc;

注意:

desc是降序,ASC是升序,系统默认升序。

SELECTsno,grade

FROM"S-C"."SC"

wherecno='3'

orderbygrade;

例3.40查询全体学生情况,查询结果按所在系的系号升序排列;同一系的学生按年龄降序排列。

SELECT*

FROM"S-C"."STUDENT"

orderbysdept,sagedesc;

例3.41查询学生总人数

SELECTCOUNT(*)

FROM"S-C"."STUDENT";

例3.42查询选修了课程的学生人数

SELECTCOUNT(DISTINCTSNO)

FROM"S-C"."SC";

例3.43查询选修了1号课程的学生平均成绩

SELECTAVG(GRADE)

FROM"S-C"."SC"

WHERECNO='1';

例3.44查询选修了2号课程的学生最高分数

SELECTMAX(GRADE)

FROM"S-C"."SC"

WHERECno='2';

例3.45查询学生200215012选修课程的总学分数

SELECTSUM(CCREDIT)FROM"S-C".SC,"S-C".COURSEWHERESNO='200215012'ANDSC.CNO=COURSE.CNO;

SELECTSUM(CCREDIT)FROM"S-C".SC,"S-C".COURSEWHERESNO='200215121'ANDSC.CNO=COURSE.CNO;

例3.46查询各个课程号及其选课人数

SELECTCNO,COUNT(SNO)FROM"S-C".SCGROUPBYCNO;

例3.47查询选修了两门以上课程的学生学号

SELECTSNOFROM"S-C".SCGROUPBYSNOHAVINGCOUNT(*)>2;

 

例3.48查询平均成绩大于等于80分的学生学号和平均成绩

SELECTSNO,AVG(GRADE)FROM"S-C".SCWHEREAVG(GRADE)>=80GROUPBYSNO;

服务器消息:

[KingbaseESServer]ERROR:

在WHERE子句中不能使用聚集函数

SELECTSNO,AVG(GRADE)FROM"S-C".SCGROUPBYSNOHAVINGAVG(GRADE)>=80;

例3.49查询每个学生及其选修课程的情况

SELECTSTUDENT.*,SC.*FROM"S-C".STUDENT,"S-C".SCWHERESTUDENT.SNO=SC.SNO;

例3.50对例3.49用自然连接完成

SELECTSTUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE

FROM"S-C".STUDENT,"S-C".SCWHERESTUDENT.SNO=SC.SNO;

例3.51查询选修2号课程且成绩在90分以上的所有学生的学号和姓名

SELECTSTUDENT.sno,snameFROM"S-C".STUDENT,"S-C".SCWHERESTUDENT.SNO=SC.SNOANDSC.CNO='2'ANDSC.GRADE>=90;

例3.52查询每一门课的间接先修课(即先修课的先修课)

SELECTFIRST.CNO,SECOND.CPNO

FROM"S-C".COURSEFIRST,"S-C".COURSESECOND

WHEREFIRST.CPNO=SECOND.CNO;

例3.53外连接(每个学生的基本情况及其选课情况)

SELECTSTUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE

FROM"S-C".STUDENTleftouterjoin"S-C".SCon(student.sno=sc.sno);

/*也可以使用USING来去掉结果中重复的值*/

SELECTSTUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADEFROM"S-C".STUDENTleftouterjoin"S-C".SCUSING(SNO);

例3.54查询每个学生的学号、姓名、选修的课程名及其成绩

SELECTSTUDENT.SNO,SNAME,CNAME,GRADEFROM"S-C".STUDENT,"S-C".SC,"S-C".COURSEWHERESTUDENT.SNO=SC.SNOANDSC.CNO=COURSE.CNO;

例3.55查询与“刘晨”在同一个系学习的学生

分步查询

SELECTSDEPTFROM"S-C".STUDENTWHERESNAME='刘晨';/*确定“刘晨”所在系名*/

SELECTSNO,SNAME,SDEPTFROM"S-C".STUDENTWHERESDEPT='CS';查询所有在CS系的学生

法1.嵌套查询SELECTSNO,SNAME,SDEPTFROM"S-C".STUDENTWHERESDEPTin(SELECTSDEPTFROM"S-C".STUDENTWHERESNAME='刘晨');

法2.自身连接SELECTS1.SNO,S1.SNAME,S1.SDEPTFROM"S-C".STUDENTS1,"S-C".STUDENTS2WHERES1.SDEPT=S2.SDEPTANDS2.SNAME='刘晨';

法3.带有比较运算符的子查询SELECTSNO,SNAME,SDEPTFROM"S-C".STUDENTWHERESDEPT=(SELECTSDEPTFROM"S-C".STUDENTWHERESNAME='刘晨');

例3.56查询选修了课程名为“信息系统”的学生学号和姓名

SELECTSNO,SNAME/*3.最后在student关系中查询sno和sname*/

FROM"S-C".STUDENT

WHERESNOIN

(SELECTSNO/*2.然后在SC关系中找出选修了3号课程的学生学号*/

FROM"S-C".SC

WHERECNOIN

(SELECTCNO/*1.首先在course关系中找出'信息系统'的课程,结果为3号*/

FROM"S-C".COURSE

WHERECNAME='信息系统'

);

连接查询

SELECTSTUDENT.SNO,SNAMEFROM"S-C".STUDENT,"S-C".SC,"S-C".COURSE

WHERESTUDENT.SNO=SC.SNOAND

SC.CNO=COURSE.CNOAND

COURSE.CNAME='信息系统';

例3.57查询每个学生超过他自己选修课程平均成绩的课程号

SELECTSNO,CNOFROM"S-C".SCx

WHEREGrade>=(selectAVG(Grade)

FROM"S-C".SCy

WHEREy.sno=x.sno);

注意:

x是SC的别名,这题是相关子查询。

求解相关子查询不能像求解不相关子查询那样一次将子查询求解出来,然后求解父查询。

内层查询由于与外层查询有关,因此必须反复求值。

例3.58查询非计算机系中比计算机科学系任意一个学生年龄小的学生姓名和年龄

SELECTSName,sageFROM"S-C".STUDENT

WHEREsage

FROM"S-C".student

WHEREsdept='CS')

ANDSDEPT<>'CS';

聚集函数求法:

SELECTSName,sageFROM"S-C".STUDENT

WHEREsage<(selectMAX(sage)

FROM"S-C".student

WHEREsdept='CS')

ANDSDEPT<>'CS';

例3.59查询非计算机系中比计算机科学系所有学生年龄都小的学生姓名和年龄

SELECTSName,sage

FROM"S-C".STUDENT

WHEREsage

(selectsage

FROM"S-C".student

WHEREsdept='CS')

ANDSDEPT<>'CS';

或者用聚集函数:

SELECTSName,sage

FROM"S-C".STUDENT

WHEREsage<

(selectmin(sage)

FROM"S-C".student

WHEREsdept='CS')

ANDSDEPT<>'CS';

注意:

事实上,用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高。

例3.60查询所有选修了1号课程的学生姓名

SELECTSNAME

FROM"S-C"."STUDENT"

WHEREEXISTS

(SELECT*

FROM"S-C".SC

WHERESNO=STUDENT.SNOANDCNO='1');

注意:

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

使用存在量词EXISTS后,若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值。

 

5实验结果及总结

1.SELECTSNO,SNAMEFROM这些的大小写随意,但是"S-C"."STUDENT"必须是指定大小写,要是改变大小写则可以用"S-C".student

加分号,引号会自动变红色.在SQL语句中用/*注释内容*/注释。

2.查询结果中有许多重复行,若想去掉重复,则指定DISTINCT。

若没有指定,则默认为all。

3.(百分号)代表任意长度(长度可以为0)的字符串。

_(下划线)代表任意单个字符

4.desc是降序,ASC是升序,系统默认升序。

5.求解相关子查询不能像求解不相关子查询那样一次将子查询求解出来,然后求解父查询。

内层查询由于与外层查询有关,因此必须反复求值。

6.用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高。

7.带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

使用存在量词EXISTS后,若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1