一个关于sql的简单问题 好困扰 好迷茫

夏豆腐 2017-11-12 02:49:18
先上图:这个是测试用的表
想请教一个问题:
需求是查询到成绩高于(sno=‘’109‘’,cno=‘’3-105‘’)的同课程cno=‘’3-105‘’的所有记录

为什么s1.sno ='109' and s1.cno='3-105'只有一条记录???

先在此膜拜过大神了,新手上路,小白开车
...全文
164 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2017-11-13
  • 打赏
  • 举报
回复
1. FROM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
2. ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
3. JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
4. WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
5. GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
6. HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
7. SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
8. DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
9. ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
10. LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。

上面是 MySQL 中语句的执行顺序。稍稍想一下就能明白为什么会出现这种情况了。
inner join 在on where 条件都是=的情况下, 是不会出现这种情况的, 但你的条件里有 > , 就不一样了。
二月十六 2017-11-12
  • 打赏
  • 举报
回复
楼主可以先把where条件去掉,看join的结果集,然后再人工where筛选看看
  • 打赏
  • 举报
回复
select * from score s1
where exists
	(select 1 from score s2 
	where s2.sno=109 
		and s2.cno='3-105'
		and s1.cno=s2.cno
		and s1.degree>s2.degree
	);
感觉你的需求 exists 好些
  • 打赏
  • 举报
回复
where 是对结果集的筛选 on是匹配的筛选 两者意义不同的
听雨停了 2017-11-12
  • 打赏
  • 举报
回复
如果你把第一条语句的s1.degree>s2.degree中的>改成<,那么第一条语句出来的结果也是三条。之所以是一条记录,是因为你写的这个条件错了,s1.sno=109,那它对应的成绩就是76,你的条件s1的成绩要大于s2,也就是s2的成绩小于76,当然没有符合条件的记录了,不知道这样说你能明白不

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧