mysql学习—三值逻辑和NULL

1-3 三值逻辑和NULL

SQL 布尔型-true false unknown
真值优先级
and:false > unknown > true
or : true > unknown > false
null 不是值,不能对其使用谓词(is null)

01 排中律不成立

排中律不成立: 把命题和它的否命题通过“或者”连接而成的命题全部都是真命题(古典逻辑学)

/* 添加第3个条件:年龄是20岁,或者不是20岁,或者年龄未知 */
SELECT *
  FROM Students
 WHERE age = 20
    OR age <> 20
    OR age IS NULL;

02 CASE 表达式和NULL

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

03 NOT IN 和 NOT EXISTS 不等价

/* 查询与B班住在东京的学生年龄不同的A班学生的SQL语句? */
SELECT *
  FROM Class_A
 WHERE age NOT IN ( SELECT age
                      FROM Class_B
                     WHERE city = '东京' );
/* 正确的SQL语句:拉里和伯杰将被查询到 */
SELECT *
  FROM Class_A A
 WHERE NOT EXISTS ( SELECT *
                      FROM Class_B B
                     WHERE A.age = B.age
                       AND B.city = '东京' );

限定谓词和NULL

all 可以和比较谓词一起使用,用来表达“与所有的xx都相等”,“与所有的xx都大”的意思。

/* 查询比B班住在东京的所有学生年龄都小的A班学生 */
SELECT *
  FROM Class_A
 WHERE age < ALL ( SELECT age
                     FROM Class_B
                    WHERE city = '东京' );

限定谓词和极值函数不对等

/* 查询比住在东京的学生的年龄最小的学生还要小的A班学生的SQL语句? */
SELECT *
  FROM Class_A
 WHERE age < ( SELECT MIN(age)
                 FROM Class_B
                WHERE city = '东京' );

使用极值函数 在统计时会吧NULL的数据排除掉。
比较对象原本不存在时,根据业务方需求需要返回空集时,需要使用all谓词,或者使用COALESCE 函数将极值函数返回的NULL处理成合适的值。

聚合函数和NULL

/* 查询比住在东京的学生的平均年龄还要小的A班学生的SQL语句? */
SELECT *
  FROM Class_A
 WHERE age < ( SELECT AVG(age)
                 FROM Class_B
                WHERE city = '东京' );

没有住在东京的学生,AVG函数返回NULL。因此,外侧的where子句永远都是unknown

猜你喜欢

转载自blog.csdn.net/weixin_43387060/article/details/86228822