SQL – 这两个代码有什么区别?


select sex, id from qualification where cid = ('Male' or 'Female')

select sex, id from qualification where cid = 'Male' or cid = 'Female'

第一个代码生成所有的项目,而第二个代码给出我想要的。

从某种意义上说,我们不能在sql?

MySQL通常将cast值转换为另一种类型,以方便我们。其中一个例子是将字符串强制转换为number。

MySQL可以根据字符串的前导数将字符串转换为数字。例如:

select cast('test' as signed); //returns 0
select cast('1test' as signed); //returns 1

正如Gelu指出的,这在之前的另一个QA中已经讨论过了。

另一方面,true表示为1,false表示为0


现在让我们检查您的查询:

select sex, id from qualification where cid = ('Male' or 'Female')

让我们逐位解析where子句。

cid = ('Male' or 'Female')

or操作符接受两个boolean操作数。在你的情况下,是'Male''Female'。根据MySQL处理类型转换的方式,'Male''Female'都将返回0,因为它们根本没有前导数。

cid = (0 or 0)

两个操作数都为falseor将得到false。在解析('Male' or 'Female')之后,where子句将是:

cid = 0

假设cid列包含没有任何前导数字的字符串,我们可以断言所有cid都被转换为0。这将导致您的查询被重写为:

select sex, id from qualification where 0 = 0

这也意味着:

select sex, id from qualification where true

上面的查询将返回所有行。

编辑:答案是重大重组。我觉得前面的答案可能有点令人困惑。

最新更新