关于left join、inner join、where 控制条件的区别

首先了解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.学生id

inner join 课程 c on c.课程id=b.课程id 

当要查询每个课程有多少学生报名时:

select c.课程id,c.课程名称,nvl(count(distinst b.学生id),0) as sl

from 课程 c

left 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主表错误,如果该课程无人报名,会导致查询结果缺少

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值