A. 数据库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的目的(要实现的功能)去理解就好了。
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否定了,就变成了没有选
C. 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.学号;
D. 用SQL查询同时选修了1号课和2号课的学生学号
工具/材料:以Management Studio为例。
1、首先在桌面上,点击“Management Studio”图标。
E. 用SQL语句查询选修了课程的学员人数
SC表里应该有个XKLB字段,看这门课是否选修还是必修,因为有的课程对A来说是必修的,而对B来说就是选修,
SELECT COUNT(DISTINCT SNO) FROM SC WHERE XKLB='选修';
F. 用sql语句查询选修了3门及以上课程的学生学号,姓名,选修的课程数
SELECT学号FROM选课表GROUPBY学号HAVINGCOUNT(*)>=3
G. SQL语句查询选了其所在系开设的所有课程的学生姓名
思路:1. 查询出每个系有多少课程 2. 查出学生选了对应系的课程数量 3,比对前面的数量,如相等,表示选了所有的课程
select distinnct b. student_name from
(select dept, count(course_no) as c_qty from course c group by dept) a,
( select s.name as student_name, s.dept, count(course_no) as c_qty from student s, c_s cs, course c where s.id=cs.student_id and s.dept=c.dept group by cs.student_name, s.dept ) b
where a.c_qty=b.c_qty and a.dept=b.dept
按上面的SQL试一下,应该是可行的。SQL还有优化空间的...