实验二——SQL语句(6课时) 一、 实验目的 1. 熟悉SQL的数据查询语言,能使用SQL进行单表查询、连接查询、嵌套查询、集合查询和统计查询,能理解空值的处理; 2. 熟悉数据库的数据更新操作,能使用SQL语句对数据库进行数据的插入、更新、删除操作; 3. 熟悉SQL支持的有关视图的操作,能创建、查询及取消视图; 4. 了解NULL在数据库中的特殊含义,掌握使用SQL进行与空值相关的操作;
二、 实验预习内容 在认真阅读教材及实验指导书【实验1.2 数据查询】、【实验1.3 数据更新】、【实验1.4 视图】和【实验1.6 空值和空集的处理】的基础上,上机前请预习以下内容,并在空白处填写相应的步骤或命令。 1. 使用SCHOOL数据库,在SQL SERVER 2000 的查询分析器中使用SQL语言完成以下操作。请在空白处填写相应的SQL命令。 1) 查询年级为2001的所有学生的名称,按编号顺序排列; select sname from STUDENTS WHERE grade='2001'
2) 查询所有课程名称中含有data的课程编号; SELECT cid FROM COURSES WHERE cname like '%data%'
3) 统计所有老师的平均工资; SELECT AVG(salary) from TEACHERS
4) 查询至少选了3门课的学生编号; SELECT sid FROM CHOICES group by sid having count(*)>=3
5) 查询学号为80009026的学生的姓名、所选课名及成绩; select courses.cname,students.sname,choices.score from (STUDENTS JOIN CHOICES ON STUDENTS.sid=CHOICES.sid) join COURSES ON COURSES.cid=CHOICES.cid where CHOICES.sid='80009026'
6) 查询没有学生选的课程编号; select cid from courses except select cid from choices
7) 查询既选了C++又选了Java课程的学生编号; select sid from choices where cid = (select cid from courses where cname = 'C++') and sid in (select sid from choices where cid= (select cid from courses where cname = 'Java'))
8) 查询选了C++但没选Java课程的学生编号;
select sid from choices where cid = (select cid from courses where cname = 'C++') and sid not in (select sid from choices where cid= (select cid from courses where cname = 'Java'))
9) 向STUDENTS表中插入“LiMing”的个人信息(编号:700045678,名字:LiMing,Email:[email protected],年级:1992);
insert into students values('700045678','LiMing','[email protected]',1992)
10) 将“LiMing”的年级改为2002; update students set grade=2002 where sname='LiMing
11) 删除所有选了Java课程的学生选课记录; delete from choices where cid=(select cid from courses where cname='Java')
12) 求出每门课的课程号、选课人数,结果存入数据库表T1中。
create table T1 (cid char(10) primary key, number int ) insert into t1 select cid,count(distinct sid) from choices group by cid
13) 查询所有选课记录的成绩并换算为五分制(注意NULL的情况); select score/20 Score from choices
14) 查询成绩小于60的选课记录,统计总数、平均分、最大值和最小值(注意查询结果中NULL的情况);
select distinct count(*) 总数, avg(score) 平均值, max(score)最大值, min(score)最小值 from choices where score<60
15) 按成绩顺序排序显示CHOICES表中所有记录。(使用ORDER BY排序,注意NULL的情况); select * from choices order by score
16) 创建视图V1,显示学生姓名、所选课名称、任课教师名; create view v1 (sname,cname,tname) as select sname,cname,tname from teachers,choices ,students,courses where choices.cid=courses.cid and choices.sid=students.sid and choices.tid=teachers.tid
17) 取消V1视图; drop view v1
2. 使用STC数据库,在SQL SERVER 2000 的查询分析器中使用SQL语言完成以下操作。请在空白处填写相应的SQL命令或其它内容。 1) 创建视图V2,显示计算机(CS)系学生信息;(结合下面的b)小题,V2视图创建2次,分别使用/不使用WITH CHECK OPTION选项)
2) 插入元组(99999,张三,20岁,男,PH)到V2中,运行结果如何?(观察WITH CHECK OPTION对结果的影响);
3) 在V2基础上,查询所有计算机系女生信息; select * from V2 where ssex='女' 3. 结束本次实验
三、 实验课后训练 1. 掌握SQL SERVER中流控制语句及其它常用编程语句; 1) 使用查询分析器,编写代码,输出乘法口诀表。 2. 自行练习实验指导书P24【实验1.2 数据查询】1.2.5自我实践部分; 3. 自行练习实验指导书P30【实验1.3 数据更新】1.3.5自我实践部分; 4. 自行练习实验指导书P36【实验1.4 视图】1.4.5自我实践部分; 5. 自行练习实验指导书P49【实验1.6 空值和空集的处理】1.6.5自我实践部分; 四、 实验报告 1. SQL SERVER中变量声明的命令是什么?输出命令是什么? Declare @variable_name out 2. SQL SERVER中实现分支和循环的语句分别是什么? while (条件--只能是表达式) 语句或语句块 [break]--强制退出 多分支语句语法 Case when 条件1 then 结果1 when 条件2 then 结果2 [else 其他结果] end
3. 在SQL SERVER里使用ORDER BY排序时,NULL值如何处理?使用GROUP BY分组时,NULL值又如何处理的? 在使用 ORDER BY 进行排序时,有 ASC(升序)和 DESC(降序)两种方式。无论采用 哪种方式,NULL 值总被当作最小值处理。即在按升序排列时,取空值的元组将最先显示, 按降序排时,取空值的元组将会最后显示。 使用 GROUP BY 进行排序,取空值的项不是被忽略,而是将 NULL 看成一个取值,在处 理的时候把所有取空值的项都看成一样,因而形成一个分组。 4. 实验总结(实验过程中出现的问题、解决方法、结果如何或其它) 有好多次运行都是有检查完成但是执行错误,经检查才知道是上面的数据库默认是 master, 而不是要执行的数据库。由于粗心导致的字母拼写错误,导致执行结果出错。不会使用嵌套 语句,经过分析书上的程序段,略微懂了一点。向表中插入记录,应该用 insert into 表名 values(列属性).创建视图用 create view (视图名) as from 表名 。经过试验验证,明白 with check option 可以自动筛选不符合条件的记录 |