584. 寻找用户推荐人

88 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

一、题目

给定表 customer ,里面保存了所有客户信息和他们的推荐人。

+------+------+-----------+
| id   | name | referee_id|
+------+------+-----------+
|    1 | Will |      NULL |
|    2 | Jane |      NULL |
|    3 | Alex |         2 |
|    4 | Bill |      NULL |
|    5 | Zack |         1 |
|    6 | Mark |         2 |
+------+------+-----------+

写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。

对于上面的示例数据,结果为:

+------+
| name |
+------+
| Will |
| Jane |
| Bill |
| Zack |
+------+

来源:力扣(LeetCode)

链接:leetcode.cn/problems/fi…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、操作

  • 创建数据表
CREATE TABLE customer(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	referee_id INT
);
  • 插入数据
INSERT INTO customer VALUES (NULL, "Will", NULL),
(NULL, "Jane", NULL),
(NULL, "Alex", 2),
(NULL, "Bill", NULL),
(NULL, "Zack", 1),
(NULL, "Mark", 2);
  • 展示数据

image.png

  • 判断条件 这里的条件是不是2,不是2 分为两种第一种不是null,第二种是数字不为2的条件 分别处理

不能为null

SELECT NAME FROM customer WHERE referee_id IS NULL;

不能等于2

// 不等于2 有两种写法,第一种就常规的 != 第二种是<> ,建议使用第二种<>
SELECT NAME FROM customer WHERE referee_id != 2;
SELECT NAME FROM customer WHERE referee_id <> 2;

现在是求两种结果的并集,因此用or

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

但在这里,想起了之前的union求交集。这里出现了问题,在leetcode中,是运行不过的 但是在本地执行了,是能得到结果的。这里仅供参考

SELECT NAME FROM customer WHERE referee_id IS NULL UNION SELECT NAME FROM customer WHERE referee_id <> 2;
  • 得到的结果如下

image.png

三、测试结果

语句执行结果

image.png

四、总结

OR 和 UNION的区别

  • 对于索引列使用UNION, UNION在进行表链接后会筛选掉重复的记录, 会对所产生的的结果集进行排序,删除重复后再返回结果。
  • OR把符合条件的都查询出来并区集,不会去掉重复的记录
  • OR 主要用于筛选条件,UNION 可以连接两个以上的SELECT语句的。在大数量量的情况下UNION都要优于OR的。