我已经有一段时间没有在 mysql 上工作了,我很惊讶地发现以下语句是有效的:UPDATE table_A SET col_a = valueWHERE id;看起来 MySQL 更新了表中的所有行。我有良好的 MSSQL 背景,我试图理解为什么这在 MySql 中有效?另外,我在 varchar 列上运行了一个具有类似 where 子句的查询:SELECT distinct descriptionFROM table_A where NOT description;我认为它只会返回 null 或空值。相反,它返回大量具有非空值的行。有什么想法吗?
1 回答
蛊毒传说
TA贡献1895条经验 获得超3个赞
WHERE x
x
将匹配计算结果为真值的任何行。由于BOOLEAN
实际上是数字类型TINYINT(1)
,因此它的工作原理是转换为数字,然后与零进行比较 - 任何非零数字都是真实的。(NULL
是假的。)
如果你写,那么仅对于isWHERE id = 123
的行,表达式将计算为(与 相同)并且它会匹配,否则它将计算为()。id
123
id = 123
TRUE
1
FALSE
0
但如果你写WHERE id
,则要求id
计算结果为真值。如果id
是一个数字,则只有 ID 0
,NULL
将是假的。
但是,在 的情况下description
,您有一个字符串。并且字符串首先被转换为数字。您获得许多结果的原因是任何以数字(非零)开头的字符串都是匹配的,例如01234hello
(转换为非零的 1234)。检查CONVERT(description, SIGNED)
给出的内容 - 如果它非零,则它匹配。
这就是为什么在代码中构建AND
或OR
查询时,您可以通过以TRUE
or 1
(在这种AND
情况下)或FALSE
or 0
(在这种OR
情况下)开头来避免专门处理零条件的情况,因为WHERE TRUE
/WHERE 1
是有效的(匹配所有内容),就像WHERE FALSE
/ WHERE 0
(不匹配任何内容)。WHERE 1
因此,您可以通过以下方式开始并添加以下内容来构建查询: WHERE 1
、WHERE 1 AND id = 123
、WHERE 1 AND id = 123 AND type = 'xy'
等。
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报
0/150
提交
取消