首页 > 其他分享 >584. 寻找用户推荐人

584. 寻找用户推荐人

时间:2023-03-02 14:24:29浏览次数:46  
标签:推荐人 584 false 三值 unknown 用户 谓词 NULL true

题目链接:https://leetcode.cn/problems/find-customer-referee/

题目描述:

 

由题目可知,我们需要查询编号不为2的客户:

SELECT name FROM customer WHERE referee_id != 2 ;

或者使用<>(等同与!=)但是这样运行结果是有错的,MySQL使用三值逻辑:TRUE、FALSE和UNKOWN。任何与NULL进行比较的值都会与第三种值UNKOWN做比较。这个“任何值”包括NULL本身。这就是为什么MySQL提供IS NULL和IS NOT NULL两种操作来对NULL特殊判断。

因此,我们需要做一个额外的判断:

SELECT name FROM customer WHERE referee_id <> 2 OR referee_id IS NULL;

或者使用IFNULL(),IFNULL(x1, x2)的意思为:如果x1是NULL,那么转换为x2,否则仍输出x1.

SELECT name 
FROM customer 
WHERE IFNULL(referee_id,0) != 2

总结:

1.1 三值逻辑

NULL有两种,“未知”unknown和不适用“inapplicable”。不知道带墨镜的人眼睛是什么颜色,但是这个人的眼睛肯定有颜色,这就是未知。不知道冰箱的眼睛是什么颜色的,就是不适用,因为冰箱没有眼睛。现在DBMS将这两种NULL归为了一类,并采用三值逻辑。

1.2 为什么是IS NULL而不是“=NULL”

SQL的保留字中,很多都被归类为谓词一类,例如>,<>,=等比较谓词,以及BETWEEN,LIKE,IN,IS NULL等。总结,谓词是一种特殊的函数,返回值是真值。SQL是三值逻辑,所以有三种真值。

因为查询结果之后包含WHERE子句里的判断结果为true的行,不包括判断结果为false和unknown的行。并且不仅是等号,对NULL使用其他比较谓词,结果也都是unknown。

重点理解:NULL不是值,所以不能对其使用谓词,如果使用谓词,结果就是unknown。可以认为NULL只是一个没有值的标记,而比较谓词只适用于比较值,因此对非值的NULL使用比较谓词是没有意义的。

1.3 如何理解IS NULL是两个单词

“NULL值”和“列的值为NULL”的说法是错误的,NULL不属于关系型数据库中的某种类型。我们为什么会误认为NULL是一个值?可能是因为混淆了其他的语言,在一些语言中NULL是一个常量。还有一个重要的原因是因为IS NULL是两个单词,所以我们可能会吧IS当作谓词,认为NULL是一个值。特别是SQL里有IS TRUE和IS FALSE。我们应该把IS NULL看作一个谓词,看作IS_NULL的形式。

1.4 三值逻辑运算

unknown小写,是第三个真值。与作为NULL的一种UNKNOWN是不同的东西。小写是明确的布尔类型真值,后者大写的既不是值也不是变量。为了对比,我们可以看x=x的情况:

unknown = unknown -> true

UNKNOWN = UNKNOWN -> unknwon

重点:三值逻辑运算

NOT unknown => unknown

true          OR unknown => true
unknown OR unknown => unknown
false         OR unknown => unknown

true          AND unknown => unknown
unknown AND unknown => unknown
false         AND unknown => false

记忆:优先级:
AND:    false > unknown > true
OR:       true > unknown > false

 

标签:推荐人,584,false,三值,unknown,用户,谓词,NULL,true
From: https://www.cnblogs.com/lbwBH/p/17171621.html

相关文章