写一条SQL语句,查询选修了所有课程的学号。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写一条SQL语句,查询选修了所有课程的学号。相关的知识,希望对你有一定的参考价值。
select 学号 from 学生 A whereselect X.学号
from
(select 学号,count(*) as 选修科目数
from (select distinct 学号,课程号 from 学生选修课程 A inner join 课程 B on B.课程号=A.课程号) A
group by 学号) X
where X.选修科目数 = (select count(*) from 课程)追问
我写的是:
select 学号 from sc
group by 学号
having count(*) =(select count(*) from c)
可以吗?
如果用你这种法前提是必须保证SC表中“学生号+选修科目”不能重复,否则会有漏洞。
参考技术A select 学号 from scgroup by 学号
having count(1) =(select count(课程编号) from c)追问
谢谢,我也是这样写的,那如果查询至少选修某个老师所有课程的学生学号该怎么写啊?
追答select 学号 from sc
where 课程编号 in (select 课程编号 from c where teacher = 'xxxx')
group by 学号
having count(1) >= (select count(课程编号) from c where teacher = 'xxxx')
就是三张表:s,sc,c如果学了数据库,这三张表是怎样的不用我说了吧。查询选了所有课程的学号
T-sql GroupBy语句常见问题处理
1.问题描述
现在有一张course表(含课程编号和名称)和一张sc表(含学生学号,选修课程的编号以及考试成绩),如下:
现在想要查询所有课程编号、对应的课程名称以及选修该课程的所有学生的平均成绩。
一开始我的想法就是用以下的查询语句:
select sc.cno as 课程编号, cname as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno
但是显然会报错:
于是开始想其他的办法。
2.第一种方法
首先想到的当然是按照报错信息来了,既然cname不在GROUP BY子句中,那就放到GROUP BY子句中呗,如下:
select sc.cno as 课程编号, cname as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno, cname
但是这种方法是不严谨的,因为这里是知道每个课程号只对应一个课程名称,所以这种办法才行。但是在其他的情况中,一旦每个课程号不是只对应一个课程名称,那就很乱了。所以还得想其他办法。
3.第二种方法
第二个想到的方法也是按照报错信息来,将cname变成聚合函数就行了,如下:
select sc.cno as 课程编号, Max(cname) as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno
-- 或者
select sc.cno as 课程编号, Min(cname) as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno
但是这种方法是比第一种方法还不如的。因为课程名称是字符串,取最大最小值毫无意义。
4.第三种方法
接下来就是正确的方法了,也就是标题提到的扩展SQL语句,也算是嵌套SQL语句。
因为select...from...中,from后面接的是表,所以这个表可以是另一个select语句查询出来的结果,如下:
select course.cno as 课程编号, cname as 课程名称, tmp.平均成绩
from course, (select cno, Avg(grade) as 平均成绩 from sc group by cno) as tmp
where course.cno = tmp.cno
在select...from...中的from后面嵌套一个select...from...,并且将嵌套的select...from...查询出来的表起个别名tmp,这样就能用tmp来操作这张表了。
5.第四种方法
既然select...from...中的from后面可以嵌套一个表,那么select...from...中的select后面可以嵌套一个列吗?
答案是可以的。如下:
select cno as 课程编号,
(select cname from course where sc.cno=course.cno) as 课程名称,
Avg(grade) as 平均成绩
from sc
group by sc.cno
要注意的是在(select cname from course where sc.cno=course.cno)
中必须要有where sc.cno=course.cno
,只有这样查询出来的结果才是一一对应的,否则查询出来的结果是很多的,然后每个cno会对应很多个cname,这样就会乱套,并且这样是会报错的。
以上是关于写一条SQL语句,查询选修了所有课程的学号。的主要内容,如果未能解决你的问题,请参考以下文章
数据库SQL语句中 查询选修了全部课程的学生的学号和姓名 理解