SQL查询-存在与中的差异

SQL查询-存在与中的差异,sql,exists,Sql,Exists,以下两个查询是否总是给出相同的结果?若否,原因为何 (一) (二) 提前感谢。查看以下博客: 或者,您也可以通过谷歌搜索此类问题。查看以下博客: 或者,你也可以搜索这类问题。基本上不在和不存在非常相似,通常产生相同的结果 不同之处在于,中的如果集合中的某个值为NULL(至少在Oracle上为NULL),则将返回false,而exists仅检查记录是否存在,取消记录其值 在这个特定的例子中,您得到了一个WHERE子句,它将导致第一个查询返回不同的结果 在MySQL上通常更快的第三种方法是在主查

以下两个查询是否总是给出相同的结果?若否,原因为何

(一)

(二)


提前感谢。

查看以下博客:


或者,您也可以通过谷歌搜索此类问题。

查看以下博客:


或者,你也可以搜索这类问题。

基本上
不在
不存在
非常相似,通常产生相同的结果

不同之处在于,中的
如果集合中的某个值为NULL(至少在Oracle上为NULL),则将返回false,而
exists
仅检查记录是否存在,取消记录其值

在这个特定的例子中,您得到了一个WHERE子句,它将导致第一个查询返回不同的结果

在MySQL上通常更快的第三种方法是在主查询中左键联接表,并检查联接字段是否为空:

select payfrequencytypeid 
from 
  tblpayfrequency f
  left join tblcustomerpayapproval a
    on a.payfrequencytype = f.payfrequencytype
where
  a.payfrequencytype IS NULL
其他一般提示:

  • 当然,您可以跳过
    1
  • 您不需要在第二个查询中使用DISTINCT。如果删除该优化路径,则允许数据库选择最佳优化路径
  • Not exists通常比in更快,尽管这也取决于数据库选择的优化路径。您确实应该在实时服务器和实时数据上尝试这一点

  • 基本上,
    不在
    不存在
    非常相似,通常产生相同的结果

    不同之处在于,
    中的
    如果集合中的某个值为NULL(至少在Oracle上为NULL),则将返回false,而
    exists
    仅检查记录是否存在,取消记录其值

    在这个特定的例子中,您得到了一个WHERE子句,它将导致第一个查询返回不同的结果

    在MySQL上通常更快的第三种方法是在主查询中左键联接表,并检查联接字段是否为空:

    select payfrequencytypeid 
    from 
      tblpayfrequency f
      left join tblcustomerpayapproval a
        on a.payfrequencytype = f.payfrequencytype
    where
      a.payfrequencytype IS NULL
    
    其他一般提示:

  • 当然,您可以跳过
    1
  • 您不需要在第二个查询中使用DISTINCT。如果删除该优化路径,则允许数据库选择最佳优化路径
  • Not exists通常比in更快,尽管这也取决于数据库选择的优化路径。您确实应该在实时服务器和实时数据上尝试这一点
  • 简化和标记:

    SELECT p, d 
    FROM f 
    WHERE (p, 1) NOT IN 
        (SELECT t, 1 
        FROM a 
        WHERE i='903008887' 
        AND y = year (curdate()));
    
    
    SELECT p 
    FROM f 
    WHERE NOT EXISTS 
        (SELECT DISTINCT t 
        FROM a); 
    
    结果将不一样。原因:第一个查询需要两列。但我们无法知道今年的问题是否有影响,或者对903008887的过滤是否有影响。如果过滤有效果-如何通过第二个查询完成?

    简化并标记:

    SELECT p, d 
    FROM f 
    WHERE (p, 1) NOT IN 
        (SELECT t, 1 
        FROM a 
        WHERE i='903008887' 
        AND y = year (curdate()));
    
    
    SELECT p 
    FROM f 
    WHERE NOT EXISTS 
        (SELECT DISTINCT t 
        FROM a); 
    

    结果将不一样。原因:第一个查询需要两列。但我们无法知道今年的问题是否有影响,或者对903008887的过滤是否有影响。如果过滤有效果-第二个查询怎么做?

    第一个查询从db_uspaybo.tblpayfrequency返回一些数据,其中他们的PayFrequencyTypeID不在payfrequencytype表中,并且带有这些条件


    第二个不从db_uspaybo.tblpayfrequency返回任何数据

    第一个返回db_uspaybo.tblpayfrequency中的某些数据,其中其PayFrequencyTypeID不在payfrequencytype表中,且具有这些条件


    第二个不从db_uspaybo.tblpayfrequency返回任何数据

    我想这就是你想要的“不存在” A.Id和B.Id这里是连接这些表的Pk和FK。(我不知道确切的字段名)

    从tblpayfrequency A中选择payfrequencytypeid 不存在的位置(选择*

    来自tblcustomerpayapproval B,其中A.Id=B.Id,B.fedtaxid='903008887',B.payrollyear=year(curdate())

    我想这就是你想要的“不存在” A.Id和B.Id这里是连接这些表的Pk和FK。(我不知道确切的字段名)

    从tblpayfrequency A中选择payfrequencytypeid 不存在的位置(选择*

    来自tblcustomerpayapproval B,其中A.Id=B.Id,B.fedtaxid='903008887',B.payrollyear=year(curdate())

    你试过自己运行它吗?为什么?第一个有一个
    WHERE
    条件,该条件在第二个中的任何位置都没有出现,并且还选择了一个附加列。@Sachin-dupe是关于性能的,这是关于语义的。链接问题中的答案没有提到
    notin
    with
    NULL
    将返回一个空结果集。为什么不简化此问题的名称?为什么要在tablename前面加tbl?和:请在将来使用代码标签。谢谢。@user unknown:我也不明白“tbl”前缀(如果使用了,为什么不在每一列前面加上“col”…)你试过自己运行它吗?为什么?第一个有一个
    WHERE
    条件,该条件在第二个中的任何位置都没有出现,并且还选择了一个附加列。@Sachin-dupe是关于性能的,这是关于语义的。链接问题中的答案没有提到
    notin
    with
    NULL
    将返回一个空结果集。为什么不简化此问题的名称?为什么要在tablename前面加tbl?和:请在将来使用代码标签。谢谢。@user unknown:我也不明白“tbl”前缀(如果使用了它,为什么不在每一列前面加上“col”…)非常感谢你能告诉我使用exists opt的查询在哪里可以获得与inthanks相同的数据吗?非常感谢maryam我得到了it结果我更改了a.payfrequencytypeid=b.payfrequencytype代替了a.id=b.IDI非常感谢maryam我得到了it结果我更改了a、 payfrequencytype id=b.payfrequencytype代替a.id=b.id