1

我有一张表,ABC其中,和作为其字段。EMPLIDGRADESALARYDATE

我正在执行以下 3 条语句:

select count(*) from ABC;

结果:- 458

select count(*) from ABC where GRADE LIKE '%def%';

结果:- 0

select count(*) from ABC where GRADE NOT LIKE '%def%';

结果:- 428

我的意思是:第二次查询的结果加上第三次查询的结果应该等于第一次查询的结果,不是吗?

4

3 回答 3

7

看起来您有 30 条记录,其中 GRADE 为null

null值未知,因此不符合任一条件。

于 2013-05-29T13:01:54.690 回答
3

Sql 使用三值逻辑:真、假和未知。如果将 NULL 与任何其他值进行比较,则结果是未知的。NOT(unknown) 仍然未知。

WHERE 子句仅返回计算结果为 true 的行。因此,您的示例中缺少的 30 行在 Grade 列中有一个 NULL。

于 2013-05-29T13:06:13.737 回答
2

请注意,除了可以在表中包含值的明显情况NULL(正如其他人提到的那样)之外,您还可以有空字符串。

甲骨文中:

-- Returns nothing
select 1 from dual where '' like '%'

MySQL中:

-- Returns 1
select 1 from dual where '' like '%'

由于您使用标记了您的问题,因此您可能会在此处遇到不兼容问题,因为在 oracle 中'' IS NULL是正确的!

于 2013-05-29T13:11:03.163 回答