zoukankan      html  css  js  c++  java
  • 关于SQLSQL Server的三值逻辑

    在SQL刚入门的时候,我们筛选为某列值为NULL的行,一般会采用如下的方式:

    SELECT * FROM Table AS T WHERE T.Col=NULL

    而实际上此种写法无法得到想要的结果。此时我们在网上找到的解决方法是采用:T.Col IS NULL。虽然此方法能得到数据,但是本人以及部分同行都不知道为什么会出现 T.Col=NULL 无法得到Col为NULL的行的这种结果。

      最近我想加强下SQL方面的知识,于是找了 SQLSERVER 2005技术内幕:T-SQL查询 这本书看。在书中看到了三值逻辑个知识点。而该知识点为我解惑了上面的问题。

      什么是三值逻辑?

      以下是书中原文:
      在SQL中逻辑表达式的可能值包括TRUE、FALSE和UNKNOWN。它们被称之为三值逻辑。三值逻辑是SQL所特有的。大多数编程语言的逻辑表达式只有TRUE或FALSE两种值。SQL中的UNKNOWN逻辑值通常出现在包含NULL值的逻辑表达式中,例如,下面这三个表达式值都是UNKNOWN:

    NULL<42;
    NULL=NULL;
    X+NULL>Y;

    NULL值通常表示丢失或不相关的值。当比较丢失值和另外一个值(这个值也可能是NULL)时,逻辑结果总是UNKNOWN。

      处理UNKNOWN逻辑结果和NULL时非常容易混淆。NOT TRUE等于FALSE,NOT FALSE等于TRUE,而否定的UNKNOWN(NOT UNKNOWN)还是UNKNOWN。

      UNKNOWN逻辑结果和NULL在不同的语言元素中被区别对待。例如,所有的查询筛选器(ON、WHERE和HAVING)都把UNKNOWN当作FALSE处理。使筛选器为UNKNOWN的行会被排除在结果集之外,而CHECK约束中的UNKNOWN值被当作TRUE对待。建设表中包含一个CHECK约束,要求salary列的值必须大于0,向该表插入salary为NULL时可以被接受,因为(NULL>0)等于UNKNOWN,在check约束中被视为和TRUE一样。

    在筛选器中比较两个NULL值将得到UNKNOWN,它会被当作false处理,就好像其中一个NULL不等于另一个NULL。

      而UNIQUE约束。排序操作和分组操作认为两个NULL值是相等的。

        如果表中有一列定义了UNIQUE约束,将无法向表中插入该列值为NULL的两行。

        GROUP BY 子句把所有NULL值分到一组。

        ORDER BY 子句把所有NULL值排列在一起。

      了解UNKNOWN逻辑结果和NULL在不同的语言元素中被处理的方式是有好处的,这样可以避免以后出现麻烦。

     

      一大堆密密麻麻的字,都晕了吧。我用通俗点的解释下。

      用C#语言举例,C#中条件表达式的值是truefalse。但是在SQL中还有第三种条件值:unknown。

      在C#中 if(null==null)得到结果是true不等于的时候是false

      但是在SQL使用 =、<、>、<>、<=、>= 进行 null值判断的时候,不会得到预期的truefalse,而是unknown。

      SQL对unknown 的处理主要分为两种:

      1、在 where、on、having子句中,把unknown当着false处理。于是就有了开篇中我的那个疑问了。

      2、在check约束中的unknown值被当作TRUE对待。建设表中包含一个check约束,要求salary列的值必须大于0,向该表插入salary为null时可以被接受,因为(null>0)等于unknown,在check约束中被视为和true一样。

      根据上面的解释,已经知道了为什么在查询中筛选null的时候需要使用 is null 或者is not null ,常规条件表达式却无法筛选出。

  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/chongsha/p/7068917.html
Copyright © 2011-2022 走看看