首先了解left join、inner join 的区别
left join :以主表数据为主,子表关联不到就为null。
inner join : 主表有的子表也得有,才能关联到。
例:
学生表(a表):学生id,学生名称
课程记录表(b表):学生id,课程id。。。
课程表(c表):课程id,课程名称
表关系:a表一对多b表,c表一对多b表。
说明:不是所有学生都有课程,不是所有课程都有学生报名学习。
当要查询每个学生学习的课程有哪些时:
select a.学生id,a.学生名称,c.课程id,c.课程名称from 学生 a left join 课程记录 b on b.学生id=a.学生idinner join 课程 c on c.课程id=b.课程id
当要查询每个课程有多少学生报名时:
select c.课程id,c.课程名称,nvl(count(distinst b.学生id),0) as slfrom 课程 cleft join 课程记录 b on c.课程id=b.课程id
———————————————————分割线————————————————————
接下来正题,如下控制条件写法的区别
--查询报名语文、数学、英语课程的人数
--1、
select c.课程id,c.课程名称,nvl(count(distinst b.学生id),0) as sl
from 课程 c
left join 课程记录 b on c.课程id=b.课程id
where c.课程名称 in ('语文','数学','英语')
--2、
select c.课程id,c.课程名称,nvl(count(distinst b.学生id),0) as sl
from 课程 c
inner join 课程记录 b on c.课程id=b.课程id
where c.课程名称 in ('语文','数学','英语')
--3、
select c.课程id,c.课程名称,nvl(count(distinst b.学生id),0) as sl
from 课程 c
inner join 课程记录 b on c.课程id=b.课程id and c.课程名称 in ('语文','数学','英语')
--4、
select c.课程id,c.课程名称,nvl(count(distinst b.学生id),0) as sl
from 课程记录 b
inner join 课程 c on c.课程id=b.课程id and c.课程名称 in ('语文','数学','英语')
--5、
select c.课程id,c.课程名称,nvl(count(distinst b.学生id),0) as sl
from 课程记录 b
left join 课程 c on c.课程id=b.课程id
where c.课程名称 in ('语文','数学','英语')
2、3 查询结果是一致的。4、5查询结果是一致的。
正确写法是1。
4,5主表错误,如果该课程无人报名,会导致查询结果缺少