这是我在学习过程中遇到的一个自己无法解决的题目,在这里用以下方法解析分享:
先对下面这道题得先对这道题进行分析,分析出条件再操作
题目:
查询 和“s001”号的同学学习的课程完全相同的其他同学学号
“s001”号的同学 + 其他同学 = 课程完全相同 = 学号
这里要查条件是“s001”号的同学和其他同学,完全相同的课程,结果是这些同学完全相同的课程的学号
- 首先要查出”s001”号同学的学习课程
(1)
上图蓝色选中部分,是查询出”soo1”号同学所学习的课程
这个查询分别用到了两个表,一个是course课程表,一个是sc成绩表
用到了两个表也就是多表查询,查询的是(course表里的课程号cno,也就是a.cno,)a.cno,course表的别名(即重命名)为a
Select查询课程表(重命名a)里的课程号,
from 课程表(重命名a)的课程号和成绩表(重命名b)的课程号
Where条件进行过滤,判断,where 课程表(重命名a)的课程号等于成绩表的(重命名b)
也就是课程表和成绩表的课程号相等并成绩表的学生号等于s001.
- 查询学习课程完全相同的同学学号
(2)
select sno
from course a,sc b
where a.cno = b.cno and a.cno in (select a.cno
from course a,sc b
where a.cno = b.cno and b.sno = 's001')
and sno != 's001'
Select 查询学号
from 课程表(重命名a)的课程号和成绩表(重命名b)的课程号
Where条件进行过滤,判断,where 课程表(重命名a)的课程号等于成绩表的(重命名b)
a表课程号=b表课程号(并)and(等于值列表中的一个)in(1里所查询出来的数据)并and
sno学号 !=(不等于)s001
- 的子查询已经查询出s001的同学学号
- 查询出所有课程完全相同的同学,sno!=s001进行了筛选,把不相同的去掉
- 最后将1和2查询出来的进行分组,进行判断,判断和s001号同学课程相同的其它学生的学号
使用group by给成绩表的学号进行分组
使用了group by函数要使用Having进行过滤,count(a.cno)
count(计数)计算课程表的课程号的总条数等于
select查询 所有列的总条数count(*),*指所有列
from 课程表(重命名a)的课程号和成绩表(重命名b)的课程号
Where条件进行过滤,判断,where 课程表(重命名a)的课程号等于成绩表的(重命名b)
a表课程号=b表课程号(并)and sno学号 !=(不等于)s001
(3)select count(*)
from course a,sc b
where a.cno = b.cno and b.sno = 's001'
上面查询s001所有列总数3条
count(a.cno)=(3)
最上面第一个截图,是整个查询的一个执行还有它的结果,结果为空,不是错的,是没有(和“s001”号的同学学习的课程完全相同的其他同学学号)