最近被查询搞得有点头大,但也好像到达一个突破的瓶颈。把他写出来做一下记录,有需要参考的可以参考一下。
[实验目的和要求]
1.掌握SQL Server Management Studio中SQL
查询操作;
2.掌握SQL 的单表查询命令;
3.掌握SQL 的连接查询操作;
4.掌握SQL 的嵌套查询操作;
5.掌握SQL 的集合查询操作。
## 1. 对学生-课程数据库,应用SQL 语句实现以下查询要求:
1) 查询数学系学生的学号和姓名;
select sno,sname
from student
where sdept ='MA'
最后一句也可写为
where sdept in ('MA')
2) 查询选修了课程的学生学号;
select distinct sno
from sc
PS: distinct 可消除相同重复的行,如果没有distinct关键词,则默认为ALL
3) 查询选修了1号课程的学生学号和成绩,并要求结果按成绩降序排列,如果成绩相同,则按学号升序排列;
select sno,grade
from sc
where cno='3'
order by grade desc,sno asc
ps: desc指降序,asc指升序,一般默认为升序
4) 查询选修了1号课程且成绩在80-90分之间的学生学号和成绩,并将成绩乘以系数0.8输出;
select cno=1,sno,grade*0.8
from sc
where grade between 80 and 90
between and 用来查找范围内的元组,between 后 跟低值,and 后跟高值
5) 查询数学系或计算机系姓张的学生的信息;
select *
from student
where sdept in('CS','MA') and SNAME LIKE'张%'
ps: in谓词实际上是多个or运算符的缩写
最后一句也可写为
where (sdept ='CS'or sdept='MA' )and sname like'张%'
and的优先大于or
6) 查询缺少了成绩的学生的学号和课程号;
Select sno,cno
From sc
Where grade is null;
7) 查询每个学生的情况以及他(她)所选的课程;
Select student.*,sc.cno,grade
From student,sc
Where student.sno=sc.sno
8) 查询学生的学号、姓名、选修的课程名称及成绩;
Select student.sno,sname,sc.cno,grade
From student,sc
Where student.sno=sc.sno
9) 查询选修了“数据库”课程且成绩在90分以上的学生学号、姓名和成绩;
Select student.sno,sname,sc.grade
From student,sc,course
Where course.cname='数据库' and course.cno=sc.cno and grade>90 and student.sno=sc.sno
10) 查询每门课程的间接先行课的课程名称。
select first.cno,second.cpno
from course first,course second
where first.cpno=second.cno
此题目需要将一个表进行自身连接,所以要为此取两个名字,first和second。
2.对学生-课程数据库,应用嵌套查询实现以下查询要求:
1) 查询选修了“高等数学”的学生学号和姓名;
Select sno,sname
From student
Where sno in (select sno
From sc
Where cno in (select cno
From course
Where cname='高等数学'))
2) 查询“高等数学”的成绩高于张三的学生学号和成绩;
select Student.sno,grade
from Student,sc
where student.Sno in(
select Sno
from SC
where Cno in (
select Cno
from Course
where Cname ='高等数学' and
Grade>(
select Grade from SC
where Sno in
(select Sno from Student
where Sname ='张三')
)
)
)
3) 查询其他系中年龄小于计算机系年龄最大者的学生;
select *
from student
where
Sdept<>'cs'
and Sage <
(select max(Sage ) from student where Sdept ='cs')
4) 查询其他系中比计算机系学生年龄都小的学生;
select *
from student
where
Sdept<>'计算机'
and Sage <
(select min(Sage ) from student where Sdept ='计算机')
5) 查询选修了“信息系统”课程的学生姓名;
select sname
from student
where sno in(select sno
from sc
where cno in (select cno
from course
where cname='信息系统' ) )
6) 查询没有选修“信息系统”课程的学生姓名;
select sname
from student
where sno in (select sno
from sc
where cno in(select cno
from course
where cname!='信息系统'))
7) 查询选修了全部课程的学生姓名;
select sname
from student
where sno in(select sno from sc)
8) 查询至少选修了学号为“95002”的学生所选修的全部课程的学生学号和姓名。
select sno,sname
from student
where sno in(select sno=95002
from sc)
3.对图书读者数据库,应用SQL 语句实现以下查询要求:
1) 查询计算机类和机械工业出版社出版的图书;
select *
from book
where bgenre='计算机类'or bgenre='机械工业出版社'
2) 查询“机械工业出版社”出版的各类图书的平均定价,用GROUP BY 表示;
select bgenre,AVG(bmoney)as 平均价
from book
where bpress='机械工业出版社'
group by bgenre
order by bgenre asc
3) 查找这样的图书类别:要求类别中最高的图书定价不低于全部按类别分组的图书平均定价的2倍;
select bgenre
from book
group by bgenre
having max(bmoney)
>= all(select 图书表1.价格 from
(select avg(bmoney)*2 as 价格,bgenre from book
group by bgenre) 图书表1)
4) 列出计算机类图书的书号、名称及价格,最后给出总册数和总价格;(提示:可以使用Compute 子句最简便地实现);
select bno,bname,bmoney from book
where bgenre='计算机'
order by bno asc
COMPUTE count(bno),sum(bmoney);
5) 列出各出版社计算机类图书的具体书号、名称、价格和销售数量,并求出各出版社这类书的平均价格和销售总量。(提示:可以使用Compute by子句最简便地实现)。
select * from book
where bgenre='计算机'
order by bpress asc
select * from book
order by bpress
compute
avg(bmoney),sum(bqualitity) by 出版社
[实验思考题]
对上述查询要求的实现进行总结,并对单表查询、连接查询、嵌套查询以及集合查询进行比较。