以下查询之间的区别是什么?它是如何工作的?
SELECT * FROM some_table WHERE col IS NOT NULL
&安培;
SELECT * FROM some_table WHERE col <> ''
此致 拉克
答案 0 :(得分:8)
NULL
是特殊数据类型,意味着没有价值。
另一方面,空字符串表示字符串或值为空。
两者都不同。
例如,如果表格中有name
字段,默认情况下您已将其设置为NULL
。如果没有为它指定任何值,它将是NULL
但如果您指定实名或空字符串,则它不会是NULL
,而是包含空字符串。
答案 1 :(得分:5)
NULL
缺乏价值,通常表示有意义的事情,例如未知或未确定。例如,如果我今天启动项目,则StartDate
为2012-02-25
。如果我不知道该项目需要多长时间,那么EndDate
应该是什么?我可能知道ProjectedEndDate
可能是什么,但我会将EndDate
设置为NULL
,并在项目完成时更新它。
''
是一个零长度(或“空”)字符串。技术上并不缺少数据,因为它实际上可能是有意义的。例如,如果我没有中间名,则根据您的数据模型''
可能比NULL
更有意义,因为后者意味着未知但''
可能意味着它已知我没有。 NULL
当然可以以相同的方式使用,但是很难解释它是否存在,或者知道它是否存在。许多标准都有可能未知的事物的专用值 - 例如Gender
我相信9个不同的字符代码,因此如果未指定M
或F
,我们总是确切知道为什么(未知,未指明,变性等)。还要考虑HeartRate
是NULL
的情况 - 它是因为没有脉冲,还是因为我们还没有采用它?
它们不尽相同,但遗憾的是很多人对它们的看法相同。如果您的列允许NULL
,则表示您事先知道有时您可能不知道此信息。如果您不是将它们视为同一个东西,那么您的查询会有所不同。例如,如果col
不允许NULL
,则您的第一个查询将始终返回表中的所有结果,因为它们都不能是NULL
。但是NOT NULL
仍允许输入空字符串,除非您还设置了检查约束以防止零长度字符串。
NOT NULL
约束不会与LEN(col)>0
检查约束相结合。如果两者都被允许则存在的问题是,如果列为NULL
或列为“空”,则很难知道它意味着什么 - 它们可以表示同样的事情,但它们可能不是 - 这会因商店而异。
另一个关键点是NULL
与任何事物(至少在SQL Server *
中默认情况下)进行比较,评估为未知,而后者的计算结果为false。例如,这些查询 all 返回0
:
DECLARE @x TABLE(i INT);
INSERT @x VALUES(NULL);
SELECT COUNT(*) FROM @x WHERE i = 1;
SELECT COUNT(*) FROM @x WHERE i <> 1;
SELECT COUNT(*) FROM @x WHERE i <= 3;
SELECT COUNT(*) FROM @x WHERE i > 3;
SELECT COUNT(*) FROM @x WHERE i IN (1,2,3);
SELECT COUNT(*) FROM @x WHERE i NOT IN (1,2,3);
由于where子句中的比较总是评估为未知,因此它们总是返回false,因此没有行符合条件,所有计数都返回0
。
此外,dba.stackexchange上这个问题的答案可能很有用:
https://dba.stackexchange.com/questions/5222/why-shouldnt-we-allow-nulls
*
您可以使用SET ANSI_NULLS OFF
更改此内容 - 但不建议这样做,因为它提供了非标准行为,因为这个“功能”has been deprecated since SQL Server 2005并且将成为不op在SQL Server的未来版本中。但您可以使用上面的查询,看到NOT IN
与SET ANSI_NULLS OFF
的行为不同。
答案 2 :(得分:2)
NULL表示缺少值,但''表示值存在,但只是空字符串 所以第一个查询意味着查询col值没有丢失的所有行,第二个意味着选择那些col不等于空字符串的行
更新
有关详细信息,建议您阅读本文:
https://sqlserverfast.com/blog/hugo/2007/07/null-the-databases-black-hole/
答案 3 :(得分:1)
Select * from table where col IS NOT NULL
将返回从Select * from table where col <> ‘’
排除的结果,因为空字符串也是非NULL。
答案 4 :(得分:0)
SET NOCOUNT ON;
DECLARE @tbl AS TABLE (value varchar(50) NULL, description varchar(50) NOT NULL);
INSERT INTO @tbl VALUES (NULL, 'A Null'), ('', 'Empty String'), ('Some Text', 'A non-empty string');
SELECT * FROM @tbl;
SELECT * FROM @tbl WHERE value IS NOT NULL;
SELECT * FROM @tbl WHERE value <> '';
请注意,在显示中您无法区分NULL和'' - 这只是网格和文本客户端如何显示数据的工件,但是集合中的数据以不同的方式存储为NULL和''。
答案 5 :(得分:0)
如其他答案中所述,NULL
表示“无值”,而空字符串''
表示空字符串。您可以将允许NULLs
的字段视为可选字段 - 可以忽略它们,并且可能无法提供它们的值。
想象一下,一个应用程序,被访者选择他们的头衔(先生,夫人,小姐,博士),但你不需要他/她选择任何一个并留空。在这种情况下,您将NULL置于相关的数据库字段中。
NULL
和空字符串之间的区别可能并不明显,因为如果您决定,它们都可能意味着“没有价值”。这完全取决于您,但使用NULL
会更好,主要是因为它是数据库的特殊情况,旨在快速有效地处理NULL(比字符串快得多)。如果您使用它而不是空字符串,您的查询将更快,更可靠。