mysql數(shù)據(jù)分組:過濾分組
發(fā)表時間:2023-08-31 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]mysql過濾分組除了能用group by分組數(shù)據(jù)外,MySQL還允許過濾分組,規(guī)定包括哪些分組,排除哪些分組。例如,可能想要列出至少有兩個訂單的所有顧客。為得出這種數(shù)據(jù),必須基于完整的分組而不是個別的進(jìn)行過濾。我們已經(jīng)看到了where子句的作用。但是,在這個例子中where不能完成任務(wù),因為wh...
mysql過濾分組除了能用group by分組數(shù)據(jù)外,MySQL還允許過濾分組,規(guī)定包括哪些分組,排除哪些分組。例如,可能想要列出至少有兩個訂單的所有顧客。為得出這種數(shù)據(jù),必須基于完整的分組而不是個別的進(jìn)行過濾。
我們已經(jīng)看到了where子句的作用。但是,在這個例子中where不能完成任務(wù),因為where過濾指定的是行而不是分組。事實上,where沒有分組概念。
那么,不使用where使用什么呢?MySQL為此目的提供了另外的子句,那就是having子句。having非常類似于where。事實上,目前為止所學(xué)過的所有類型的where子句都可以用having來替代。唯一的差別是where過濾行,而having過濾分組。
注意:having支持所有的where操作符。
那么,怎么過濾分組呢?請看下面的例子:
輸入:
select cust_id,count(*) as orders from orders group by cust_id having count(*) >= 2;
輸出:
分析:這條select語句的前3行類似于上面的語句。最后一行增加了having子句,它過濾count(*>)>=2(兩個以上的訂單)的那些分組。
正如所見,這里where子句不起作用,因為過濾是基于分組聚集值而不是特定行值的。
having和where的差別:這里有另一種理解方法,where在數(shù)據(jù)分組前進(jìn)行過濾,having在數(shù)據(jù)分組后進(jìn)行過濾。這是一個重要的區(qū)別,where排除的行不包括在分組中。這可能會改變計算值,從而影響having子句中基于這些值過濾掉的分組。
那么,有沒有在一條語句中同時使用where和having子句的需要呢?事實上,確實有。假如想進(jìn)一步過濾上面的語句,使它返回過去12個月內(nèi)具有兩個以上的顧客。為達(dá)到這一點,可增加一條where子句,過濾出去12個月內(nèi)下過的訂單。然后再增加having子句過濾出具有兩個以上訂單的分組。
為更好的理解,請看下面的例子,它列出具有2個(含)以上、價格為10(含)以上的產(chǎn)品供應(yīng)商:
輸入:
select vend_id,count(*) as num_prods from products where prod_price >= 10 group by vend_id having count(*) >=2;
輸出:
分析:這條語句中,第一行是使用了聚集函數(shù)的基本 SELECT ,它與前面的例子很相像。 WHERE 子句過濾所有 prod_price 至少為 10 的行。然后按 vend_id 分組數(shù)據(jù), HAVING 子句過濾計數(shù)為 2 或 2 以上的分組。
如果沒有 WHERE 子句,將會多檢索出兩行(供應(yīng)商 1002 ,銷售的所有產(chǎn)品價格都在 10 以下;供應(yīng)商 1001 ,銷售3個產(chǎn)品,但只有一個產(chǎn)品的價格大于等于 10 ):
輸入:select vend_id,count(*) as num_prods from products group by vend_id having count(*) >=2;
輸出:
【相關(guān)推薦】
mysql數(shù)據(jù)分組和排序及SELECT子句順序
mysql數(shù)據(jù)分組:創(chuàng)建分組
以上就是mysql數(shù)據(jù)分組:過濾分組的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。