group by /having / where 区别

where过滤无法做到,因为where语句的执行在分组之前,因此过滤在分组之前。并且,where只能过滤行,不能过滤分组。(where中不能使用聚合函数)

having可以对group分组的结果集进行过滤,因其执行在分组之后,并其过滤可以基于分组聚集值。(having子句中可以直接使用聚合函数)

有这样的说法,“having子句中的列只能是group by子句中的列或者聚合函数的列”。实际上这也可以用上面所说的来解释--having在group by分组后才执行。

总结:

涉及到对分组结果集的过滤操作,都用having。

非分组结果集的操作,行级的操作,用where。

PS:“HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待它们。”                        ----摘录来自: Ben Forta. “SQL必知必会(第4版)”。 iBooks. 

但是自己在使用having时应该注意要结合group by 子句,而where子句用于标准的行级过滤。

例:你可能想要列出至少有两个订单的所有顾客。

SELECT cust_id, COUNT(*) AS orders FROM Orders 

GROUP BY cust_id 

HAVING COUNT(*) >= 2;

子查询

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

前10条记录

select top 10 * form table1 where 范围

随机取出10条数据

select top 10 * from tablename order by newid()

随机选择记录

select newid()

猜你喜欢

转载自blog.csdn.net/xmh594603296/article/details/81879717