实验5 SQL语言之高级查询
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五高级查询
【实验目的与要求】
1、熟练掌握IN子查询
2、熟练掌握比较子查询(尤其要注意ANY、ALL谓词如何用集函数代替)
3、熟练掌握EXISTS子查询(尤其是如何将全称量词和逻辑蕴含用EXISTS谓词代替)
4、熟练掌握复杂查询的select语句
【实验准备】
1.准备好测试数据
2.熟悉多表查询与嵌套查询的用法。
【实验内容】
5.1.准备工作
1.创建测试用数据库XSGL,并在其中创建三个表
本实验需用到student、course和SC表,其结构和约束如下:
Student表结构及其约束为:
表5-1 student表结构和约束
列名称类型宽度允许空值缺省值主键说明
Sno char 8 否是学号
Sname varchar 8 否学生姓名
Sex char 2 否男性别
Birth datetime 否出生年月Classno char 3 否班级号Entrance_date datetime 否入学时间Home_addr varchar 40 是家庭地址
Course表结构及其约束为:
表5-2 course表结构和约束
列名称类型宽度允许空值缺省值主键说明
cno Char 3 否是课程号
Cname varchar 20 否课程名称Total_perior int 是总学时credit int 是学分
SC表结构及其约束为:
表5-3 SC表结构和约束
列名称类型宽度允许空值缺省值主键外键说明
sno Char 8 否是学号,参照student表
cno char 3 否是课程号,参照course表
grade int 是否成绩其中成绩为百分制。
2.对表添加、修改、删除数据
向student表中插入如下数据:
表5-4 student表
Sno sname sex birth classno Entrance_date Home_addr sdept postcode 20050001 张虹男1984/09/011 051 2005/09/01 南京CS 200413 20050002 林红女1983/11/12 051 2005/09/01 北京CS 100010 20050003 赵青男1982/05/11 051 2005/09/01 上海MA 200013
向course表中插入数据:
表5-5 course表
cno Cname Total_perior credit
001 高数68 3
002 C语言程序设计75 4
003 JAVA语言程序设计68 3
向SC表中插入数据:
表5-6 SC表
Sno Cno grade
20050001 001 89
20050001 002 78
20050001 003 89
20050002 002 60
20050003 001 80
为达到更好的测试效果,请自行向数据库表中添加其它数据,使表中数据量达10条以
上,并使每个字段值表现出多样性。
5.2.复杂查询
(1)查询比“林红”年纪大的男学生信息。
SQL语句:
select *
from Student
where birth<
(
select birth
from Student
where Sname='林虹'
)and Sex='男';
(2)检索所有学生的选课信息。
SQL语句:
select Sno,Sname,Cno,Cname
from Student,Course
(3)查询已选课学生的学号、姓名、课程名、成绩。
连接查询T—SQL语句:
select distinct Student.Sno,Sname,Cname,grade
from Student,Course,SC
where SC.Sno=Student.Sno and o=o
(4)查询选修了“C语言程序设计”的学生的学号和姓名。
SQL语句:
select distinct Student.Sno,Sname
from Student,Course,SC
where ame='C语言程序设计'
(5)查询与“张虹”在同一个班级的学生学号、姓名、家庭住址。
(子查询)SQL语句:
(select classno
from Student
where Sname='张虹'
);
连接查询SQL语句:
select distinct Student.Sno,Sname,Home_addr
from Student,Course,SC
where classno=
(select classno
from Student
where Sname='张虹'
);
(6)查询其他班级中比“051”班任一学生年龄大的学生的学号、姓名。
带有ANY或ALL谓词的子查询语句:
select Sno,Sname
from Student
where birth< any(select birth
from Student
where classno='051')