ORACLE SQL 多表查询+子查询

 

这是我在学习过程中遇到的一个自己无法解决的题目,在这里用以下方法解析分享:

先对下面这道题得先对这道题进行分析,分析出条件再操作

题目:

查询 和“s001”号的同学学习的课程完全相同的其他同学学号

“s001”号的同学 + 其他同学 = 课程完全相同 = 学号

这里要查条件是s001号的同学其他同学完全相同的课程,结果是这些同学完全相同的课程的学号

  1. 首先要查出”s001”号同学的学习课程

(1)

上图蓝色选中部分,是查询出”soo1”号同学所学习的课程

这个查询分别用到了两个表,一个是course课程表,一个是sc成绩表

用到了两个表也就是多表查询,查询的是(course表里的课程号cno,也就是a.cno,)a.cno,course表的别名(即重命名)为a

Select查询课程表(重命名a)里的课程号,

from 课程表(重命名a)的课程号和成绩表(重命名b)的课程号

Where条件进行过滤,判断,where 课程表(重命名a)的课程号等于成绩表的(重命名b)

也就是课程表和成绩表的课程号相等并成绩表的学生号等于s001.

  1. 查询学习课程完全相同的同学学号

(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

  1. 的子查询已经查询出s001的同学学号
  2. 查询出所有课程完全相同的同学,sno!=s001进行了筛选,把不相同的去掉
  1. 最后将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”号的同学学习的课程完全相同的其他同学学号)

猜你喜欢

转载自blog.csdn.net/kezhenke/article/details/89082420
今日推荐