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

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

发布时间:2019-11-11 11:12:22 所属栏目:编程 来源:youzhibing2904
导读:NULL NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值。数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的。 两种NULL 这种说法大家可能会觉得很奇怪,因为 SQL 里只存

-- 添加 3 个条件:年龄是20 岁,或者不是20 岁,或者年龄未知

  1. -- 添加 3 个条件:年龄是20 岁,或者不是20 岁,或者年龄未知 
  2. SELECT * FROM t_student 
  3. WHERE age = 20  
  4.     OR age <> 20 
  5.     OR age IS NULL; 

CASE 表达式和 NULL。简单 CASE 表达式如下:

  1. CASE col_1 
  2.     WHEN = 1 THEN 'o' 
  3.     WHEN NULL THEN 'x' 
  4. END 

这个 CASE 表达式一定不会返回 ×。这是因为,第二个 WHEN 子句是 col_1 = NULL 的缩写形式。正如我们所知,这个式子的逻辑值永远是 unknown ,而且 CASE 表达式的判断方法与 WHERE 子句一样,只认可逻辑值为 true 的条件。正确的写法是像下面这样使用搜索 CASE 表达式:

  1. CASE WHEN col_1 = 1 THEN 'o' 
  2.     WHEN col_1 IS NULL THEN 'x' 
  3. END 

NOT IN 和 NOT EXISTS 并非等价

我们在对 SQL 语句进行性能优化时,经常用到的一个技巧是将 IN 改写成 EXISTS ,这是等价改写,并没有什么问题。但是,将 NOT IN 改写成 NOT EXISTS 时,结果未必一样。

我们来看个例子,我们有如下两张表:t_student_A 和 t_student_B,分别表示 A 班学生与 B 班学生。

  1. DROP TABLE IF EXISTS t_student_A; 
  2. CREATE TABLE t_student_A ( 
  3.     id INT(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', 
  4.     name VARCHAR(50) NOT NULL COMMENT '名称', 
  5.     age INT(3) COMMENT '年龄', 
  6.     city VARCHAR(50) NOT NULL COMMENT '城市', 
  7.     remark VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注', 
  8.     primary key(id) 
  9. ) COMMENT '学生信息'; 
  10.  
  11. INSERT INTO t_student_A(name, age, city) 
  12. VALUE 
  13. ('zhangsan', 25,'深圳市'),('wangwu', 60, '广州市'), 
  14. ('bruce', 32, '北京市'),('yzb', NULL, '深圳市'), 
  15. ('boss', 43, '深圳市'); 
  16.  
  17. DROP TABLE IF EXISTS t_student_B; 
  18. CREATE TABLE t_student_B ( 
  19.     id INT(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', 
  20.     name VARCHAR(50) NOT NULL COMMENT '名称', 
  21.     age INT(3) COMMENT '年龄', 
  22.     city VARCHAR(50) NOT NULL COMMENT '城市', 
  23.     remark VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注', 
  24.     primary key(id) 
  25. ) COMMENT '学生信息'; 
  26.  
  27. INSERT INTO t_student_B(name, age, city) 
  28. VALUE 
  29. ('马化腾', 45, '深圳市'),('马三', 25, '深圳市'), 
  30. ('马云', 43, '杭州市'),('李彦宏', 41, '深圳市'), 
  31. ('年轻人', 25, '深圳市'); 
  32.  
  33. SELECT * FROM t_student_A; 
  34. SELECT * FROM t_student_B; 

(编辑:核心网)

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

热点阅读