写一条SQL语句,查询选修了所有课程的学号。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写一条SQL语句,查询选修了所有课程的学号。相关的知识,希望对你有一定的参考价值。

select 学号 from 学生 A where

select 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 sc
group 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')

本回答被提问者采纳
参考技术B 你的数据结构怎样的?追问

就是三张表: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语句实现学生课程选修的查询

写一个SQL语句,查询选修了5门课程的学生学号和姓名

数据库SQL语句中 查询选修了全部课程的学生的学号和姓名 理解

练习一:对学生—课程数据库进行以下查询,按要求写出关系代数和SQL语句. 1. 查询全体学生的学号和姓名. .

用SQL语句写出完成如下查询

mysql三表查询sql语句