0

我正在使用什么: Ubuntu 12 上的最新 MySQL。

设置:假设我有一个表“EmployeePayment”,其中包含每个员工的“Name”和“Hours”。假设我已经用值填充了它。

问题: 当我使用命令时

select * from EmployeePayment where Name in ('');

正如我所料,我得到了空集。但是,当我使用

select * from EmployeePayment where Name in ('' or '');

我把整个桌子都退回了。此外,如果我很挑剔并输入命令

select Name, SUM(Hours) from EmployeePayment where Name in ('' or '');

然后它只返回表中的最高名称。这个“in”命令发生了什么?

4

3 回答 3

5

首先,您需要去掉 ,子句or的正确语法in使用逗号来分隔可能性,例如:

sql> select name from people where status in ('intelligent', 'good looking')
pax
1 row returned

您当前的变体正在做的是应用or运算符为您提供一个单元素列表。有关更多详细信息,请参见此处

您只为聚合查询获取一行的原因是因为您没有group by子句,因此您将所有行分组。大多数 DBMS 会抱怨有一个不属于分组的非聚合列,但 MySQL 在这方面的规则有点花哨和自由。

它显然是对整个表进行分组(应该如此),但将一些默认的聚合函数应用于名称(它可能不应该这样做,但根据其文档)。

这里介绍了这个 MySQL 扩展,但请注意警告:MySQL 可以为这些非聚合、非分组列选择任何可能的值,因此当您知道给定组中的所有行共享列的相同值。

于 2013-06-14T23:13:08.833 回答
1

您正在有效地执行此操作:

select * from EmployeePayment where Name in (0);

OR 表达式的计算结果为0,并WHERE Name IN (0);返回所有行。您必须使用IN其他答案中建议的正确语法:

SELECT * FROM EmployeePayment WHERE Name IN ('foo', 'bar');
于 2013-06-14T23:19:03.693 回答
0

IN使用逗号分隔值,例如:WHERE Name IN ('tim','beth')

所以试试WHERE Name IN ('','');

但更重要的是,你为什么要检查一个值在哪里是空的或空的?还是只是为了解决问题?

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in

于 2013-06-14T23:15:50.973 回答