我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
原题
表: Customer
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| name | varchar |
| referee_id | int |
+-------------+---------+
在 SQL 中,id 是该表的主键列。
该表的每一行表示一个客户的 id、姓名以及推荐他们的客户的 id。
找出那些 没有被 id = 2
的客户 推荐 的客户的姓名。
以 任意顺序 返回结果表。
结果格式如下所示。
示例 1:
输入:
Customer 表:
+----+------+------------+
| id | name | referee_id |
+----+------+------------+
| 1 | Will | null |
| 2 | Jane | null |
| 3 | Alex | 2 |
| 4 | Bill | null |
| 5 | Zack | 1 |
| 6 | Mark | 2 |
+----+------+------------+
输出:
+------+
| name |
+------+
| Will |
| Jane |
| Bill |
| Zack |
+------+
题解
题解一:使用 !=
和 IS NULL
。
SELECT
name
From
Customer
WHERE
referee_id != 2 OR referee_id IS NULL;
题解二:使用 <>
和 IS NULL
。
SELECT
name
From
Customer
WHERE
referee_id <> 2 OR referee_id IS NULL;
解题笔记
这道题如果粗心点,凭借第一反应,很容易仅想到 referee_Id != 2
一个条件,而忽略了 referee_Id
为 null
的隐形条件。
SELECT name FROM customer WHERE referee_Id != 2;
SELECT name FROM customer WHERE referee_Id <> 2;
或者是写法错误: = NULL
SELECT name FROM customer
WHERE referee_Id != 2 OR referee_id = NULL;
SELECT name FROM customer
WHERE referee_Id <> 2 OR referee_id = NULL;
MySQL 使用三值逻辑 —— TRUE, FALSE 和 UNKNOWN。任何与 NULL 值进行的比较都会与第三种值 UNKNOWN 做比较。这个“任何值”包括 NULL 本身!这就是为什么 MySQL 提供 IS NULL 和 IS NOT NULL 两种操作来对 NULL 特殊判断。
因此,在 SELECT 查询时,如果有值为空的情况, WHERE 语句中我们需要做一个额外的条件判断 IS NULL 或is not null
扩展:实际开发中,字段设置不允许为空(NOT NULL)的优点
在我们实际开发中,对数据库字段模型设计时,字段设置尽可能不允许为空(NOT NULL),并设置默认值。原因有下
- 索引的字段可以为 NULL值,索引的效率会下降。
- NULL值在timestamp类型下容易出问题,特别是没有启用参数(explicit_defaults_for_timestamp)。
- NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回永远为空结果,查询容易出错。
- Null 列需要更多的存储空间:需要一个额外字节作为判断是否为 NULL 的标志位。
- 当用 COUNT 函数进行统计时,NULL 列不会计入统计。
- 使用 CONCAT 函数拼接时,首先要对各个字段进行非 NULL 判断,否则只要任何一个字段为空都会造成拼接的结果为 NULL。
- 能减少部分代码层面的空指针异常。
- 允许为NULL值的字段,在更新为非NULL值的时候。更新无法做到原地更新,更容易发生索引分裂,从而影响性能。
- 但是这只是尽可能,并不是必须,在适合的前提下,尽可能不为空。
- 在SQL性能优化阶段(不是设计阶段),把NULL列改为NOT NULL带来的性能提升很小,除非允许为空确实带来了问题,否则不应该把它当成优先的优化措施,需要重点关注的是选择适合的列数据类型。
我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持