MySql中on与where的区别个人总结——分清楚条件应该写在哪里

3 篇文章 0 订阅
订阅专栏
本文通过一个具体的业务场景,探讨如何使用SQL查询判断学生是否完成了特定班级的所有课程。作者首先介绍了问题背景,即拥有班级课程表和学生上课记录表,然后详细分析了错误的SQL写法及其原因,最终给出了正确的SQL查询语句,并解释了ON和WHERE子句在联接查询中的不同作用。通过这个案例,读者可以深入理解SQL联接查询的条件设置技巧。
摘要由CSDN通过智能技术生成

一、前言

最近工作中,遇到了这样一个场景:
有2个数据库表,
其中一个是班级课程表class_course,记录了一个班级中有多少门课程,字段如下:
在这里插入图片描述
如图,a班有4门课,b班有2门课;

另一个是学生上课记录表student_course,记录了一个学生已经上了哪几门课,字段如下:
在这里插入图片描述
如图,zhangsan01上了a班的3门课,b班的1门课;
lisi上了b班的2门课;

问题:如何查询出,zhangsan01是否上完了a班所有的课程?

二、解决思路

首先,本人想到,可以根据course_id,用class_course表左联student_course,然后筛选出a班的、zhangsan01的记录;
其中如果有联查后student_course.course_id为null的,就说明zhangsan01没有上过这门课,就说明zhangsan01没有上完a班所有的课程;
如果不存在null,就说明zhangsan01上完了a班所有的课程。
如图:
在这里插入图片描述
只要能用sql查询出这样的List<String>,然后java里循环下,发现有为null的,说明zhangsan01确实没上a班的a4课,也就能得出zhangsan01没有上完a班的所有课程的结论。

这样就可以实现需求了,下一个问题是sql怎么写了。

三、踩坑流程——错误sql

1.条件全写在on里面

select b.course_id,a.* from class_course a left join student_course b 
on a.course_id=b.course_id and a.class_id='a' and b.student_id='zhangsan01';

本人最开始想到的sql就是这样,但是查询到的结果不符合需求:
在这里插入图片描述
虽然on里限定了条件a.class_id=‘a’,但是不知道为什么结果还是有b班的数据,这样查询的还是不对。

2.主要条件写where里面

select b.course_id,a.* from class_course a left join student_course b 
on a.course_id=b.course_id 
where a.class_id='a' and b.student_id='zhangsan01';

首先左联时要on a.course_id=b.course_id ,这个是毫无疑问的;
然后由于条件写on里不对,因此本人尝试写在where里,但是结果还是不对:
在这里插入图片描述
因为样例数据中,zhangsan01没有上a4课,所以应该有一行null的;
但是这样并没有查到null,也不对。

四、正确sql

一部分条件在on里,一部分条件在where里:

select b.course_id,a.* from class_course a left join student_course b 
on a.course_id=b.course_id and a.class_id='a' and b.student_id='zhangsan01'
where a.class_id='a';

结果如图:
在这里插入图片描述
sql中,on里限制了只用a班的、zhangsan01的数据进行联查;

不过如果只在on里限制的话,由于是左联,因此class_course表里的其它数据也会显示出来,只不过连接的student_course表里的数据为空而已,不符合要求;

所以要在where中限制,只展示a班的,这样得到的结果就是想要的了;

需要注意,where中不能再限制只展示zhangsan01的了,如果加上后,最后一行null就展示不出来了。

上面的sql中,增加a.*是为了容易理解些,实际上最终要的sql是:

select b.course_id from class_course a left join student_course b 
on a.course_id=b.course_id and a.class_id='a' and b.student_id='zhangsan01'
where a.class_id='a';

在这里插入图片描述
执行这句sql后,java中可以得到长度为4的List<String>,遍历后,发现有为null的,就能得出zhangsan01没有上完a班的所有的课程的结论,就实现了需求。

五、总结

1.on中的条件,是决定根据什么进行联查(on a.course_id=b.course_id) 、用哪些数据进行联查( and a.class_id='a' and b.student_id='zhangsan01')用的。
2.where中的条件,是决定最后数据怎么过滤用的(where a.class_id='a')。
3.联查时需要注意条件写在on里还是where里;如本文中的左联查询,只写在on里不能满足需求,左表中其它的数据也会连接空数据显示出来;所以on里与where里都需要写条件。

Mysql——on和where的区别
baidu_39534448的博客
11-16 484
1.ON on不仅仅可以作为表的连接,也可以过滤条件。 select user_name ,dept_name from `user` as u join department as d on u.id>1 2.区别 1)解释 ON和WHERE的主要区别在于,on是执行在join语句之前,WHERE是执行在join语句之后。 join语句做的操作是加入外部行,比如说left,right,...
玩转Mysql系列 - 第25天:sql的where条件数据库提取与应用浅析
F1520080的博客
04-22 546
至此,文章终于到了尾声。技术能力:先岗位所需能力,再能力,不要无关能力;项目经历:只明星项目,描述遵循 STAR 法则;简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存…(img-fxjhodeE-1713756502947)]
mysqlleft join设置条件在on与where时的用法区别
09-08
主要介绍了mysqlleft join设置条件在on与where时的用法区别,结合实例形式析了mysqlleft join设置条件在on与where时的相关用法区别与操作注意事项,需要的朋友可以参考下
MySQL的ON和WHERE
不服输的南瓜的博客
01-02 1060
ON是建立关联关系 WHERE是对关联关系的筛选
mysql where on_MySQL 查询条件放置 on 和 where 的区别
weixin_39746794的博客
01-18 111
导语今天在 SQL 的时候,遇到一个问题。需求是这样的,查询数据,按照评倒序、近一周访问量倒序,这样进行排序。问题是常规的法,将 day >= xxx 条件放到 where , 如果某些数据近一周没有访问量,那么这条数据就查不出来。解决办法呢,就是将条件放到 LEFT JOIN MySQL 语句执行顺序首先先说明一个概念,MySQL 语句执行的顺序,并不是按照 SQL 语句的顺序...
oracle sql 条件放在on后面和where后面区别
只为成功找方法 不为失败找借口
02-25 1027
oracle
MYSQL之on和where的区别浅谈
xiaoweids的博客
07-12 986
有时候如果这先后顺序不影响间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少间运算要处理的数据,按理说应该速度是最快的。根据上面的析,可以知道where也应该比having快点的,因为它过滤数据后才进行sum,所以having是最慢的。但也不是说having没用,因为有时在步骤3还没出来都不知道那个记录才符合要求时,就要用having了。在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。
mysql的左连接多个条件查询_mysql——多表——外连接查询——左连接、右连接、复合条件查询...
weixin_34118910的博客
01-20 3502
create table employee ( num int(50),d_idint(50),namevarchar(50),ageint(50),sexvarchar(50),homeaddvarchar(50));insert into employee values(1,1001,'zhangsan',26,'nan','beijing');insert into employee val...
mysql group by去重_MySQL本周总结——group by去重和自联结理解
weixin_32485965的博客
01-18 4312
1、group by 理解:从一个例题开始:已知表格:Product(maker, type, model)Get the makers who produce only one product type and more than one model. Output: maker, type.即找出:1个type,>1个model的maker,输出: maker, type答案:selec...
MySQL与Redis数据库结合(一)——lnmp+redis+mysql实现读
weixin_43936969的博客
03-24 1257
Redis—redis结合lnmp架构做mysql的缓存服务器 文章目录一 、redis结合lnmp架构做mysql的缓存服务器实现读离(一)在server1配置nginx(二)在server2配置redis(三)在server3上安装mysql(四)建立php和redis,mysql的连接(五)浏览器访问测试 一 、redis结合lnmp架构做mysql的缓存服务器实现读离 读离...
MySQL的连接 on 后面接的条件和 where 后面接的条件有什么区别
最新发布
qq_65244706的博客
05-24 531
MySQL的连接 on 后面接的条件和 where 后面接的条件有什么区别
被问麻了:Hive过滤条件在where和on里到底有什么区别
baishao_的博客
06-01 831
但是条件在on 时,在扫表时过滤,结果的数据条数与左表一致;条件在where时,在join后进行过滤,结果的数据会过滤掉关联后右表不满足条件的数据,会比左表数据量少。无论是过滤左表、右表 - on 、where 的结果都一样,全都在扫表时过滤,若是左表条件则过滤左表,若是右表条件则过滤右表。过滤条件是否针对关联键、left join的情况下过滤条件针对左表还是右表、过滤条件在where还是on。无论是过滤左表、右表- on 、where 的结果都一样,全都在扫表时过滤,过滤两表。
MySqlOn和Where的区别
ssdjdk的博客
03-30 3869
区别: 先执行on,后执行where;on是建立关联关系,where是对关联关系的筛选。 比如两个表进行left join连接查询结果,where会对查询的结果进行过滤, on会返回驱动表的所有数据。 left join按照条件关联,不管是否为真,都返回左边表的数据。 ...
join/left join条件在on后面和where后面区别
YangTinTin的博客
08-12 2275
首先需要说明,连接的具体结果和数据库语言是有关系的,不同的数据库语言遵守的规则有细微的差别,不能一概而论,我这里是mysql。 首先,贴出两张表。 成绩表:score 学生表:student 1、left join 在on后增加条件含左表字段 SELECT * FROM student left join score on score.s_id=student.s_id AND score.s_name='赵雷'; 结果: 可以看到,on后面的限制条件score.s_id=student.s_id AND
Mysqlon和where的区别
sinat_34241861的博客
07-02 686
在多表查询时,on和where都可以作为筛选条件使用。具体的区别如下: 在外连接时,on条件是在生成临时表时使用的条件,因此不论on条件是否为true,都会返回左表的记录;而where条件是在临时表生成后,对已生成的临时表再次进行筛选 例子 sql1: SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.`deptno` AND e.`deptno`=40; 结果: sql2: SELECT * FROM emp e LEFT JOIN dept d
关于MySQLon和where
weixin_53532169的博客
08-20 158
当结果少了时要看on和where后面的子句是否有问题,没问题再考虑子句应该放在where还是on后面
JOIN 关联表 ON、WHERE 后面条件区别
Mr-吴の客栈
05-19 943
SQLjoin连接查询时条件放在on后与where后的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on条件是否为真,都会返回左边表的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没...
MySQL - ON & WHERE 条件区别和执行顺序
牧码的博客
10-30 8916
一、案例 数据库在通过连接两张或多张表来返回记录时,都会生成一张间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件区别如下: 1、on条件是在生成临时表时使用的条件,它不管on条件是否为真,都会返回左边表的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)...
left join后面加上where条件浅析
weixin_30444105的博客
06-28 407
left join后面加上where条件浅析 select a.*,b.* from table1 a left join table2 b on b.X=a.X where XXX 如上:一旦使用了left join,没有where条件时,左表table1会显示全部内容    使用了where,只有满足where条件的记录才会显示(左表显示部或者全部不显示) so。。。。 left join的...
MySQL Left Join 使用误区与解析
如果在ON条件对左表进行过滤,可能会在循环开始之前就排除某些记录,而在WHERE条件对右表进行过滤,则会在找到匹配的右表记录后进行过滤,不会影响左表的完整返回。 因此,正确的做法是在LEFT JOIN将对左表的...
写文章

热门文章

  • 类文件具有错误的版本 61.0, 应为 52.0的解决方法 63092
  • springboot拦截器excludePathPatterns方法不生效的坑与解决方法 41454
  • 连接远程redis的详细步骤 29241
  • CORS(跨域资源共享)漏洞解决方法 28974
  • A、B、C三类IP地址的最大网络数和每个网络中的最大主机数 25582

分类专栏

  • 常用工具文章 14篇
  • 2020.4—— 100篇
  • 笔记 13篇
  • Java进阶 44篇
  • vue3 3篇
  • 软件开发规范流程 4篇
  • springcloud 1篇
  • JAVA 14篇
  • DJNativeSwing:java 2篇
  • Selenium:java 2篇
  • java常用方法 9篇
  • sql 3篇
  • shiro

最新评论

  • kettle报错ldconfig: command not found解决方法

    yangymy: 谢谢你解决了我的问题,我是麒麟系统遇到这个问题,找了很久终于解决了。

  • 前端加密方法sha256.js源码+用法(亲测可用)

    weixin_39183449: 传入中文好像有问题

  • 类文件具有错误的版本 61.0, 应为 52.0的解决方法

    虾仁猪芯: 感谢大佬,搞了半天还以为是版本或者镜像问题

  • css实现图片渐变切换效果

    小王毕业啦: 博主的文章真是让人眼前一亮,对于如何利用CSS实现图片渐变切换效果这一主题,博主的详细解说让我对整个过程有了更深入的理解。文章中的细节描写非常到位,让我不仅学到了知识,也感受到了博主的专业功底。期待博主未来能够继续分享更多有价值的内容,也希望能够得到博主的指导,一起进步。感谢博主的付出和支持!

  • nginx配置后转发没有生效的一个坑个人总结

    微微一头猪: 你这8080进入nginx的server了,后就是路径匹配,完事了你这后面这个路径开头时/a他要是给你匹配到了/b开头的路径,这不合理啊。

最新文章

  • css实现图片渐变切换效果
  • CSS动画keyframes简单样例
  • eclipse导入maven项目与配置使用本地仓库
2024年6篇
2023年66篇
2022年63篇
2021年73篇
2020年85篇
2018年7篇
2017年8篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐梦想永不停

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家商场新年美陈图玻璃钢雕塑壁纸干净玻璃钢仿铜人物雕塑商场美陈布置设计安装有机玻璃钢雕塑专业商场美陈英文怎么翻译邳州商场中庭美陈广西玻璃钢花盆价格表鹤壁玻璃钢雕塑榆树玻璃钢雕塑工程施工电话玻璃钢花盆可以放在室外西安公园主题玻璃钢卡通雕塑哪儿有玻璃钢造型雕塑雅安玻璃钢雕塑工厂玻璃钢猴雕塑图片广州抽象玻璃钢雕塑销售厂家邢台玻璃钢雕塑找哪家硅胶玻璃钢雕塑视频北京玻璃钢花盆费用河北玻璃钢雕塑摆件研究玻璃钢装饰雕塑制作厂邹平玻璃钢花盆花器周口校园玻璃钢景观雕塑定做价格玻璃钢伟人雕塑哪里好绍兴玻璃钢雕塑摆件生产通道商场美陈销售阿城植物玻璃钢雕塑湖南卡通玻璃钢雕塑设计及定制景洪市玻璃钢雕塑加工宿州抽象玻璃钢雕塑订做价格香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化