sql—mysql中的“flag is true”和“flag=true”有什么区别?

prdp8dxp  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(655)

我在mysql中运行了以下查询-

SELECT * from table
WHERE valid is TRUE
ORDER BY priority DESC 
limit 10 
offset 0;

所用时间=1秒。

SELECT * from table
WHERE valid = TRUE 
ORDER BY priority DESC 
limit 10 
offset 0;

所用时间=66 ms。
我在(valid,priority)和(valid)上有索引。为什么会有如此巨大的差异?是真与=真有什么区别?

dwthyt8l

dwthyt8l1#

根据mysql doc for is operator
是布尔值
根据布尔值测试值,其中布尔值可以是true、false或unknown。
在sql中,布尔值(true、false或unknown)是真值。当使用is运算符时,测试所针对的值必须表示/转换为这些真值之一,然后对表达式求值。
在第一个查询中: SELECT * from table WHERE valid is TRUE ORDER BY priority DESC limit 10 offset 0; 根据有效列的数据类型,将为每一行计算真值,这将导致全表扫描,因此您将看到更高的时间。
在第二个查询中: SELECT * from table WHERE valid = TRUE ORDER BY priority DESC limit 10 offset 0; 当您使用=运算符时,您将有效列与boolean literal true进行比较,boolean literal true只是1的mysql常量。

xienkqul

xienkqul2#

有一个非常重要的区别: IS TRUE 只有“真”或“假” = TRUE 可以返回 NULL .
特别地 NULL IS TRUE 返回“false”。
实际上,这对我来说并不重要 IS TRUE . 对我来说这是一个很大的区别 IS NOT TRUENOT 或者 <> true .
就是这样 IS TRUE 以及 IS NOT TRUE 是“空安全的”:

where NULL IS NOT TRUE  --> evaluates to true and all rows are returned
where NOT NULL          --> evaluates to NULL and no rows are returned
where NULL <> TRUE      --> evaluates to NULL and no rows are returned

这个 NULL 这可能是一个返回 NULL 价值观。
文档中清楚地解释了这些语义。

6yjfywim

6yjfywim3#

这两者在语义上有区别。
is运算符用于测试某个值是否为真、假或未知。
根据文件: IS boolean_value Tests a value against a boolean value, where boolean_value can be TRUE, FALSE, or UNKNOWN. mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1 对于“=”运算符来说,这只是一种将要比较的内容相等的方法。在查询中,您使用的是valid to be set to true。
因此,根据您的用例,您将使用操作符。在您当前的查询中,它们看起来好像做了相同的事情。

相关问题