题目链接:584.寻找用户推荐人
解题思路
此题思路其实很简单:只需要在条件查询中筛选推荐人编号都不是2的用户就能返回正确答案。
但是这里有一个坑大家要注意:
- customer表中referee_id列是包含NULL值的,这就暗示我们不能简单的写一句WHERE referee_id <> 2(如果你像前面这么写条件查询语句就会华丽丽的报错❌)
理解了上面这个点,下面就讲讲此题的五种MySQL解法。
参考解法一:WHERE + OR 多个条件筛选
解题思路:
第一种解法是最简单易懂的,我们只需要在WHERE条件筛选语句后面再添加一个OR条件语句,即所有编号为NULL的也符合。
注意:这里要用IS NULL;不能用=NULL
!!!不能用=NULL
!!!不能用=NULL
!!!(重要的事情说三遍)
- 为什么不能用
=NULL
?
- 第一:因为MySQL官方文档中写道如果要搜索包含NULL的列值,使用“某一列=NULL”是不会返回任何行数据的,因为这个表达式不为True(真);
- 第二:与NULL的任何算术比较结果也是 NULL,所以是无法从此类比较中获得任何有意义的结果。
解法一只要搞清楚这个点就很简单。
参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE referee_id <> 2 OR referee_id IS NULL;
参考解法二:比较函数COALESCE()
解题思路:
第二种解法则是利用COALESCE()比较函数。先回顾一下COALESECE()比较函数的基本用法:
- COALESCE(value,…)
- 它会返回列表中的第一个非 NULL 值,如果没有非 NULL值则返回NULL。
因为有些行的推荐人编号是NULL值,所以根据COALESCE()用法,可以把这些编号NULL值替换为0;再用0和2进行比较判断(它是否等于2)。由于0肯定是不等于2的,那么条件为True,则返回客户名;否则为False,不返回客户名。
参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE COALESCE(referee_id,0) <> 2;
参考解法三:IFNULL()函数
刚刚第二个解法可能大家平时不容易想到,那么专门用来判断某个值是否为NULL的IFNULL()函数相对来说更好理解,也是此题最有效的解法。
解题思路
同样也是利用一个替换的思维,先通过IFNULL()的两个条件表达式把推荐人编号是NULL值的替换为0,再用0和2进行比较。
参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE IFNULL(referee_id,0) <> 2;
参考解法四:NOT IN + 子查询
解题思路
既然题目要找推荐人编号都不是2的客户,那么我们可以反向思维,先利用子查询找到所有编号为2的客户,再用NOT IN就能找到都不是2的客户名。
参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE id NOT IN (SELECT id FROM customer WHERE referee_id = 2);
参考解法五:NOT + <=>(即安全等于运算符)
解题思路
先简单介绍一下安全等于运算符<=>:
- 此运算符执行与 = 运算符类似的相等比较,如果两个数均为 NULL,则返回1;如果一个数为 NULL,另一个比较数是有意义的数字(比如1、2、3等),则返回0。
可以看出 <=>能用来对NULL值进行判断,那么回到这道题。当条件语句是referee_id <=> 2,找到的是编号都是2的客户,不符合题意,所以还要在前面加一个NOT。
参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE NOT referee_id <=> 2;
以上五种解法,推荐第一种和第三种,一个易懂,一个高效。其余三种可以了解,不要求掌握,当作思路的拓展。
今天的题解就到这里,如果对各位有帮助,麻烦大家一键三连,谢谢。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)