携手创作,共同成长!这是我参与「掘金日新计划 · 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)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、操作
- 创建数据表
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);
- 展示数据
- 判断条件 这里的条件是不是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;
- 得到的结果如下
三、测试结果
语句执行结果
四、总结
OR 和 UNION的区别
- 对于索引列使用UNION, UNION在进行表链接后会筛选掉重复的记录, 会对所产生的的结果集进行排序,删除重复后再返回结果。
- OR把符合条件的都查询出来并区集,不会去掉重复的记录
- OR 主要用于筛选条件,UNION 可以连接两个以上的SELECT语句的。在大数量量的情况下UNION都要优于OR的。