我的查询 -
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之后,那么你会返回更多的记录然后你想要分组.首先应用它,减少记录集然后应用分组.
该where子句出现在 the 之前group by,因为从概念上讲,您在分组之前进行过滤,而不是在之后进行过滤。您希望将分组的输出限制为仅匹配的输出,而不是对可能因过滤器而丢弃的项目进行分组。
| 归档时间: |
|
| 查看次数: |
26585 次 |
| 最近记录: |