数据库SQL查询例题与解答
1 实验目的
1.熟悉数据库的交互式SQL工具。
2.熟悉通过SQL对数据库进行操作。
3.完成作业的上机练习。
2 实验工具sql server
利用Sql server及其交互式查询工具-查询分析器来熟悉SQL。
3 实验内容和要求
1)实验内容:
创建数据库boat,包括Sailors,Boats,Reserves三个表,表结构如下:
Sailors(sid: integer, sname: string, rating: integer, age: real)
船员(船员编号,,级别,年龄)
Boats(bid: integer, bname: string, color: string) 船(船编号,名称,颜色)
Reserves(sid: integer, bid: integer, day: date)
租赁(船员编号,船编号,日期)
(注:下划线表示主键),并插入一定数据。
2)完成下列要求:
(1)查询所有船员的信息
(2)查询所有姓王的船员的信息
(3)查询租用过103号船的船员姓名
(4)查找租用过船只的船员编号
(5)查找rating>7且年龄>25的水手编号
(6)查找租用过红船和绿船的水手名字
(7)查找租用过红船或绿船的水手编号
(8)查找最年长的水手的年龄和名字
(9)在18岁以上水手中,对于每个rating级别中最少有两个水手以上的组中最年轻水手的年龄
(10)查找每条红色船只被租用的次数
(11)把30岁以上船员的级别调高一级
(12)删除所有年龄超过40岁的船员信息
(13)建立年龄超过25岁的船员的视图
(14)对(13)建立的视图,举一操作的例子(查询、删除、修改均可)
2)要求:
a.建立boat数据库的SQL脚本,插入所有数据项的SQL脚本(包括所有的测试数据)。
b.记录完成查询要求的SQL语句脚本。
c.记录完成查询的查询结果。
《数据库系统概论》实验报告题目:交互式SQL
学号:
日期:2012年4月29日
实验内容与完成情况:
(一)实验所用数据(截图):
Sailors表
Boats表
Reserves表
(二)实验内容和要求
1)实验内容:
创建数据库boat,包括Sailors,Boats,Reserves三个表,表结构如下:Sailors(sid: integer, sname: string, rating: integer, age: real) 船员(船员编号,,级别,年龄)
Boats(bid: integer, bname: string, color: string)
船(船编号,名称,颜色)
Reserves(sid: integer, bid: integer, day: date)
租赁(船员编号,船编号,日期)
(注:下划线表示主键),并插入一定数据。
2)完成下列要求:
(1)查询所有船员的信息。
1.正确结果:
2.实现语句:select *fromSailors
3.执行结果:
4.正确,无问题
(2)查询所有姓李的船员的信息
1.正确结果:
sid sname rating age
2 李世民 2 20
4 李刚 4 25
13 李刚 5 27
2.实现语句:select *
from Sailors
where sname like '%'
3执行结果:
4.正确,无问题
(3)查询租用过6号船的船员姓名
1.
sname
曹操
勾践
2.
from Sailors,Reserves
where Sailors.sid=Reserves.sid and bid=6
3执行结果
4.正确,无问题
(4)查找租用过船只的船员编号
1.
sid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2.实现语句:select distinct sid
from Reserves
3.执行结果
4.正确,无问题
(5)查找rating>7且年龄>25的水手编号1.
sid
7
2.
from Sailors
where rating>7 and age>25 3执行结果:
4.正确,无问题
(6)查找租用过红船和白船的水手名字
1.
sname
张飞
2.实现语句:select sid
from Sailors
where Sailors.sid=Reserves.sid and
Boats.bid=Reserves.bid and color='红'
intersect
select sid
from Sailors
where Sailors.sid=Reserves.sid and
Boats.bid=Reserves.bid and color='白'
3执行结果
4.无法执行,改变实现语句
【2.实现语句:select sname
from Sailors,Reserves,Boats
where Sailors.sid=Reserves.sid and
Boats.bid=Reserves.bid and color='红'
And sname in
(select sname
from Sailors,Reserves,Boats
where Sailors.sid=Reserves.sid and Boats.bid=Reserves.bid and color='白')
3.执行结果:
4.正确。】
(7)查找租用过红船或绿船的水手编号
1.
sid
1
3
6
8
10
17
16
14
2.实现语句:select distinct sid
from boats,Reserves
where boats.bid=Reserves.bid and
color='绿'or color='红'
3,执行结果
4.执行错误,改变实现语句:
【2.实现语句:select distinct sid
from boats,Reserves
where boats.bid=Reserves.bid and ( color='绿'or color='红');
3.执行结果:
4.正确。】
(8)查找最年长的水手的年龄和名字
1.
Sname Age
马克思41
2.实现语句:select sname,age
from sailors
where age>=all(select agefrom sailors) 3执行结果
4.正确,无问题
(9)在18岁以上水手中,对于每个rating级别中最少有两个水手以上的组中最年轻水手的年龄
1.
Rating Age
2 20
3 23
4 25
5 27
6 31
7 37
2.
from sailors x
where age=(select min(age)
from sailors y
where age>20 and
y.rating=x.rating
group by rating
having count(sid)>1)
3执行结果
4.正确,无问题。
(10)查找每条红色船只被租用的次数
1.
bid count
1 2
8 1
2.
from Reserves,boats
where boats.bid=Reserves.bid
and color='红'
group by boats.bid
3执行结果
4.注意bid前面需要加boats以加以明确。(11)把30岁以上船员的级别调高一级
1.正确结果:
2.实现语句:update sailors
set rating=rating+1
where age>30select *from sailors 3执行结果:
1.正确结果:
2.实现语句:delete
from sailors
where age>40
delete
from Reserves
where sid in(select sidfrom sailors where age>40)
select *from sailorsselect *from Reserves 3执行结果:
4.正确,无问题。
1.实现语句:create view is_sailors
as
select sid,sname,rating,age
from sailors
where age>25
2.执行结果
(14)对(13)建立的视图,举一操作的例子(查询、删除、修改均可)
1.实现语句:select *
from is_sailors
where rating>5
2.执行结果:
(三)出现的问题
1.数据写入的时候没有注意导致某些问题无法解决。
2.交运算无法执行。
3.and与or的运算顺序搞错。
4.出现指代不明的情况。
(四)解决的问题
1.修改数据
2.查阅电脑,问题为:
3.如果想先算or带括号,如题(7)。
4.带上其所属的表,如有连接的话,select后面应该加sailors.bid而不是
只有bid。
(五)未解决的问题
1.修改一旦执行就不能返回了么?
2.
另:由于数据输入的原因,为使结果更据代表性,某些题目可能做了修改,但不改变题目考察意图。