Where子句没有运算符

时间:2015-06-17 08:02:01

标签: mysql

在尝试回答this question时,我发现了一种我认为错误的语法

select * from table where area and block

我尝试了一个sqlFiddle,发现它是有效的。

但我一直无法找到它是如何运作的(我找到的所有文档都包括运营商)......

尝试使用sql fiddle here

似乎"消除" null和0结果为可空int字段,或0结果为非可空int字段。

它看起来像保持varchar值...包含int值(但不是' 0')!

即使我认为(根本没有)使用这样的语法也是一个好主意,如果有人对如何管理这些语法有任何解释,我将不胜感激...

3 个答案:

答案 0 :(得分:2)

来自MySQL documentation for Logical Operators

  

MySQL将任何非零非NULL值评估为TRUE。例如,以下语句都评估为TRUE:

mysql> SELECT 10 IS TRUE;<br/>
-> 1
mysql> SELECT -10 IS TRUE;<br/>
-> 1
mysql> SELECT 'string' IS NOT NULL;<br/>
-> 1

它似乎将任何非零int字段评估为TRUE。此外,包含数字的任何varchar字段都会被视为数字字段。我检查了你的小提琴,varchar '0'字段评价为TRUE。任何无法转换为数字的varchar字段都不会评估为TRUE,除非它是IS NOT NULL表达式的一部分。因此:

mysql> SELECT 'string' IS TRUE;<br/>
-> 0

通过测试您的小提琴,我发现以下2个查询的行为相同:

select * from test where ttt;
select * from test where ttt IS TRUE;

我没有任何明确的证据或源代码,但看起来MySQL实际 在上面的第一个查询中使用运算符,即使它被省略。

答案 1 :(得分:2)

为Tim Biegeleisen的回答添加一些澄清......

WHERE子句中,MySQL将表达式计算为 boolean 值。如果该表达式的结果为TRUE,则返回该行。否则,排除该行。

WHERE子句中的表达式 not 需要具有比较运算符。但是比较运算符/操作的结果(例如, foo = 'x' )是布尔值是很方便的。

在MySQL中,布尔 TRUE值表示为整数值1,FALSE表示为整数值0,NULL(当然)为{{1 }}。我们可以观察到这种行为,例如

NULL

返回:

 SELECT TRUE + TRUE AS c1, FALSE AS c2

在MySQL中,有很多表达式可以在 boolean 上下文中进行评估。 (我不能想到一个不能表达的表达式,尽管MySQL似乎对于返回DECIMAL值的表达式似乎很松散。)

Tim的回答表明MySQL正在添加 c1 c2 ---- ---- 2 0 比较,并且这两个语句被等效地评估:

IS TRUE

这并不太遥远,因为在很多情况下,这些查询会返回相同的结果。但这并不是最好的解释,因为这两个陈述的实际评价不同;这些返回不同的会导致某些极端情况。作为演示,请考虑:

  SELECT * FROM test WHERE ttt;
  SELECT * FROM test WHERE ttt IS TRUE;

一个语句返回一行,另一个不返回。 SQL Fiddle here: http://sqlfiddle.com/#!9/63960/1

实际上是 CREATE TABLE test (ttt DECIMAL(18,9) PRIMARY KEY); INSERT INTO test (ttt) VALUES (0.48); 子句需要将表达式计算为布尔值。这排除了表达式未评估为TRUE的行。

WHERE是针对布尔值的表达式foo IS TRUE的测试。参考:https://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#operator_is

我们希望它们是相同的,但如前所述,foo测试可以提供与IS TRUE子句中表达式的评估不同的结果。

WHERE子句中,表达式被计算为布尔值。

布尔上下文中的评估整数值相对容易... NULL(当然)为NULL,整数值WHERE为FALSE,任何其他非零整数值为0

对于十进制/数值的评估稍微有些松散,在布尔上下文中,值为foo,其中TRUE,这些值不会计算为TRUE。我们通过构建表达式使转换显式化而不是默认为MySQL的隐式舍入行为来解决这个问题:

-0.5 > foo > 0.5

甚至可以在布尔上下文中评估字符串。 MySQL隐式地将字符串转换为数字。然后遵循与数值相同的规则。

更好地匹配WHERE子句中 SELECT * FROM test WHERE CEIL(ABS(ttt)); 的评估的SQL表达式是:

foo

(我不是说这实际上是MySQL正在执行的操作;我只是说这个表达式为我们提供了一个更接近匹配MySQL执行操作的返回。)

对于foo的各种字符值:

  ABS(SIGN(ROUND(t.foo+0,0))) AS `ASR foo+0`

答案 2 :(得分:-3)

它基本上显示所有数据库结果而不进行任何过滤。如果使用某个运算符,则查询将在该运算符条件上运行。