我很惊讶地看到IS NULL和= NULL在select查询中产生不同的结果.他们之间有什么区别?什么时候用.如果你能详细解释我,我会很高兴的.
我在MySQL表中有一个名为CODE的列,它可以是NULL.假设我有一些CODE ='C'的行,我想在我的select结果集中忽略它.我的结果集中可以有CODE = NULL或CODE!='C'.
以下查询不返回CODE为NULL的行:
SELECT * from TABLE where CODE!='C'
Run Code Online (Sandbox Code Playgroud)
但是这个查询按预期工作,我知道这是正确的方法.
SELECT * from TABLE where CODE IS NULL OR CODE!='C'
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么只有CODE!='C'不返回CODE = NULL的行?绝对'C'不是NULL.我们在这里没有比较一个角色的价值.有人可以说明为什么它不起作用?
我没有问,如果它.我知道事实并非如此.
我很好奇原因.我已经阅读了支持文档,例如关于在MySQL中使用Nulls的支持文档,但它们并没有给出任何理由.他们只重复你必须使用的"是空"的口头禅.
这一直困扰着我.在进行动态SQL(那些必须要做的极少数时间)时,将"null"传递给where子句会更容易:
@where = "where GroupId = null"
Run Code Online (Sandbox Code Playgroud)
这将是常规变量的简单替换.相反,我们必须使用if/else块来执行以下操作:
if @groupId is null then
@where = "where GroupId is null"
else
@where = "where GroupId = @groupId"
end
Run Code Online (Sandbox Code Playgroud)
在更大更复杂的查询中,这是一个巨大的痛苦.有没有特定的原因,SQL和所有主要的RDBMS供应商都不允许这样做?它会产生某种关键字冲突或价值冲突?
编辑:
许多答案的问题(在我看来)是每个人都在设置null和"我不知道它的值是什么"之间的等价.这两件事之间存在巨大差异.如果null意味着"有一个值,但它是未知的"我会100%同意空值不能相等.但SQL null并不意味着.这意味着没有价值.任何两个为null的SQL结果都没有值. 没有价值不等于未知价值.两件不同的事情.这是一个重要的区别.
编辑2:
我遇到的另一个问题是其他HLL允许null = null完全正常并适当地解决它.例如,在C#中,null = null返回true.
我在SQL Server 2012数据库的表上有一个列.
我试图检索此位列为NULL或不正确的所有行.
此查询不会带回它应该的内容:(返回0行)
Select *
from table
where bit_column_value <> 1
Run Code Online (Sandbox Code Playgroud)
此查询返回正确的行:
Select *
from table
where bit_column_value IS NULL
Run Code Online (Sandbox Code Playgroud)
现在,我很乐意使用第二个查询,但我的问题是,在另一个表的类似查询中,上面的反向是正确的,第一种方式有效,但第二种方式不行!
有人可以协助解释上面的差异吗?我已经专门更新了相关的位列为NULL,这不会改变结果.(想想也许"空"和Null价值之间存在差异.
提前感谢您的任何解释.
在Sql Server中,NULL不等于NULL。(为什么在SQL Server 中NULL = NULL求值为false)那么以下代码为什么返回单个NULL。
CREATE TABLE #TEMP1
(ID INT)
INSERT INTO #TEMP1
SELECT NULL
UNION ALL
SELECT NULL
SELECT DISTINCT ID FROM #TEMP1
DROP TABLE #TEMP1
ID
------
NULL
Run Code Online (Sandbox Code Playgroud)
我期望
ID
------
NULL
NULL
Run Code Online (Sandbox Code Playgroud) table 'materials'
id sku content
10 IT2 Iron
11 IT3 Steel
12 IT4 Steel
13 IT5 NULL
14 IT6 Iron
15 IT7 Glass
select id, sku, content from materials where content !='Iron';
Run Code Online (Sandbox Code Playgroud)
返回结果:
id sku content
11 IT3 Steel
12 IT4 Steel
15 IT7 Glass
Run Code Online (Sandbox Code Playgroud)
为什么在结果集中没有返回NULL值的id#13?使用MYSQL.
对于什么x是
表达
x IS NOT NULL是不等于NOT(x IS NULL),如在2VL的情况下
(引用这个答案,引用Fabian Pascal 数据库管理中的实际问题 - 思维从业者的参考 - 接近答案的结尾)
我的猜测是什么时候 这个猜测是不正确的.x IS NULL 是 NULL,但我无法猜测是什么时候(即我没有检查SQL标准).
如果您生成一个查询以在表"MyTab"中插入数据列--- Age,Sex,DOB,ID
INSERT INTO MyTab
VALUES (22, '', '', 4)
Run Code Online (Sandbox Code Playgroud)
Sex&DOB专栏的价值是多少?它是NULL吗?
如果值为NULL则---
SELECT * FROM MyTab
WHERE Sex=NULL
Run Code Online (Sandbox Code Playgroud)
上面的查询给出了输出----没有选择行---为什么?
如果值不为NULL则---
SELECT * FROM Mytab
WHERE Sex IS NULL
Run Code Online (Sandbox Code Playgroud)
上面的查询给出了输出----如何?
我有一个2500万行的表,索引适当.
但添加该子句AND status IS NULL会将超快速查询转换为疯狂的慢查询.
请帮我加快速度.
查询:
SELECT
student_id,
grade,
status
FROM
grades
WHERE
class_id = 1
AND status IS NULL -- This line delays results from <200ms to 40-70s!
AND grade BETWEEN 0 AND 0.7
LIMIT 25;
Run Code Online (Sandbox Code Playgroud)
表:
CREATE TABLE IF NOT EXISTS `grades` (
`student_id` BIGINT(20) NOT NULL,
`class_id` INT(11) NOT NULL,
`grade` FLOAT(10,6) DEFAULT NULL,
`status` INT(11) DEFAULT NULL,
UNIQUE KEY `unique_key` (`student_id`,`class_id`),
KEY `class_id` (`class_id`),
KEY `status` (`status`),
KEY `grade` (`grade`)
) ENGINE=INNODB DEFAULT …Run Code Online (Sandbox Code Playgroud)