查看: 5859|回复: 13

请教大家一个sql优化的问题

[复制链接]
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51复活蛋
日期:2011-11-10 14:24:412012新春纪念徽章
日期:2012-01-04 11:56:01
发表于 2012-1-16 10:19 | 显示全部楼层 |阅读模式
SQL> SELECT count(*) FROM qdata.t_pub010 t1 WHERE t1.f006 NOT IN (SELECT t2.comcode FROM qdata.t_stk005 t2);

  COUNT(*)
----------
      8725
SQL> SELECT count(*) FROM qdata.t_pub010 t1 WHERE NOT exists (SELECT t2.comcode FROM qdata.t_stk005 t2 where t2.comcode=t1.f006) ;

  COUNT(*)
----------
     22092

为什么这两句的SQL结果不一样?

论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:512012新春纪念徽章
日期:2012-01-04 11:54:26蛋疼蛋
日期:2012-04-11 10:25:43
发表于 2012-1-16 10:41 | 显示全部楼层
null值

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51复活蛋
日期:2011-11-10 14:24:412012新春纪念徽章
日期:2012-01-04 11:56:01
 楼主| 发表于 2012-1-16 10:57 | 显示全部楼层
hanchangjin 发表于 2012-1-16 10:41
null值

我还是有点儿不太明白原理


SELECT count(*) FROM qdata.t_pub010 t1
WHERE NOT exists (SELECT t2.comcode FROM qdata.t_stk005 t2 where t2.comcode=t1.f006) and t1.f006 is not null;


为什么这样显示的结果就是对的?

使用道具 举报

回复
论坛徽章:
51
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22铁扇公主
日期:2012-02-21 15:03:13最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-05-22 15:10:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:13:332013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-12 09:34:36itpub13周年纪念徽章
日期:2014-09-28 10:55:55
发表于 2012-1-16 11:03 | 显示全部楼层
exist不检测实际的值~只是做一个存在判断就立刻返回~所以null值也返回给结果集了
in 会查询结果集除了null值不会返回以外还会过滤重复的值

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:512012新春纪念徽章
日期:2012-01-04 11:54:26蛋疼蛋
日期:2012-04-11 10:25:43
发表于 2012-1-16 11:08 | 显示全部楼层
你看一下以前论坛里有论述null在这些情况下的效果的原理,具体在哪我忘了,但是我以前看到过,你找找吧.

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
10
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-27 06:00:12ITPUB社区千里马徽章
日期:2013-06-09 10:15:342013年新春福章
日期:2013-02-25 14:51:24奥运纪念徽章
日期:2012-11-28 09:33:31奥运纪念徽章
日期:2012-11-20 10:27:31ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42马上有对象
日期:2014-02-18 16:44:08
发表于 2012-1-16 11:19 | 显示全部楼层
in判断其实是的多个等于或者多个不等与的等值判断,而null是无法等于和不等于的,所以结果集中会略去
exists只是一种逻辑判断。相当于在等值连接下再外部做了一个逻辑判断

具体的可以参考以前整理的一篇blog
http://dotaddjj.itpub.net/index.php

使用道具 举报

回复
认证徽章
论坛徽章:
2
迷宫蛋
日期:2012-02-03 08:33:382012新春纪念徽章
日期:2012-02-07 09:59:35
发表于 2012-1-17 08:30 | 显示全部楼层
学习一下

使用道具 举报

回复
论坛徽章:
5
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:44咸鸭蛋
日期:2012-03-31 11:58:37
发表于 2012-1-17 11:44 | 显示全部楼层
使用exist或者in应该谨慎,尽量将其改为连接
select count(*) from qdata.t_pub010 t1,qdata.t_stk005 t2  where t1.f006=t2.comcode(+) and t2.comcode is null

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51复活蛋
日期:2011-11-10 14:24:412012新春纪念徽章
日期:2012-01-04 11:56:01
 楼主| 发表于 2012-1-17 12:51 | 显示全部楼层
本帖最后由 lqlein 于 2012-1-17 12:52 编辑
wrd54123 发表于 2012-1-17 11:44
使用exist或者in应该谨慎,尽量将其改为连接
select count(*) from qdata.t_pub010 t1,qdata.t_stk005 t2  ...

恩 不过我的这个需求用连接是实现不了的吧 你有例子给我参考参考吗

使用道具 举报

回复
论坛徽章:
5
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:44咸鸭蛋
日期:2012-03-31 11:58:37
发表于 2012-1-17 14:26 | 显示全部楼层
你的那个not exists不就是可以通过下面这个语句实现吗?
select count(*) from qdata.t_pub010 t1,qdata.t_stk005 t2  where t1.f006=t2.comcode(+) and t2.comcode is null

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表