mysql SQL -这两种代码有什么区别?

c90pui9n  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(122)
select sex, id from qualification where cid = ('Male' or 'Female')

对比

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

第一个代码将生成所有的项目,而第二个给我想要的。
从某种意义上说,我们不能在括号中有或有sql?

wrrgggsh

wrrgggsh1#

为了方便起见,MySQL通常会将一个值cast转换为另一个类型。例如,将字符串转换为数字。
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)

or的两个操作数的值都为false,结果为false。解析('Male' or 'Female')后,where子句将为:

cid = 0

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

select sex, id from qualification where 0 = 0

也就是说:

select sex, id from qualification where true

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

编辑:对答案进行了重大调整。我觉得之前的答案可能有点混乱。

相关问题