MySQL查询:是否有任何查询“不在<空白>”?

时间:2016-05-08 23:14:33

标签: mysql sql

是否有任何查询

  

“在....但不在......”?

假设我有一张关于“双重间谍”的表格。

此表格包含姓名,国籍和年龄。

+-------------------------+
| Name    Nationality Age |
+-------------------------+
| Jony    US          20  |
| Jony    China       20  |
| Adam    Argentina   25  |
| Lukas   China       39  |
| Lukas   US          39  |
+-------------------------+

然后我计划为所有具有中国国籍而非美国的代理人输出一份清单。

我写的是什么

  

从国籍='中国'和国籍的代理商中选择姓名!='美国'

正如预测的那样,它没有打印任何东西,因为它是错误的。

我知道也许这是一个愚蠢的答案,但任何人都可以纠正我吗?谢谢。

4 个答案:

答案 0 :(得分:2)

我会使用聚合和having来完成此操作。我认为最明确的方法是:

select name
from agent
group by name
having sum(nationality = 'China') > 0 and
       sum(nationality = 'US') = 0;

肯定有其他方法。这是一个不需要select distinctgroup by的人:

select a.name
from agent a
where a.nationality = 'China' and
      not exists (select 1 from agent a2 where a2.name = a.name and a2.nationality = 'US');

对于agent(nationality, name)agent(name, nationality)上的索引,这可能具有最佳性能。

答案 1 :(得分:0)

你可以这样做

SELECT DISTINCT name 
from agent 
where  nationality = 'China' 
and nationality <> 'US';

答案 2 :(得分:0)

您可以使用两个工具来完成这项工作:

  1. distinct:这可以让你摆脱重复
  2. 用于过滤掉美国人的子查询。

    选择     不同的名字 从     代理人 哪里     国籍='中国'     并不存在(         选择             *         从             代理人         哪里             国籍='美国'     )

答案 3 :(得分:0)

如果您要选择位于中国但不是美国的所有座席,您可以在having

中应用过滤器
select name from mytable
where nationality in ('US', 'China')
group by name
having sum(nationality = 'US') = 0

请注意,在您的示例数据中,所有位于中国的代理商也在美国,因此在这种情况下此查询不会返回任何行。