ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1211|回复: 8

[求助] SQL语句not EXISTS和 EXISTS的奇怪的差异?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-11-25 22:07 | 显示全部楼层 |阅读模式
本帖最后由 ljxxw 于 2018-11-25 22:10 编辑

请教,SQL语句 not  EXISTS应该就是相反的EXISTS,下面截图选出来的不一样,成绩表第六行故意加了一行
2008100920
跟第一行重复,但  not  EXISTS  ......成绩<=80, 选出来的跟 EXISTS ....成绩>80 不一样。
not  EXISTS ... 数学 <=80  不就是  EXISTS ... 数学 >80 吗?
exists.jpg

exists.rar

32.68 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2018-11-26 14:14 | 显示全部楼层
结果没错的,你再想想!想不通再问我

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-26 22:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
amazeyeli 发表于 2018-11-26 14:14
结果没错的,你再想想!想不通再问我

谢谢 amazeyeli 老师抽空指导!
我对EXIST的运行原理了解不清楚,特地添加一行看运行结果。

提取学生表第1条记录 "20081009 陈 21"带入成绩表子查询,
WHERE 20081009=B.学号 是true  AND 数学89 <=80 是false 合并是false,再被not变ture,
此时 学生表第1条记录 还要跟 成绩表的 其余2-5条记录比较吗,是结果集 EXIST(ture,ture,ture,ture,false)吗
还请您能讲解原理!

TA的精华主题

TA的得分主题

发表于 2018-11-27 08:02 来自手机 | 显示全部楼层
主键重复了,SELECT 学生表.*,成绩表.* FROM 学生表,成绩表 WHERE 学生表.学号=成绩表.学号
看看是不是有问题,一个学生 有二个 成绩了。

TA的精华主题

TA的得分主题

发表于 2018-11-27 08:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
SELECT 学号,姓名,年龄
FROM [学生表$] A  
WHERE not  EXISTS  
(
        SELECT 学号   
        FROM [成绩表$] B   
        WHERE A.学号=B.学号   
        AND 数学 <=80  
)--从成绩表中查询数学<=80的学号,结果是20081011,20081012,20081009这三个
ORDER BY A.学号
--然后从学生表中查询学号不在子查询中的结果,那么只有20081010了

SELECT 学号,姓名,年龄
FROM [学生表$] A  
WHERE  EXISTS  
(
        SELECT 学号   
        FROM [成绩表$] B   
        WHERE A.学号=B.学号   
        AND 数学 >=80  
)--从成绩表中查询数学>=80的学号,结果是20081009,20081010这两个  
ORDER BY A.学号
--然后从学生表中查询学号在子查询中的结果,这个应该好理解的

TA的精华主题

TA的得分主题

发表于 2018-11-27 09:09 | 显示全部楼层
EXISTS子查询和IN子查询原理是一样的,你可以看成是IN,EXISTS比IN效率要高

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-28 12:39 | 显示全部楼层
amazeyeli 发表于 2018-11-27 08:56
SELECT 学号,姓名,年龄
FROM [学生表$] A  
WHERE not  EXISTS  

谢谢 amazeyeli 老师百忙中抽空指导!

我在书上看到下面EXISTS的解释,理解为先取A表第一条记录,带入B表,是TURE了,放入结果中,

您的讲解
--从成绩表中查询数学<=80的学号,结果是20081011,20081012,20081009这三个
--然后从学生表中查询学号不在子查询中的结果,那么只有20081010了

感觉执行原理过程不一样,原书的例子也上传了,书上的讲错了吗?
EXIST.JPG

145.rar

431.9 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2018-11-28 13:38 | 显示全部楼层
没错的,是你理解错了,SQL执行没有先后顺序

TA的精华主题

TA的得分主题

发表于 2018-11-28 13:42 | 显示全部楼层
WHERE A.户编号=B.户编号
AND  A.户口所在地<>B.户口所在地

是同时执行的,没有先后

WHERE A.学号=B.学号   
AND 数学 <=80

是同时执行的,没有先后,连接的是A.学号=B.学号 AND 数学 <=80,不是先连接再取值,也不是先取值再连接,是同时进行的。
所有连接的是A.学号=B.学号 并且 数学 <=80 的记录。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 05:36 , Processed in 0.037390 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表