【LeetCode题库】584. 寻找用户推荐人 —— 简述:字段设置不允许为空(NOT NULL)的优点

我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~

原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~

如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持


原题

表: 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_Idnull 的隐形条件。

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带来的性能提升很小,除非允许为空确实带来了问题,否则不应该把它当成优先的优化措施,需要重点关注的是选择适合的列数据类型。

我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~

原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~

如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我梦Leo

谢谢无敌帅气可爱迷人的你哦 ~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值