标题:乱世中的 SQL,是 Not In 还是 Not Exists。
只看楼主
倦猫1973
Rank: 2
等 级:论坛游民
威 望:1
帖 子:68
专家分:28
注 册:2022-11-17
结帖率:85.71%
已结贴  问题点数:20 回复次数:9 
乱世中的 SQL,是 Not In 还是 Not Exists。
要说起 VFP 特点大伙都可以提出很多很多,我个人认为排名第一的应该是 VFP SQL。

很多人不知道,SQL 其实也是一门语言,它的书足足有你两个手指头这么厚。不同数据库略有差异这里不做介绍,而 VFP 妙就妙在,它把 SQL 与 VFP 指令结合在一起了,这使得 VFP 就是那么的鹤立鸡群傲视群雄。可惜这是一个悲伤的故事,导致很多 Foxer 根本没有意识到其实 SQL 也是要学习的,SQL 三大语句一个也没学会就匆匆忙忙用 VFP 开发程序了,碰到不会的就直接改用 VFP 指令去解决。最终的结果是,在所有开发语言中,Foxer 的 SQL 掌握能力是最弱的群体,优势变劣势。

说来惭愧,我以前也是用过 DBC 的也是用过 F/S 结构的,只是当年并不知道这是什么意思,大家都这么说我也就这么做,也一直无比得瑟的在 vfp 中写着各种 SQL,心里暗爽不就这么回事。vfp9 出来后  SYS(3099 [, 70 | 80 | 90]) 直接给了我当头一棒,当时就困惑无比:我到底学了啥 SQL????痛定思痛决定跟真正的 SQL 来个正面交锋,一年以后我的整个世界观就都变了,一年前问题还是那个问题,一年后我解决同一个问题的方式己经不是那一回事了。

不希望有人读得懂我在说什么,我也只是随便说说。

说回 Not In 还是 Not Exists,不管你怎么百度得到的结果都是 Not Exists,一代一代的经验就是这么传承下来。可大人们,现在都是 3202 年了,SQL 97 早己退出历史舞台了,它们并没有任何区别。


程序代码:
Create Table T1 (c1 VarChar(10))
Insert Into T1 Values ('01')
Insert Into T1 Values ('02')
Insert Into T1 Values ('03')
Insert Into T1 Values ('04')
Insert Into T1 Values ('05')


Create Table T2 (c1 VarChar(10))
Insert Into T2 Values ('01')
Insert Into T2 Values ('03')
Insert Into T2 Values ('05')
Go

Create NonClustered Index IX_t1 On dbo.t1 (C1) ON [PRIMARY]
Create NonClustered Index IX_t2 On dbo.t2 (C1) ON [PRIMARY]
Go



Select * From T1 t1 Where t1.C1 Not In (Select t2.c1 From T2 t2)
Select * From T1 t1 Where Not Exists(Select 1 From T2 t2 Where t2.c1 = t1.c1)


[此贴子已经被作者于2023-3-27 09:04编辑过]

搜索更多相关主题的帖子: SQL Insert Not Values Into 
2023-03-27 09:02
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:5 
试试将:
Insert Into T1 Values ('01')
改为:
Insert Into T1 Values ('0123')
2023-03-27 09:39
倦猫1973
Rank: 2
等 级:论坛游民
威 望:1
帖 子:68
专家分:28
注 册:2022-11-17
得分:0 
以下是引用吹水佬在2023-3-27 09:39:46的发言:

试试将:
Insert Into T1 Values ('01')
改为:
Insert Into T1 Values ('0123')


己改好,结果有变,执行计划不变。




[此贴子已经被作者于2023-3-27 09:44编辑过]

2023-03-27 09:43
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:5 
in ()子句 和 exists()子句  我都用,只是视实际情况决定用哪个。

关于这2个子句的性能,说法不一。
2023-03-27 10:49
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:5 
2023-03-27 10:55
iswith
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:154
专家分:101
注 册:2013-5-14
得分:5 
Not Exists 强于 Not in ,记录行数太少,体现不出来,你把记录拉到十个W

[此贴子已经被作者于2023-3-27 11:29编辑过]

2023-03-27 11:28
倦猫1973
Rank: 2
等 级:论坛游民
威 望:1
帖 子:68
专家分:28
注 册:2022-11-17
得分:0 
以下是引用iswith在2023-3-27 11:28:56的发言:

Not Exists 强于 Not in ,记录行数太少,体现不出来,你把记录拉到十个W


十个W少了点吧?要不要拉一个T?
2023-03-27 11:47
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
我这,无论哪种情况,not in 始终是效率最差的算法
2023-03-27 12:05
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
说回楼主您的前言,大概没人不知道 SQL 是一门语言吧?SQL == Structured Query Language(结构化查询语言),怎么可能不知道是一种语言?
VFPer 是否需要掌握 SQL 因人而异,单打独斗且永远不准备转到 C/S、B/S 的大侠,仅使用 xBase 语法就行,而且运行性能还能做到相当不错;如果是多人合作的团队,不会 SQL 就会比较尴尬,使用其他语言的合作者大概率是看不懂 vfp 方言的,如同只会中文的人去跟不懂汉语的交流没两样。我的习惯是当性能相差不多的情况下,能用 SQL 的尽量用 SQL 实现,一方面是代码简短容易理解,另一方面也易于移植、交流
至于 in 好还是 exists 好,不同运行环境下完全有可能得出有差异的结果,我相信教科书上的说法是有统计学依据的
2023-03-27 12:53
倦猫1973
Rank: 2
等 级:论坛游民
威 望:1
帖 子:68
专家分:28
注 册:2022-11-17
得分:0 
以下是引用csyx在2023-3-27 12:53:03的发言:

说回楼主您的前言,大概没人不知道 SQL 是一门语言吧?SQL == Structured Query Language(结构化查询语言),怎么可能不知道是一种语言?
VFPer 是否需要掌握 SQL 因人而异,单打独斗且永远不准备转到 C/S、B/S 的大侠,仅使用 xBase 语法就行,而且运行性能还能做到相当不错;如果是多人合作的团队,不会 SQL 就会比较尴尬,使用其他语言的合作者大概率是看不懂 vfp 方言的,如同只会中文的人去跟不懂汉语的交流没两样。我的习惯是当性能相差不多的情况下,能用 SQL 的尽量用 SQL 实现,一方面是代码简短容易理解,另一方面也易于移植、交流
至于 in 好还是 exists 好,不同运行环境下完全有可能得出有差异的结果,我相信教科书上的说法是有统计学依据的


回头想想,我给的这个例子确实是不怎么好。因为 not in 与 not exists 不能互换,not in 只能算是特定条件 not exists 的一个特例。
写都写了,无所谓了,例子举得不好是我的错。
2023-03-27 14:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511688-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.246791 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved