在尝试回答this question时,我发现了一种我认为错误的语法
select * from table where area and block
我尝试了一个sqlFiddle,发现它是有效的。
但我一直无法找到它是如何运作的(我找到的所有文档都包括运营商)......
尝试使用sql fiddle here
似乎"消除" null和0结果为可空int字段,或0结果为非可空int字段。
它看起来像保持varchar值...包含int值(但不是' 0')!
即使我认为(根本没有)使用这样的语法也是一个好主意,如果有人对如何管理这些语法有任何解释,我将不胜感激...
答案 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)
它基本上显示所有数据库结果而不进行任何过滤。如果使用某个运算符,则查询将在该运算符条件上运行。