力扣584.寻找用户推荐人 - 你应该知道的五种MySQL解法

2023-05-16

题目链接:584.寻找用户推荐人

解题思路

此题思路其实很简单:只需要在条件查询中筛选推荐人编号都不是2的用户就能返回正确答案。
但是这里有一个坑大家要注意

  • customer表中referee_id列是包含NULL值的,这就暗示我们不能简单的写一句WHERE referee_id <> 2(如果你像前面这么写条件查询语句就会华丽丽的报错❌)
    • 好奇的小伙伴肯定想问为什么不能这么写?因为当要查询的条件字段包含NULL值时,如果直接用不等于(即<>!=)的比较运算符,结果是会排除NULL值所在行数据。
    • 也就是说,如果你写下面这个查询语句,它只会返回推荐人编号为1的用户名(即Zack),其余的都会被排除。
      SELECT name FROM customer 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(使用前将#替换为@)

力扣584.寻找用户推荐人 - 你应该知道的五种MySQL解法 的相关文章

  • ubuntu18.04部署jenkins,图文并茂,记录一下。

    1 因为Jenkins运行需要jdk的环境 xff0c 所以首先得安装Java xff0c 先下载jdk安装包 xff08 听说用wget下载安装时会有问题 xff0c 说是什么Oracle的安装协议 xff0c 本人用wget亲测 xff
  • 通过hdparm将挂载的硬盘休眠再关机

    hdparm Y dev sda1 root 64 cubietruck plus span class token comment hdparm span hdparm get set hard disk parameters versi
  • 教程 | 简单实用的pandas技巧:如何将内存占用降低90%

    pandas 是一个 Python 软件库 xff0c 可用于数据操作和分析 数据科学博客 Dataquest io 发布了一篇关于如何优化 pandas 内存占用的教程 xff1a 仅需进行简单的数据类型转换 xff0c 就能够将一个棒球
  • 哈佛大学cs50课程笔记_哈佛CS50指南:如何为您选择正确的课程(带有免费证书)

    哈佛大学cs50课程笔记 In January I wrote an article on Class Central about CS50 Harvard s Introduction to Computer Science which
  • 使用Docker快速安装部署mysql

    使用Docker快速安装部署mysql的前提 xff1a 首先需要确保已经安装了Docker环境 如果没有安装Docker的话 xff0c 可以参考上一篇的内容 xff1a Linux上安装Docker 有了Docker环境后 xff0c
  • docker下gitlab安装配置使用(完整版)

    docker 安装gitlab以及使用 一 安装及配置 1 gitlab镜像拉取 gitlab ce为稳定版本 xff0c 后面不填写版本则默认pull最新latest版本 docker pull gitlab gitlab ce 拉取镜像
  • Linux 配置Gradle

    一 下载gradle 如果windows中有可以直接拷贝 xff0c 如果没有可以去官网下载 http www gradle org downloads 二 解压下载得到的gradle unzip gradle 2 2 1 all zip
  • gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)

    首先祭出官网文档链接 xff1a https docs gitlab com omnibus settings smtp html 其实官网已经说的很清楚了 xff0c 并且给出了QQ邮箱的范例 xff08 BAT还是屌的 xff09 1
  • 文本编辑器Notepad++使用技巧

    除了语法高亮 xff0c 一般不用操作 还有两点经常使用的 xff1a 正则表达式查找替换和列模式编辑 这些可以在VS Eclipse Word等里也有 xff0c 但是有时打开一个文件就慢了 本来想总结记录一下技巧的 xff0c 却无意中
  • linux系统磁盘block、inode占满处理

    1 磁盘的block占满 xff0c 查看命令 df vh 然后查看占用百分比 2 磁盘inode占满 xff0c 查看命令df ih 同样也是查看占用百分比 block占满处理办法 需要用到的命令如下 LL 列出当前目录下的文件 df v
  • Code::Blocks平台下Fortran的编译

    问题背景 xff1a 因为之前学习数值方法 xff0c 有用到Fortran的地方 xff0c 所以上网查了一些资料 关于Fortran语言的编辑器安装 xff0c 目前本人接触到的支持Fortran的编辑器有VisualStdio和Cod
  • powershell远程连接

    在Linux中 xff0c 我们可以使用安全的SSH方便的进行远程管理 但在Windows下 xff0c 除了不安全的Telnet以外 xff0c 从Windows Server 2008开始提供了另外一种命令行原创管理方式 xff0c 那
  • 2022年学习总结暨2023年规划

    2022年总结 2022年是我在C站的创作元年 xff0c 在第一年也收获了不少成就 xff0c 比如 Java领域新星创作者 发布100篇博文 拿到了C站的书包 吃到了C站的月饼 成功上榜了330 43 截止目前收获粉丝8600 43 在
  • 《Prometheus+Grafana 实践派》专栏介绍

    专栏名称 Prometheus 43 Grafana 实践派 专栏介绍 本专栏根据本公司统一监控落地实践编写 在该专栏您将学到 企业级监控的选型Prometheus的基础知识Grafana的基础知识快速搭建Prometheus 43 Gra
  • 泊松分布–计算概率分布的公式

    Probability Distributions play an important role in our daily lives We commonly use them when trying to summarise and ga
  • Prometheus 的介绍和安装

    介绍 Prometheus 是一个开源的监控和报警系统 最初由SoundCloud于2012年创建 随着越来越多的公司采用Prometheus以及非常活跃的社区 Prometheus于2016年加入云原生基金会 成为Kubernetes之后
  • 因为锁的问题,我们被扣了1万

    前言 春节放假期间 xff0c 一个项目上的积分接口被刷 xff0c 而且不止一个人在刷 xff0c 并且东西也被兑走 xff0c 放假晚上被人叫起来排查问题 xff0c 通过这个人的积分明细观察 xff0c 基本一秒就能获取一次 xff0
  • Prometheus 告警机制介绍及命令解读

    本文您将了解到Prometheus 告警模块Alertmanager的架构介绍 核心概念 命令解析和AMTool的基本使用 Prometheus的告警模块并不存在于Prometheus中 而是 以独立项目Alertmanager存在 Pro
  • Prometheus 告警模块配置深度解析

    本文您将了解到Prometheus 告警模块Alertmanager 配置的深度解析 Alertmanager 配置解析 Alertmanager 配置可以用命令行配置 也可以通过配置文件配置 命令行用来配置不可变的系统参数 配置文件用来定
  • 不会前端没事,用GWT Boot和Spring Boot构建Web程序

    本文介绍了一种使用Java构建Web应用程序的方式 xff0c 其中GWT或者J2CL是必不可少的 xff0c 另外还有多个UI框架可以配套使用 xff0c 比如Domino UI VueGWT GWT Material Design GM

随机推荐