为什么在查询中添加列和分组依据会增加返回的行数? 例如,下面是我的基本查询,但是如果我添加列,则会返回更多行。 添加的列越多,返回的行就越多。 似乎 where 子句条件应该是控制返回的行的唯一内容。
示例查询:
select pobj_name, max(prev) prev
from pfmc_part
where pmodel in ('PN-DWG', 'NO-DWG') and pstatus = 'RELEASED'
group by pobj_name
order by pobj_name
当你添加一个WHERE
子句时,它会过滤将在GROUP BY
旁边传递的行集,因此WHERE
在组之前应用。 在应用GROUP BY
之前,将要分组的行以及将对其执行SUM(),MAX(),MIN(),COUNT()
等聚合的行已限制为与WHERE
条件匹配的行。
至于为什么在将列添加到SELECT
和GROUP BY
中时会获得更多行 - 嗯,这就是聚合GROUP BY
的工作方式。 如果在SELECT
中添加其他列,则还必须对它们进行分组(在大多数 RDBMS 中),并且只要行之间的值不同,它们就会导致更多的分组行。
请考虑下表:
Name Score
John 2
Bill 3
John 1
Name
上的单个GROUP BY
会将John
行折叠为一行:
SELECT Name, SUM(Score) AS total
FROM scores
GROUP BY name
Name total
John 3
Bill 3
现在考虑此表,其中有另一列用于运动。 在这里,John
有 2 种不同的运动代表,而比尔只有 1 项。 要将这两个Name, Sport
都包含在SELECT
列表中,它们也必须都在GROUP BY
中。 跨行的相似值折叠成组,但现在John
有两组相似的值要分组:
Name Sport Score
John Baseball 3
John Bowling 9
Bill Baseball 10
Bill Baseball 6
John Bowling 12
SELECT Name, Sport, SUM(Score) AS total
FROM scores
GROUP BY Name, Sport
Name Sport total
John Baseball 3
John Bowling 21
Bill Baseball 16
因此,如果GROUP BY
列在行间具有不同的值,则向添加其他列将导致更多输出行。
将 WHERE
子句应用于第二个表以仅查找 John
行,将在应用组之前消除所有Bill
行。结果将是两行。
SELECT Name, Sport, SUM(Score) AS total
FROM scores
-- Filter with a WHERE clause this time
WHERE Name = 'John'
GROUP BY Name, Sport
-- Results in only John's rows
Name Sport Score
John Baseball 3
John Bowling 21
分数表:
+-----------+------------+-------+
| Last_Name | First_Name | Score |
+-----------+------------+-------+
| Smith | Bob | 90 |
| Smith | Bob | 85 |
| Smith | Alice | 100 |
| Smith | Alice | 90 |
| Johnson | Evelyn | 80 |
| Johnson | Evelyn | 85 |
+-----------+------------+-------+
此查询:
SELECT Last_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name
结果:
+-----------+-------+
| Last_Name | Score |
+-----------+-------+
| Smith | 100 |
| Johnson | 85 |
+-----------+-------+
但是,此查询:
SELECT Last_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name, First_Name
结果:
+-----------+-------+
| Last_Name | Score |
+-----------+-------+
| Smith | 90 |
| Smith | 100 |
| Johnson | 85 |
+-----------+-------+
那么有什么不同呢? 好吧,'Smith'
是两个学生的Last_Name
:
SELECT Last_Name, First_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name, First_Name
结果:
+-----------+------------+-------+
| Last_Name | First_Name | Score |
+-----------+------------+-------+
| Smith | Bob | 90 |
| Smith | Alice | 100 |
| Johnson | Evelyn | 85 |
+-----------+------------+-------+
分组依据会增加您看到的结果数量,group by
以另一种方式对数据进行分区。
如果您只使用聚合函数,则只会得到单行结果,对数据进行分组越精细,您看到的结果行就越多
where
子句控制由 group by
执行的分组的输入。having
子句(如果存在)将控制返回给用户的结果。