IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    你真的会玩SQL吗?三值逻辑

    hjoker发表于 2015-11-03 09:49:54
    love 0

    先来看一个问题:a not in (b,c,null),返回什么?

    是不是有时辛辛苦苦写了个查询,但显示的不是想要的答案?让我们来看看其中的一个陷阱。

    我们筛选为某列值为NULL的行,一般会采用如下的方式:select * from tb where col=null

    但这无法得到我们想要的结果的,正确的方式是col is null 为什么呢?这就涉及到三值逻辑。

    三值逻辑

    在SQL中逻辑表达式的可能值包括TRUE、FALSE和UNKNOWN。它们被称之为三值逻辑。

    三值逻辑是SQL所特有的。大多数编程语言的逻辑表达式只有TRUE或FALSE两种值。

    SQL中的UNKNOWN逻辑值通常出现在包含NULL值的逻辑表达式中,例如,下面这三个表达式值都是UNKNOWN:

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

    UNKNOWN值也是确定的,只是不同情况下有时为true有时为false,一个总原则是:UNKNOWN值非真即假,非假即真,UNKNOWN只能取true和false中的一个,但UNKNOWN的相反还是UNKNOWN

    在on\where和having中做过滤条件时,UNKNOWN看作false,在check中被看作true,在条件中两个null比较结果是UNKNOWN。(建设表中包含一个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值排列在一起。

     

    知道了为什么在查询中筛选null的时候需要使用 is null 或者is not null ,常规条件表达式却无法筛选出?

    练习

    以下对就返回哪三值?

    答案:

    相关文章

    • SQL SERVER中什么情况会导致索引查找变成索引扫描
    • 记一次 T-SQL 查询优化 索引的重要性
    • 如何阻止SELECT * 语句
    • 优化 SQL SELECT 语句性能的 6 个简单技巧
    • 拜托,在数据库中运行计算
    • 格式化 SQL 来提高效率
    • 你真的会玩SQL吗?之逻辑查询处理阶段
    • 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
    • 你真的会玩SQL吗?内连接、外连接
    • 记一次苦逼的SQL查询优化

    你真的会玩SQL吗?三值逻辑,首发于博客 - 伯乐在线。



沪ICP备19023445号-2号
友情链接