`
VincentZheng
  • 浏览: 52160 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【读书笔记】谨防SQL中的两个使用误区:整型相除及in/exists

 
阅读更多
1. 在SQL Server中整型相除是取整(舍小数),如果要取小数且限制位数,可以用convert(numeric(10,2),a*1.0/b)或是cast(a*1.0/b as numeric(10,2))的方式得到.

2. 对于in/exists(clause)有4点需要注意:

(1) 含义上来说,in/exists都是取的交集,not in/exists都是取的差集.

(2) 语法上来说:
in: where column_name (not) in(clause)
exists: where (not) exists(clause)

(3) 原理上来说:
in: 把外表和内表作hash连接,确定给定的值是否与子查询或列表中的值相匹配. 也就是说,查询clause返回的结果集中是否存在column_name的行(感觉就是数组中是否存在这个值).
exists: 先对where前的主查询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出. 也就是说先对外表作loop循环,每次loop循环再对内表进行查询.

(4) 效率上来说:
in/exists: 如果查询的两个表大小相当,那么用in和exists差别不大. 如果一大一小,则子查询表大的用exists,子查询表小的用in. 因为开销应该集中在loop循环中,而不是进出循环---切换至下一行这样的开销.
not in/exists: 无论哪个表大,用not exists都比not in要快. 这是因为前者能用到表上的索引,而后者不能. 最致命的一点在于用not in很可能导致出现致命的Bug,如果子集任一记录为Null值,则用not in的整个查询结果也是空集,而not exists是正确结果集.

summary: 针对整个使用(not) in/exists来说,兼顾效率与正确性,最好使的只有一个,也即开发中使用最为广泛的not exists. 而我们使用(not) in较多的地方只有明确定义clause为一个'数组'(感觉上的数组),即(not) in('a','b','c')

附(not in导致Bug的实例):


create table t1(c1 int,c2 int)
create table t2(c1 int,c2 int)
go
insert into t1 values(1,2)
insert into t1 values(1,3)
insert into t2 values(1,2)
insert into t2 values(1,null)

select * from t1 where c2 not in(select c2 from t2)
select * from t1 where not exists(select c2 from t2 where t1.c2=t2.c2)
分享到:
评论

相关推荐

    C语言程序设计-用辗转相除法求两个整数的最大公约数;.c

    C语言程序设计-用辗转相除法求两个整数的最大公约数;.c

    算术运算符 自学python如何成为大佬(目录):https://blog.csdn.net/weixin-67859959/a

    整数除法运算符返回两个数相除后的整数部分,忽略小数。例如: ```python print(10 // 3) # 输出:3 ``` 6. 模运算符 (%): 模运算符返回两个数相除后的余数。例如: ```python print(10 % 3) # 输出:1 ``` 7. 幂...

    C语言编程实现求两个数的最大公约数和最小公倍数

    解题思路:最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个;最小公倍数是指两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数...

    有理分数的四则算术运算符重载 .cpp

    d) 将两个有理数相除:相除的结果应以简化形式存储。 e) 以 a/b 的形式返回有理数的字符串表示形式,其中 a 是分子,b 是分母。 f) 以浮点格式返回有理数的字符串表示形式. (考虑提供格式化功能,类的用户能够...

    C语言:基于C实现的辗转相除法

    本文主要介绍如何用C语言实现辗转相除法,即欧几里得算法,这是一种用于计算两个正整数a和b的最大公约数的高效方法。辗转相除法的基本思想是:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和较小数b的...

    在SQL语言中用Group By子句实现除法.pdf

    在这个例子中,`SUM(salary) OVER ()`计算整个数据集的总工资,而`COUNT(*) OVER ()`计算总行数,两个窗口函数结合就可以计算每个员工工资与公司总平均工资的比例。 当然,在一些数据库系统中,可能需要结合case...

    自己学习sql的笔记

    从给定的学习SQL的笔记中,我们可以提炼出一系列重要的SQL知识点,这些知识点涵盖了SQL的基本操作、函数使用、数据处理以及表结构的管理等关键领域。下面是对这些知识点的详细解析: ### SQL函数与数据处理 #### ...

    基于c实现的辗转相除法求两个数的最大公约数

    辗转相除法,又称欧几里得算法,是求解两个正整数最大公约数(Greatest Common Divisor,GCD)的一种经典方法。这种方法由古希腊数学家欧几里得提出,至今仍被广泛应用于计算机科学中。在C语言中实现辗转相除法,...

    python 实现两数相除

    # 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符 # 返回被除数 dividend 除以除数 divisor 得到的商 # 示例 1: # 输入: dividend = 10, divisor = 3 # 输出: 3 # ...

    Delphi 返回2个操作数相除的商和余数.rar

    返回2个操作数相除的商和余数,程序通过求13/3和15/3,来演示如何计算商和余数,单击按钮即可求出结果,相关代码:  var  a,b: word;  begin  DivMod(13,3,a,b);  Edit1.Text := '商数:' IntToStr(a) ' 佘数:' ...

    算法-计算浮点数相除的余(信息学奥赛一本通-T1029)(包含源程序).rar

    例如,当两个非常接近的浮点数相除时,结果可能会是0,但实际上可能存在非零的小数部分。 2. **浮点数的舍入误差**:在计算过程中,可能会出现舍入误差,特别是在涉及除法和乘法的连续操作时。这些误差会累积,导致...

    基础算法-python求最大公约数和最小公倍数

    def gcd(a,b): #最大公约数函数,且最小公倍数 = 两个数相乘 / 最大公约数 if b == 0: return a else: return gcd(b,a%b) print("请输入两个数:") j,k = input().split() #消除空格,但不能直接int(input()....

    Python解决两个整数相除只得到整数部分的实例

    在Python编程语言中,进行两个整数的除法操作,默认情况下结果会自动进行整数除法,也就是仅保留结果的整数部分,舍去小数部分。这种操作在Python 2.x版本中称为"地板除",而在Python 3.x版本中已经改进为真正的除法...

    在Python中获取两数相除的商和余数方法

    方法一:可以使用//求取两数相除的商、%求取两数相除的余数。[/在Python中获取的是相除的结果,一般为浮点数] 方法二:使用divmod()函数,获取商和余数组成的元祖 实例代码: #!/usr/bin/python3 # -*- coding: utf...

    辗转相除法证明 辗转相除法证明

    例如,在RSA加密算法中,计算两个大质数的乘积和其最大公约数的过程就依赖于辗转相除法。 ### 总结 通过上述分析,我们可以看到,辗转相除法不仅是求解两个整数最大公约数的一种高效方法,其背后的数学逻辑也相当...

    用c++实现将两个数相除的结果保留100位

    该算法首先使用#include "iostream.h"和#include "stdio.h"来包含必要的头文件,然后定义了两个整形变量a和b,以及两个整形数组tmp和result,用于存储中间结果和最终结果。 在input函数中,该算法使用cout语句来...

    WAS和DB2性能问题的发现和处理.pdf

    - **优化查询语句**: 对于 DB2 数据库中的慢查询,可以尝试优化 SQL 语句,减少不必要的数据检索。 - **调整数据库配置**: 根据监控结果调整数据库缓存大小、锁策略等参数。 - **增加硬件资源**: 如果瓶颈在于 CPU ...

    1.3.2辗转相除法与更相减损术.doc

    例如,使用辗转相除法求两个数8251和6105的最大公约数为37。 二、更相减损术 更相减损术是一种中国古代数学家所创造的算法,用于求两个数的最大公约数。该方法的基本思想是通过反复减法来求出两个数的最大公约数。...

    SQL函数大全.pdf

    2. MOD:计算两个数相除后的余数。 3. POW:计算一个数的指数次幂。 4. ROOT:计算指定基数的n次方根。 5. SQRT:计算一个数的平方根。 6. ROUND、TRUNC:用于对数值进行四舍五入或截断到指定的小数位。 SQL三角...

    用辗转相除法求最大公约数

    在给定的代码片段中,作者使用了C语言来实现辗转相除法求解两个整数的最大公约数。下面详细解析这段代码: ```c #include int main() { int a, b, t; scanf("%d%d", &a, &b); // 辗转相除法求最大公约数 ...

Global site tag (gtag.js) - Google Analytics