You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

NOT EXISTS用法疑问:为何SQL根节点查询选项D不可行?

为什么选项D不对?详解NOT EXISTS的用法

Hey, I get why you're confused about option D—let's break this down step by step to clarify how NOT EXISTS works, and why it doesn't fit here.

先明确题目要求

我们要找的是根节点的ID和data,根节点的核心特征是:它没有父节点,也就是parent_id的值为NULL。


为什么选项A是对的?

选项A的语句是:

SELECT id, data FROM Node WHERE parent_id IS NULL;

这完全符合需求:

  • 我们要查询根节点的iddata,所以SELECT id, data是正确的目标列;
  • 在SQL中,判断一个列是否为NULL必须用IS NULL(因为NULL不等于任何值,包括它自己,parent_id = NULL是永远不会成立的,这也是选项C错误的原因),所以WHERE parent_id IS NULL精准筛选出了没有父节点的根节点。

为什么选项D完全不可行?

选项D写的是SELECT id, data FROM Node WHERE NOT EXISTS parent id,问题出在两个关键地方:

1. 语法完全错误

NOT EXISTS是SQL中的一个谓词,它的语法规则非常严格:必须紧跟一个子查询(用括号包裹),用来检查这个子查询是否返回任何行。它不能直接跟一个列名(比如parent id,就算写成正确的parent_id也不行)。

举个NOT EXISTS的正确用法例子:如果我们要找没有子节点的叶子节点,可以这么写:

SELECT id, data FROM Node AS parent
WHERE NOT EXISTS (
    SELECT 1 FROM Node AS child
    WHERE child.parent_id = parent.id
);

这里NOT EXISTS后面的子查询用来检查当前节点是否有子节点,如果子查询没有返回行(说明没有子节点),当前行就会被选中。

2. 逻辑也不符合根节点的判断

就算忽略语法错误,NOT EXISTS parent_id的逻辑也和“根节点”不沾边。NOT EXISTS是用来判断“是否不存在满足条件的行”,而根节点的判断是“自身的父节点为NULL”,这完全是两个不同的逻辑场景。


再快速排除其他选项

  • 选项C:parent_id = NULL是错误的NULL判断方式,SQL中永远不会成立;
  • 选项E:选了parent_id作为查询列(题目要的是根节点的ID,也就是id),而且id != NULL也是错误的NULL判断写法;
  • 选项B:显然不对,因为A是正确的。

内容的提问来源于stack exchange,提问作者MrKnudz

火山引擎 最新活动