您的位置:首页 > 数据库

SQL语言-select查询操作

2016-10-11 13:35 211 查看

1、 统计有学生选修的课程数

我们是要统计有学生选修的课程数,那么肯定是需要有count()这个函数的,然后,我们只需要统计下出现的课程号就可以了:

select count(distinct sc.cno) as course_num
from sc


我们可以看到输出的结果为:



2、 求选修4号课程的学生的平均年龄

我们可以看到,这个题目中有了一个限定条件,为选修了四号课程的学生,所以,我们可以在中间加以判断,在选出了适合的学生之后,我们可以进行年龄的平均数计算,我们看到平均数是需要利用avg()函数的,所以,我们可以进行下面的实验了:

select avg(S.sage) as avg_age
from student as S,sc as T
where T.cno = 4 and S.sno = T.sno


我们可以看到输出的结果为:



3、 求学分为3的每门课程的平均分

这里需要注意的是每门课程,所以,我们输出的结果就不像前面一样了,只是单一的结构,我们这次输出的结果就是多元的结果,因为学分为3的课程并不只是一种课程类型。所以,我们需要利用的就是group by这一个语句,通过对课程进行分组,我们可以分别输出对应的平均分数,而求平均分的方法,上一题也讲到了,但是,我们需要输出的是课程号和成绩,这两个元素不在一个表中,我们需要进行链接,因为中间可能有null的出现,所以,我们利用外链接的形式,只连接自己想要的部分,来完成这次的实验:

select T.cno,T.cname,avg(sc.grade) as avgscore
from (select cno,cname from course where ccredit = 3) as T
left join sc on sc.cno = T.cno
left join student on student.sno = sc.sno
group by T.cno


输出的结果为:



4、 求选修超过三人的课程号和选修人数,结果按照人数降序排列,如果人数相同按照升序排列:

我们看到,这个题目中,主要的还是和人数有关,所以,我们可以看到的是,用count进行计数,然后,我们在输出的时候还是需要利用group by来进行输出的,这样的话,我们就可以分组进行输出的,最后一点需要注意的就是我们的顺序问题,按照人数的降序和课程号的,默认的输出结果就是升序,如果要用降序的话,我们需要做的就是加入desc这一变量,这样的话,我们就可以完成这次的试验了:

select cno,count(sno) as student_num
from sc
group by cno
having count(sno)>3
order by count(sno)desc ,cno


所以,看到,我们的输出的结果为:



5、 查询所有学号比王琳同学大,年龄比她小的同学的学生姓名

我们需要比较的对象有两个,一个是学号,一个是年龄,所以,我们通过,姓名,学号,来进行比较:

select T.sname
from student as T,student as S
where  S.sname = '王琳' and T.sno > S.sno and T.sage < S.sage


所以,我们可以看到的是,结果如下:



6、 检索所有以王姓开头的同学的姓名和学号

我们这里需要比较的是王姓开头,所以,我们可以看到的是利用了’%’,这种结构是比较常见的比较结构,所以,我们可以进行如下的操作:

select sname,sage
from student
where sname like '王%';


可以看到,得到的结果为:



7、 在sc表中检索成绩为空值的学生的学号和课程号

这里是进行一次空值的检索,所以,我们需要比较的就是null,那么如何进行比较呢?我们可以利用is null来进行判断,这样的话,我们就可以完成实验了:

select sno,cno
from sc
where sc.grade is null


跑出来的结果为:



为了判断是否正确,我们可以更改下数据,自己写一个成绩为null的学生出来:





所以,我们的结果是正确的。

8、 求年龄大于女学生平均年龄的男学生的姓名和年龄

这里的话,我们需要注意的是有一个嵌套,我们需要先求出女学生的平均年龄,然后,在求出比这个平均年龄大的男学生的姓名和年龄:

select sname,sage
from  student
where sage > (select avg(sage) from student where ssex = '女') and ssex = '男'


可以看到上面的式子是进行了嵌套的,所以,我们先求出了女学生的平均年龄,然后,在求出比这个年龄大的男学生的姓名和年龄,输出的结果为:



9、 求年龄大于所有女学生年龄的男学生的姓名和年龄

这一题和上一题比较类似,都是嵌套,但是这一题中需要注意的是,我们和所有进行比较,因此,需要有一个all在这里,于是我们利用all()来进行实验:

select sname,sage
from  student
where sage > all(select sage from student where ssex = '女') and ssex = '男'


由于数据的问题,我们的结果为空,所以,为了测试实验是否正确,我们进行适当的数据集的修改:



可以看到输出的结果为:



所以,我们的结果是正确的。

10 求选修四门以上课程的学生的总成绩,以降序输出:

这里面,我们需要注意的点有以下几点:选修四门课程,总成绩,降序,分组。所以,我们可以看到的是,这里面的知识点其实我们都已经很熟悉的了。所以,我们可以直接进行代码的书写:

select sno,sum(grade) sum
from sc
where grade >= 60 and sno in
(select sno
from sc
group by sno
having count(sno)>4)
group by sno
order by sum(grade) desc


这个时候,我们可以看到输出的结果为:



所以,我们看到这次的实验结果是正确的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql select 语言 数据库