仅选择包含特定值

时间:2015-10-08 18:57:40

标签: sql

首先,尽管这个SQL: How do you select only groups that do not contain a certain value?主题几乎与我的问题相同,但它并没有完全消除我对这个问题的困惑。

我们有一张桌子"联系人"喜欢这个:

+----------------------+
| Department FirstName |
+----------------------+
| 100 Thomas           |
| 200 Peter            |
| 100 Jerry            |
+----------------------+

首先,我想按部门编号对行进行分组,并显示每个显示组中的行数。我相信,这可以通过以下查询轻松完成。

SELECT Department, Count(*) As "Rows_in_group"
FROM Contacts
GROUP BY Department

这输出2组。首先是dep.no. 100包含2行,第二行200只包含一行。

但是,我想扩展查询以排除任何在某些列中不包含特定值的组(例如,FirstName中的Thomas)。以下是我的问题:

1)阅读上面提到的帖子我能够想出这个,这似乎工作正常:

SELECT Department, Count(*) As "Rows_in_group"
FROM Contacts
WHERE Department IN (SELECT Department FROM Contacts WHERE FirstName = "Thomas")
GROUP BY Department

问:这是如何运作的?我理解" WHERE部门IN"部分,但后来我期待一个值,但是包含了另一个嵌套查询,这对我来说并没有多大意义,因为我只是初学SQL。

2)偶然的我能够提出另一个似乎也有效的查询,但感觉很奇怪,而且我也不了解它的工作原理。

SELECT Department, Count(*) As "Rows_in_group"
FROM Contacts
GROUP BY Department
HAVING NOT SUM(FirstName = "Thomas") = 0

问:这是如何运作的?为什么改变:HAVING SUM(FirstName =" Thomas")> 0不起作用?

3)问:使用HAVING子句是否有任何简单而正确的方法?

我期待,那么简单" HAVING FirstName =' Thomas'"在GROUP BY之后会做出伎俩,因为它似乎遵循一种共同的语言,但事实并非如此。

请注意我希望查询选择整个群组,以便" WHERE FirstName =' Thomas'"不是我的问题的解决方案,因为它排除了在分组发生之前不满足条件的所有行(至少我理解它的方式)。

1 个答案:

答案 0 :(得分:0)

  问:这是怎么回事?我理解" WHERE Department IN"部分,   但后来我期待一个值,而是另一个嵌套查询   包括在内,对我来说没有多大意义,因为我只是初学者   用SQL。

嵌套查询返回用于与Department

匹配的值
  

2)偶然我能够提出另一个查询   似乎工作,但感觉很奇怪,我也不理解它   工作情况。

 HAVING NOT SUM(FirstName = "Thomas") = 0

"感觉很奇怪"因为,它是。这不是SUM函数的地方。

编辑:为什么这样做? 表达式FirstName = "Thomas"被评估为 true false (称为布尔表达式)。 True 在数字上等于1, False 转换为0(零)。通过包括SUM你然后计算总数,所以真的为零(仍然)意味着错误和"不是零"是真的。然后让它变得奇怪(呃)你包括NOT否定了整个事情它变成了非TRUE = 0或FALSE = FALSE(当然......是的)!!

编辑:我认为对您有用的是考虑何时使用WHERE以及何时使用HAVING(而不是布尔魔法发生) 。 来自this answer

WHERE子句在各行上引入了一个条件; HAVING子句引入了聚合的条件,即选择结果,其中从多行生成单个结果,例如计数,平均值,最小值,最大值或总和。

WHERE适用于您的示例,因为首先您想要"只返回行WHERE Department IN (100)"然后你想"按Department"对这些行进行分组。并获得COUNT已选择的行数。