为什么在查询中将列添加到选择列表和分组会增加返回的行数?例如,下面是我的基本查询,但如果我添加列,我会返回更多行。添加的列越多,返回的行数就越多。看来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
答案 0 :(得分:5)
当您添加WHERE
子句时,它会过滤将在GROUP BY
旁边传递的行集,因此{/ 1}}会在之前应用组。将要执行的分组行以及WHERE
之类的聚合内容已经限制为与应用SUM(),MAX(),MIN(),COUNT()
之前的WHERE
条件相匹配的行。
关于为GROUP BY
和SELECT
添加列时获得更多行的原因 - 嗯,这就是GROUP BY
聚合工作的方式。如果在GROUP BY
中添加其他列,则还必须对它们进行分组(在大多数RDBMS中),只要值在行之间不同,它们就会产生更多的分组行。
考虑下表:
SELECT
Name Score
John 2
Bill 3
John 1
上的一个GROUP BY
会将Name
行合并为一行:
John
现在考虑一下这个表,它有另一个运动专栏。在这里,SELECT Name, SUM(Score) AS total
FROM scores
GROUP BY name
Name total
John 3
Bill 3
代表了2种不同的体育项目,而比尔只有1项。要在John
列表中同时包含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
答案 1 :(得分:1)
考虑表StudentScores:
+-----------+------------+-------+
| 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 |
+-----------+------------+-------+
答案 2 :(得分:1)
添加新的group-by会增加您看到的结果数量,每个group by
以另一种方式对数据进行分区。
如果您只使用聚合函数,则只获得单行结果,您对数据进行分组的次数越多,您将看到的结果行越多
where
子句控制由group by
执行的分组的输入。 having
子句(如果存在)将控制返回给用户的结果。