sql – 了解WHERE如何使用GROUP BY和Aggregation

我的查询
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.LastName -- 5
where cu.FirstName = 'mark' -- 6

输出正确的代码

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

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

解决方法

你订单错了. WHERE子句在GROUP BY之前:
select cu.CustomerID,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.LastName

如果要在GROUP BY之后执行过滤器,则将使用HAVING子句:

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

HAVING子句通常用于聚合函数过滤,因此在GROUP BY之后应用它是有意义的

要了解这里的操作顺序是article explaining the order.从文章sql的操作顺序是:

To start out,I thought it would be good to look up the order in which sql directives get executed as this will change the way I can optimize:

FROM clause
WHERE clause
GROUP BY clause
HAVING clause
SELECT clause
ORDER BY clause

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

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

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03