了解WHERE如何使用GROUP BY和Aggregation

dav*_*ine 10 sql

我的查询 -

select cu.CustomerID,cu.FirstName,cu.LastName, COUNT(si.InvoiceID)as inv --1
from Customer as cu inner join SalesInvoice as si --2
on cu.CustomerID = si.CustomerID -- 3
-- put the WHERE clause here ! --4   
group by cu.CustomerID,cu.FirstName,cu.LastName -- 5
where cu.FirstName = 'mark' -- 6
Run Code Online (Sandbox Code Playgroud)

用正确的代码输出 -

在此输入图像描述

我得到错误 - 关键字'where'附近的语法不正确.

你能告诉我为什么会收到这个错误吗?我想知道为什么WHERE出现在GROUP BY之前而不是之后.

Tar*_*ryn 22

你订单错了.该WHERE条款在GROUP BY:

select cu.CustomerID,cu.FirstName,cu.LastName, COUNT(si.InvoiceID)as inv 
from Customer as cu 
inner join SalesInvoice as si 
   on cu.CustomerID = si.CustomerID 
where cu.FirstName = 'mark' 
group by cu.CustomerID,cu.FirstName,cu.LastName
Run Code Online (Sandbox Code Playgroud)

如果你想在之后执行过滤器GROUP BY,那么你将使用一个HAVING子句:

select cu.CustomerID,cu.FirstName,cu.LastName, COUNT(si.InvoiceID)as inv 
from Customer as cu 
inner join SalesInvoice as si 
   on cu.CustomerID = si.CustomerID 
group by cu.CustomerID,cu.FirstName,cu.LastName
having cu.FirstName = 'mark' 
Run Code Online (Sandbox Code Playgroud)

HAVING子句通常用于聚合函数滤波,所以是非常有意义的,这将在之后被施加GROUP BY

要了解操作顺序,请参阅解释订单的文章.从文章中SQL的操作顺序是:

首先,我认为查找执行SQL指令的顺序会很好,因为这将改变我可以优化的方式:

FROM clause
WHERE clause
GROUP BY clause
HAVING clause
SELECT clause
ORDER BY clause
Run Code Online (Sandbox Code Playgroud)

使用此顺序,您将在WHEREa之前应用过滤器GROUP BY.该WHERE用于限制的记录数.

可以这样想,如果你在申请WHERE之后,那么你会返回更多的记录然后你想要分组.首先应用它,减少记录集然后应用分组.


tva*_*son 7

where子句出现在 the 之前group by,因为从概念上讲,您在分组之前进行过滤,而不是在之后进行过滤。您希望将分组的输出限制为仅匹配的输出,而不是对可能因过滤器而丢弃的项目进行分组。