查询了选修sql
① 数据库sql语句中 查询选修了全部课程的学生的学号和姓名 理解
楼主别着急!
为好理解我们先从这条SQL语句所要实现的功能入手。
功能:查出选修了全部课程的学信息。那么SQL在查询数据的时候的遍历每一个学生信息。判断该学生是否满足条件。
1
如果存在这么一条Course记录A(暂命名为A),
则不选择该学生。否则该学生就被查询出来
2
那么记录A,是怎么查出来的呢?A查出的条件是:不存在SC记录B,只要不存在B,就可查出A
3
那么B记录是什么?B记录是选课信息表,根据学号和课程号可查出记录B
如果B为空(该学生有没有选的课程)也就是不存在,则A就有一条记录,根据规则2可知:因为有A,所以该学生信息将不被输出。
如果在SC中每一个课程编号和该学生编号为条件都能够查出一条记录B(也就是该学生选修了全部课程),所以A记录不存在,则输出该学生的信息。
也就是在选课表中,如果学生选了全部课程(也就是满足SELECT
*
FROM
SC
WHERE
Sno=
Student.Sno
AND
Cno=
Course.Cno)始终存在,当然,课程编号是任意的)。那么就输出该学生的信息。你不要为理解这条SQL而忘记了它本身是要做什么.
带着SQL的目的(要实现的功能)去理解就好了。
② 写一条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 课程)
③ 怎样用sql语句查询选修了3门及以上课程的学生学号,姓名,选修的课程数
SELECT学号FROM选课表GROUPBY学号HAVINGCOUNT(*)>=3
④ 用SQL语句查询选修了课程的学员人数
SC表里应该有个XKLB字段,看这门课是否选修还是必修,因为有的课程对A来说是必修的,而对B来说就是选修,
SELECT COUNT(DISTINCT SNO) FROM SC WHERE XKLB='选修';
⑤ SQL数据库中查询选修了所有课程的学生的学号和姓名及选修门数
所有离开了数据结构(表结构)的SQL语句都是白搭!
先假设数据结构为
学生表(学号 主键或设有唯一索引,姓名,性别)
课程表(课程号 主键或设有唯一索引,课程名)
选课表(课程号,学号)-- 字段“课程号”和“学号"设有双字段唯一索引
查询出选修了所有课程的学生的学号、姓名和选修门数:
select a.学号,b.姓名,a.cnt as 选修门数 from
(select 学号,count(1) as as cnt from 选课表 group by 学号
having count(1)=(select count(1) from 课程表)) a,
学生表 b where a.学号=b.学号;
⑥ SQL查询选修了全部课程的学生姓名
分析原因如下:
第一问:两个NOT EXISTS表示双重否定:没有一个选了课的学生没有选course表里的课程
select sname from student where not exists /*没有一个学生满足以下条件*/
(select * from course where not exists /*什么条件呢?没有选过Course表里的课*/
(select * from sc where sno =student.sno /*这里两个=分别指对应的关系,表示选
过课并且是Course里and cno=course.cno) 的课,只不过用not exists否定掉了*/
第二问:其实和NOT IN 是一个意思 exists只返回true 或false 这里not exists里的内容 其实就 是指学生选过的课程,再用NOT EXISTS否定了,就变成了没有选
⑦ 用SQL语句查询选修了c课程的学生姓名和只选修了c课程的学生姓名
假设数据结构为
students(sid,sname)
sc(sid,cname)
1)选修了C课程的学生姓名
select
distinct
a.sname
from
students
a,sc
b
where
a.sid=b.sid
and
b.cname='C';
2)只选修了C课程的学生姓名
select
s.sname
from
students
s,
(select
a.sid
from
(select
distinct
sid
from
sc
where
cname='C')
a
left
join
(select
distinct
sid
from
sc
where
cname<>'C')
b
on
a.sid=b.sid
where
b.sid
is
null)
t
where
s.sid=t.sid;
前者只要选修了C课程的学生就会被选出,不管该学生是否选修了其他课程。
后者某学生如果选修了C课程,还不一定能被选出,因为若他(她)还选修了其他课程那么还会被剔除掉。
"选修了C课程的学生"是"只选修C课程的学生"的父集,前者包含后者,或者说后者是前者的子集。
⑧ 用SQL查询同时选修了1号课和2号课的学生学号
工具/材料:以Management Studio为例。
1、首先在桌面上,点击“Management Studio”图标。
⑨ SQL查询选修了两门以上(包括两门)课程的学生信息
1:select sno(学生的学号) from sc(学生选课表)
group by sno having count(*)>1
2:select s.sno,s.name from student s
where s.sno in(select sno from score sc
group by sc.cno having sum(sc.sno)>2 )
3:应为三张表;学生表A 课程表B 选修表C(cid aid bid)--没有选修任何课程的学生的学号