一、实验目的与要求
1. 熟练掌握用INSERT、UPDATE、DELETE语句进行数据更新。
2. 熟练使用SELECT语句执行各种查询操作;
3. 掌握对查询结果进行排序、统计(利用函数)、分组的方法;
4. 掌握多表连接的方法,理解外连接和内连接的区别;
5. 了解嵌套查询的处理过程,特别是相关子查询的执行过程。
- 实验内容与步骤
1. 用INSERT语句向表中插入数据。
在查询分析器窗体下完成教材P115例1、2、3、4,分别运行,观察结果。
2. 用INSERT语句向学校数据库中的Student, Course, SC表中插入数据,注意保存SQL语句。
3. 用INSERT语句向供应数据库中的S, P, J, SPJ表中插入数据,注意保存SQL语句。
4. 用UPDATE语句更改表中数据。
在查询分析器窗体下完成教材P117例5、6、7,分别运行,观察结果。
5. 用DELETE语句删除表中数据。
在查询分析器窗体下完成教材P118例8、9、10,分别运行,观察结果。
1. 用SELECT语句完成单表查询:
(1) 查询全体学生的详细记录(*);
(2) 查询选修了课的学生的学号(DISTINCT);
(3) 查询考试成绩不及格的学生的学号(<);
(4) 查信息系(IS)、数学系(MA)和计算机科学系(CS)的学生的姓名和性别(IN);
(5) 查所有姓刘的学生的姓名、学号和性别(%);
(6) 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列(ORDER BY);
(7) 查询学习1号课程的学生最高分数(MAX);
(8) 查询各个课程号与相应的选课人数(COUNT,GROUP BY);
(9) 在STUDENT表增加入学时间字段SCOME,并修改学生的入学时间。然后,查找入学时间 为2012年的学生记录。
(10) 查询1号课程成绩为前三名的学生学号及成绩(TOP,ORDER BY)。
2. 用SELECT语句完成连接查询:
(1) 查询选修2号课程且成绩在90分以上的学生的全部信息;
(2) 查询每个学生的学号及其选修的课程名其及成绩;
3. 用SELECT语句完成子查询:
不相关子查询
(1) 查询与“刘晨”在同一个系学习的学生(IN或=);
(2) 查询其他系中比信息系某一学生年龄小的学生姓名和年龄(ANY);
(3) 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄(ALL);
(4) 查询选修1号课程的学生姓名
(5) 查询出每门课都大于等于60分的学生姓名(MIN)
相关子查询
(6) 查询没有选修1号课程的学生姓名(NOT EXISTS);
(7) 查询选修了全部课程的学生姓名(NOT EXISTS)。
(8) 查询至少选修了学生95002选修的全部课程的学生学号(NOT EXISTS)。
(9) 查询每门课程的最高分对应的选课记录:学号,课程号,成绩。
4.综合练习
(1) 查找既选修了1号课程,又选修了2号课程的学生学号和姓名。
(2) 查询出每门课都大于80分的学生姓名。(注意:不能把未选课的学生放入结果集)
(3) 查询每门课程的最高分对应的选课记录:学号,课程号,成绩。
(4) 显示学生成绩的等级mark(<60为C,>=90为A,其余为B),查询结果为: (sno,cno,score ,mark)(学习使用带有 CASE 搜索表达式的 SELECT 语句)
(5) 查询学生每门课程的成绩,显示结果为每位同学的各门成绩显示在同一行:
(姓名,数学,数据库,数据结构)
实验时,要验证以下问题
1. 如何处理空值(NULL)?
(1) 按升/降序对结果排序(ORDER BY)时,空值排在什么位置?
(2) 如果GROUP BY的属性上有空值,会有什么结果?
(3) 求平均值(AVG函数)的列如果有空值,怎么处理?COUNT函数呢?
(4) 集函数的参数为*或列名,查询结果有何不同?
(5) 在进行等值连接,左外连接,右外连接,全外连接,内连接等,连接属性上有空值,对空值如何处理?
2. 如何获得“入学时间”字段中年的信息?
3. 了解嵌套查询的执行过程。
三、实验结果与问题
执行了实验内容1的实验结果;
执行了实验内容3的结果
(Ⅱ)思考问题
1. 如何处理空值(NULL)?
(1) 按升/降序对结果排序(ORDER BY)时,空值排在什么位置?
答:按升序排,含空值的元组最后显示;按降序排,含空值的元组最先显示
(2) 如果GROUP BY的属性上有空值,会有什么结果?
答:GROUP BY只对非空值进行分组,同时把所有NULL看成一个整体,出现一次。
(3) 求平均值(AVG函数)的列如果有空值,怎么处理?COUNT函数呢?
答:AVG会跳过空值只处理非空值,COUNT对元组计数,取空不影响统计的结果。
(4) 集函数的参数为*或列名,查询结果有何不同?
答:参数为*查询全部列;确定列名后可以查询指定列,可以规定顺序。
(5) 在进行等值连接,左外连接,右外连接,全外连接,内连接等,连接属性上有空值,对空值如何处理?
答:等值连接和内连接会保留空值,外连接会根据匹配相等保留含NULL的数据或删除含NULL的一整行
2. 如何获得“入学时间”字段中年的信息?
3. 了解嵌套查询的执行过程。
将一个查询块嵌入到另一个查询块的WHERE子句或HAVING短语中的条件中的查询称为嵌套查询。根据子查询的查询条件是否依赖于父查询分为相关子查询和不相关子查询。
四、问题和解决方法