实验五
实验目的:
掌握数据库表之间的永久关联及参照完整性的设置;掌握使用表设计器设计查询文件;掌握使用SELECT语句设计查询。
实验内容(按顺序做,第3题中的单号题写到实验报告中。注意将所有题存到自己的盘上)
1. 设置自己的文件夹为默认文件夹。打开“学生管理”项目。
2. 创建数据库表之间的永久关联及设置参照完整性。
(1)打开“学生-课程”数据库设计器,用鼠标左键拖动学生表中的主索引xh到选课表的普通索引xh(注意这两个索引都应是按学号字段进行排序的索引),两个表之间出现一条连线,该连线即为两表间按学号相等的一个的永久关联。
(2)按上面同样的方法创建课程表和选课表之间的按课程号相等的永久关联。
(3)设置如下参照完整性:
使用“数据库”菜单中的“编辑参照完整性”或右单击永久关系连线选“编辑参照完整性”,打开“参照完整性生成器”
要求更新学生表中的某一学号时选课表中的相同学号也相应更新。
(提示:将学生与选课间的“更新规则”设为“级联”)
要求删除课程表中的某门课时选课表中该课的有关记录也相应删除。
(提示:将课程与选课间的“删除规则”设为“级联”)
③要求在选课表中插入一条学生的选课记录时,如果学生表中没有该学生或课程表中没有该课则禁止插入。
(提示:将学生与选课间的“插入规则”设为“限制”)
(4)测试(3)中的设置,理解参照完整性的含义。
3. 在项目中设计如下查询,单号题用select命令(写到程序中),双号题用查询设计器:
注意:查询前先打开“学生-课程”数据库,并且设为当前库
(1)创建程序文件Q1,用select命令查询“计算机”系的学生的学号、姓名、和出生日期,结果按学号升序排。 运行程序查看运行结果。
使用设计器设计:
添加表:学生表
“字段”选项卡:学号、姓名、出生日期
“筛选”选项卡:所在系=’计算机’
“排序”选项卡:学号升序
使用命令:
SELECT 学号,姓名,出生日期;
FROM学生;
WHERE所在系 = "计算机";
ORDER BY学号
查询结果如下:
(2)创建查询文件Q2,查询“计算机”系的学生的姓名、性别、年龄,结果按年龄升序排。 运行查询文件查看运行结果。
使用设计器设计:
添加表:学生表
“字段”选项卡:姓名、性别、YEAR(DATE())-YEAR(学生.出生日期) AS 年龄
“筛选”选项卡:所在系=’计算机’
“排序依据”选项卡:YEAR(DATE())-YEAR(学生.出生日期) AS 年龄
使用命令:
SELECT姓名,性别, YEAR(DATE())-YEAR(学生.出生日期) AS 年龄;
FROM学生;
ORDER BY 3
查询结果如下:
(3)创建程序文件Q3,用select命令查询都有哪些系,要求系不能重复。 运行程序查看运行结果。
使用设计器设计:
添加表:学生表
“字段”选项卡:所在系
“杂项”选项卡:选中“无重复记录”复选框
使用命令:
SELECT DISTINCT 所在系 FROM学生
查询结果如下:
(4)创建查询文件Q4,查询选了“001”号课的学生的姓名和成绩,结果按成绩降序排,结果放到表“成绩001号课”表中。 运行查询文件,将存放查询结果的文件添加到项目的自由表中,浏览该自由表从而查看查询结果。
使用设计器设计:
添加表:学生表、选课表
“字段”选项卡:姓名、成绩
“联接”选项卡:inner join 学生.学号=选课.学号
“筛选”选项卡:课程号=’001’
“排序依据”选项卡:成绩降序
“查询去向”:表“成绩001号课”
使用命令:
SELECT姓名,成绩;
FROM学生 INNER JOIN选课 ON 学生.学号 = 选课.学号;
WHERE课程号 = "001";
ORDER BY成绩 DESC
INTO TABLE 成绩001号课
查询结果如下:
(5)创建程序文件Q5,用select命令查询“计算机”系学生选了“001”号课学生的姓名、成绩,结果按成绩降序排。 运行程序查看运行结果。
使用设计器设计:
添加表:学生表、选课表
“字段”选项卡:姓名、成绩
“联接”选项卡:inner join 学生.学号=选课.学号
“筛选”选项卡:所在系=’计算机’ and课程号=’001’
“排序依据”选项卡:成绩降序
使用命令:
SELECT姓名,成绩;
FROM 学生 INNER JOIN选课 ON 学生.学号 = 选课.学号;
WHERE所在系 = "计算机" AND课程号 = "001";
ORDER BY成绩 DESC
查询结果如下:
(6)创建查询文件Q6,查询成绩在80及80分以上的学生的姓名、课程名和成绩,输出时先按课程名升序排,课程名一样的再按成绩降序排。 运行查询文件查看运行结果。
使用设计器设计:
添加表:学生表、选课表、课程表
“字段”选项卡:姓名、课程名、成绩
“联接”选项卡:inner join 学生.学号=选课.学号
inner join 课程.课程号=选课.课程号
“筛选”选项卡:成绩>=80
“排序依据”选项卡:课程名升序、成绩降序
使用命令:
SELECT姓名,课程名,成绩;
FROM学生 INNER JOIN选课 INNER JOIN课程 ;
ON 课程.课程号=选课.课程号 ON 学生.学号=选课.学号;
WHERE成绩 >= 80;
ORDER BY课程名,成绩 DESC
查询结果如下:
(7)创建程序文件Q7,用select命令查询平均成绩大于等于80的学生的学号、姓名平均成绩。 运行程序查看运行结果。
使用设计器设计:
添加表:学生表、选课表
“字段”选项卡:学号、姓名、AVG(选课.成绩) AS 平均成绩
“联接”选项卡:inner join 学生.学号=选课.学号
“分组依据”选项卡:学号
“满足条件”(筛选组):平均成绩>=80
“排序依据”选项卡:学号升序
使用命令:
SELECT 学生.学号, 姓名, AVG(选课.成绩) AS 平均成绩;
FROM 学生 INNER JOIN选课 ON 学生.学号 = 选课.学号;
GROUP BY 学生.学号;
HAVING 平均成绩=>80
查询结果如下:
(8)创建查询文件Q8,查询各科成绩的最高分。结果包括课程名和最高分两列。 运行查询文件查看运行结果。
使用设计器设计:
添加表:课程表、选课表
“字段”选项卡:课程名、MAX(选课.成绩) AS 最高分
“联接”选项卡:inner join 课程.课程号=选课.课程号
“分组依据”选项卡:课程名
使用命令:
SELECT课程名, MAX(选课.成绩) AS 最高分;
FROM课程 INNER JOIN选课 ON课程.课程号 = 选课.课程号;
GROUP BY 课程.课程名
查询结果如下:
(9)创建程序文件Q9,用select命令查询选课人数多于10人的课程名和选课人数。 运行程序查看运行结果。
使用设计器设计:
添加表:课程表、选课表
“字段”选项卡:课程名、COUNT(选课.学号) AS 选课人数
“联接”选项卡:inner join 课程.课程号=选课.课程号
“分组依据”选项卡:课程名
“满足条件”(筛选组):选课人数>=10
使用命令:
SELECT 选课.课程名, COUNT(选课.学号) AS 选课人数;
FROM 课程 INNER JOIN选课 ON 课程.课程号 = 选课.课程号;
GROUP BY 选课.课程名;
HAVING 选课人数=>10
查询结果如下:
(10)创建查询文件Q10,查询数学成绩前5名的学生的姓名和数学成绩。 运行查询文件查看运行结果。
使用设计器设计:
添加表:学生表、选课表、课程表
“字段”选项卡:姓名、成绩
“联接”选项卡:inner join 学生.学号=选课.学号
inner join 课程.课程号=选课.课程号
“筛选”选项卡:课程名=’数学’
“排序依据”选项卡:成绩降序
“杂项”:不选“全部”复选框,“记录个数”改成5
使用命令:
SELECT TOP 5 姓名,成绩;
FROM学生 INNER JOIN选课 INNER JOIN课程 ;
ON 课程.课程号 = 选课.课程号 ON 学生.学号 = 选课.学号;
WHERE 课程名 = "数学";
ORDER BY 成绩 DESC
查询结果如下:
4. 打开“客户管理”项目,打开“订货管理”数据库,在该项目中使用查询设计器设计如下查询:
习题13(271页)第三题的1、2、3、4、5题。
注意:查询前先打开“订货管理”数据库并设为当前库。
(1) 查询客户名为“三益贸易公司”的订购单明细,结果先按“订单号”升序排,同一订单的再按“单价”降序排。结果存到results14_1中。
使用设计器:
添加表:customer、order_list、order_detail
“字段”选项卡:order_detail表中的所有字段
“联接”选项卡:inner join customer.khh=order_list.khh
Inner join order_list.ddh= order_detail.ddh
“筛选”选项卡:customer.khm=’ 益贸易公司’
“排序依据”选项卡:ddh升序、dj降序
“分组依据”选项卡:
“杂项”选项卡:
“查询去向”:表“results14_1”
使用命令:
SELECT Order_detail.*;
FROM customer INNER JOIN order_list INNER JOIN order_detail ;
ON Order_list.ddh = Order_detail.ddh ON Customer.khh = Order_list.khh;
WHERE Customer.khm = "三益贸易公司";
ORDER BY Order_detail.ddh, Order_detail.dj DESC;