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

    在SQL刚入门的时候,我们筛选为某列值为NULL的行,一般会采用如下的方式:
    SELECT * FROM Table AS T WHERE T.Col=NULL  www.2cto.com  
    而实际上此种写法无法得到想要的结果。此时我们在网上找到的解决方法是采用: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值分到一组。  www.2cto.com  
        ORDER BY 子句把所有NULL值排列在一起。
     
      了解UNKNOWN逻辑结果和NULL在不同的语言元素中被处理的方式是有好处的,这样可以避免以后出现麻烦。
     
      一大堆密密麻麻的字,都晕了吧。我用通俗点的解释下。
      用C#语言举例,C#中条件表达式的值是true和false。但是在SQL中还有第三种条件值:unknown。
      在C#中 if(null==null)得到结果是true,不等于的时候是false。
      但是在SQL使用 =、<、>、<>、<=、>= 进行 null值判断的时候,不会得到预期的true或false,而是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 ,常规条件表达式却无法筛选出。
  • 相关阅读:
    Building a Space Station POJ
    Networking POJ
    POJ 1251 Jungle Roads
    CodeForces
    CodeForces
    kuangbin专题 专题一 简单搜索 POJ 1426 Find The Multiple
    The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool
    The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold'em Poker
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
    robotparser (File Formats) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/jimcsharp/p/5601335.html
Copyright © 2011-2022 走看看