加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

搞清这些陷阱,NULL和三值逻辑再也不会作妖

发布时间:2019-11-09 01:26:50 所属栏目:建站 来源:youzhibing2904
导读:副标题#e# NULL NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值。数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的。 两种NULL 这种说法大家可能会觉得很奇怪,因为 S

假设我们有学生表:t_student:

  1. DROP TABLE IF EXISTS t_student; 
  2. CREATE TABLE t_student ( 
  3.     id INT(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', 
  4.     name VARCHAR(50) NOT NULL COMMENT '名称', 
  5.     age INT(3) COMMENT '年龄', 
  6.     remark VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注', 
  7.     primary key(id) 
  8. ) COMMENT '学生信息'; 
  9.  
  10. INSERT INTO t_student(name, age) 
  11. VALUE('zhangsan', 25),('wangwu', 60),('bruce', 32),('yzb', NULL),('boss', 18); 
  12.  
  13. SELECT * FROM t_student; 

表中数据 yzb 的 age 是 NULL,也就是说 yzb 的年龄未知。在现实世界里,yzb 是 20 岁,或者不是 20 岁,二者必居其一,这毫无疑问是一个真命题。那么在 SQL 的世界里了,排中律还适用吗? 我们来看一个 SQL :

  1. SELECT * FROM t_student 
  2. WHERE age = 20 OR age <> 20; 

咋一看,这不就是查询表中全部记录吗?我们来看下实际结果:

搞清这些陷阱,NULL和三值逻辑再也不会作妖

yzb 没查出来,这是为什么?我们来分析下,yzb 的 age 是 NULL,那么这条记录的判断步骤如下:

  1. -- 1. 约翰年龄是 NULL (未知的 NULL !) 
  2. SELECT * 
  3. FROM t_student 
  4. WHERE age = NULL 
  5. OR age <> NULL; 
  6.  
  7. -- 2. 对 NULL 使用比较谓词后,结果为unknown 
  8. SELECT * 
  9. FROM t_student 
  10. WHERE unknown 
  11. OR unknown; 
  12.  
  13. -- 3.unknown OR unknown 的结果是unknown (参考三值逻辑的逻辑值表) 
  14. SELECT * 
  15. FROM t_student 
  16. WHERE unknown; 

SQL 语句的查询结果里只有判断结果为 true 的行。要想让 yzb 出现在结果里,需要添加下面这样的 “第 3 个条件”:

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读