1. 程式人生 > >sql語句中GROUP BY 和 HAVING的使用 count()

sql語句中GROUP BY 和 HAVING的使用 count()

在介紹GROUP BY 和 HAVING 子句前,我們必需先講講sql語言中一種特殊的函式:聚合函式, 
例如SUM, COUNT, MAX, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。 

SELECT SUM(population) FROM bbc 

這裡的SUM作用在所有返回記錄的population欄位上,結果就是該查詢只返回一個結果,即所有 
國家的總人口數。 

having是分組(group by)後的篩選條件,分組後的資料組內再篩選
where則是在分組前篩選


通過使用GROUP BY 子句,可以讓SUM 和 COUNT 這些函式對屬於一組的資料起作用。 
當你指定 GROUP BY region 時, 屬於同一個region(地區)的一組資料將只能返回一行值. 


也就是說,表中所有除region(地區)外的欄位,只能通過 SUM, COUNT等聚合函式運算後返回一個值. 

HAVING子句可以讓我們篩選成組後的各組資料. 
WHERE子句在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前. 
而 HAVING子句在聚合後對組記錄進行篩選。 

讓我們還是通過具體的例項來理解GROUP BY 和 HAVING 子句,還採用第三節介紹的bbc表。 

SQL例項: 

一、顯示每個地區的總人口數和總面積. 
SELECT region, SUM(population), SUM(area)
FROM bbc# `& e4 k' X* n1 v% ?+ |

GROUP BY region
 先以region把返回記錄分成多個組,這就是GROUP BY的字面含義。分完組後,然後用聚合函式對每組中的不同欄位(一或多條記錄)作運算。# B* i' z  `, }* S, E5 i 


二、 顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。 
SELECT region, SUM(population), SUM(area)7 ]; Z& I! t% i
FROM bbc8 F4 w2 v( P- f
GROUP BY region
HAVING SUM(area)>1000000# y" P  z. O7 D9 `# X
在這裡,我們不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。
相反,HAVING子句可以讓我們篩選成組後的各組資料

三、查詢CUSTOMER 和ORDER表中使用者的訂單數

select c.name, count(order_number) as count from orders o,customer c where c.id=o.customer_id group by customer_id;

+--------+-------+
| name   | count |
+--------+-------+
| d      |     9 |
| cc     |     6 |
| 菩提子 |     1 |
| cccccc |     2 |
+--------+-------+

增加HAVING過濾

select c.name, count(order_number) as count from orders o,customer c where c.id=o.customer_id group by customer_id having count(order_number)>5;

+------+-------+
| name | count |
+------+-------+
| d    |     9 |
| cc   |     6 |
+------+-------+

四、我在多舉一些例子

SQL> select * from sc;

       SNO PNO        GRADE
---------- ----- ----------
         1 YW             95
         1 SX              98
         1 YY             90
         2 YW            89
         2 SX             91
         2 YY             92
         3 YW            85
         3 SX             88
         3 YY             96
         4 YW            95
         4 SX             89

       SNO PNO        GRADE
---------- ----- ----------
         4    YY            88

這個表所描述的是4個學生對應每科學習成績的記錄,其中SNO(學生號)、PNO(課程名)、GRADE(成績)。

1、顯示90分以上學生的課程名和成績

//這是一個簡單的查詢,並沒有使用分組查詢

SQL> select sno,pno,grade from sc where grade>=90;

       SNO PNO        GRADE
---------- ----- ----------
         1 YW            95
         1 SX             98
         1 YY             90
         2 SX             91
         2 YY             92
         3 YY             96
         4 YW            95

已選擇7行。

2、顯示每個學生的成績在90分以上的各有多少門

//進行分組顯示,並且按照where條件之後計數

SQL> select sno,count(*) from sc where grade>=90 group by sno;

       SNO   COUNT(*)
---------- ----------
         1          3
         2          2
         4          1
         3          1

3、這裡我們並沒有使用having語句,接下來如果我們要評選三好學生,條件是至少有兩門課程在90分以上才能有資格,列出有資格的學生號及90分以上的課程數。

//進行分組顯示,並且按照where條件之後計數,在根據having子句篩選分組

SQL> select sno,count(*) from sc where grade>=90 group by sno having count(*)>=2;

       SNO   COUNT(*)
---------- ----------
         1          3
         2          2

這個結果是我們想要的,它列出了具有評選三好學生資格的學生號,跟上一個例子比較之後,發現這是在分組後進行的子查詢。

4、學校評選先進學生,要求平均成績大於90分的學生都有資格,並且語文課必須在95分以上,請列出有資格的學生

//實際上,這個查詢先把語文大於95分的學生號提取出來,之後求平均值,分組顯示後根據having語句選出平均成績大於90的

SQL> select sno,avg(grade) from sc where SNO IN (SELECT SNO FROM SC WHERE GRADE>=95 AND PNO='YW') group by sno having avg(grade)>=90;

       SNO AVG(GRADE)
---------- ----------
         1    94.3333333
         4    90.6666667

5、查詢比平均成績至少比學號是3的平均成績高的學生學號以及平均分數

//having子句中可進行比較和子查詢

SQL> select sno,avg(grade) from sc
          group by sno
          having avg(grade) > (select avg(grade) from sc where sno=3);

相關推薦

sql語句GROUP BY HAVING的使用 count()

在介紹GROUP BY 和 HAVING 子句前,我們必需先講講sql語言中一種特殊的函式:聚合函式, 例如SUM, COUNT, MAX, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。 SELECT SUM(population) FROM bbc 

SQL語句 group by having 的用法

聚合函式:例如SUM, COUNT, MAX, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。 having是分組(group by)後的篩選條件,分組後的資料組內再篩選 where則是在分組前篩選 簡單來說,group by 相當於

sql語句 group by having 的使用

group by name :意為對name進行分組(name表示屬性) group by name having 條件A :意為對name分組後,再根據條件A進行刪選 例子: 表table name     course    score A         

SQL Server的GROUP BYHAVING子句

在介紹GROUP BY 和 HAVING 子句前,我們必需先講講sql語言中一種特殊的函式:聚合函式,例如SUM, COUNT, MAX, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。  SELECT SUM(population) FROM bbc

SQL復雜查詢語句-SELECT * FROM cs WHERE score>70 GROUP BY s_id HAVING COUNT(*)>1

規範 des 刪除索引 表數 _id 需求 null rop 其他 如果同時存在where,group by,的時候的執行順序應該是這樣的: 1,首先where後面添加條件把數據進行了過濾,返回一個結果集 2,然後group by將上面返回的結果集進行分組,返回一個結果集

SQL語句Group ByHaving需要注意的地方

SQL語句Group By、Having Group By語句需要注意的地方 select vend_id,count(*) as num_prods from products group by vend_id; GROUP BY子句可以

SQL ServerGroup by語句HAVING語句的使用

一、GROUP BY GROUP BY語句用來與聚合函式(aggregate functions such as COUNT, SUM, AVG, MIN, MAX.)聯合使用來得到一個或多個列的結果集。 語法如下 SELECT column1, column2, ..

LINQ體驗(7)——LINQ to SQL語句Group By/HavingExists/In/Any/All/Contains

我們繼續講解LINQ to SQL語句,這篇我們來討論Group By/Having操作符和Exists/In/Any/All/Contains操作符。 Group By/Having操作符 適用場景:分組資料,為我們查詢資料縮小範圍。 說明:分配並返回對傳入引數進行分組操作

sqlgroup by having 用法解析(張高偉)

--sql中的group by 用法解析: -- Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。 --它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行資料處理。 --注意:group by 是先排序後分組; --舉例子說明:

SQLgroup by having

包含 where lan tool 必知必會 平均工資 bin view IT 轉自:mysql必知必會——GROUP BY和HAVING GROUP BY語法可以根據給定數據列的每個成員對查詢結果進行分組統計,最終得到一個分組匯總表。 sele

MYSQL查詢語句 group byhaving count()講解--玉米都督

    在介紹GROUP BY 和 HAVING 子句前,我們必需先講講sql語言中一種特殊的函式:聚合函式,  例如SUM, COUNT, MAX, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。  SELECT S

Postgresql的分組函式(group by having

在通過了WHERE過濾器之後,生成的輸出表可以繼續用GROUP BY 子句進行分組,然後用HAVING子句刪除一些分組行。  Sql程式碼   SELECT select_list    FROM ...    [WHERE ...]    GROUP BY grou

借鑑了一堆資料庫group by 以及having count ()的用法,做個筆記,避免忘記

簡單的來說一個查詢語句,where 後面的條件是第一步篩選,如果後面有group  by + 欄位,having count()的話,就是第二步篩選,經過第二步篩選出來的結果每個欄位只有一條資料。group by 是把欄位相同所有資料來進行操作。第一步:先建立一個表第二步加入

SQL語句where,Group By,having order by 的詳細使用方法

1. Group By 語句簡介: Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行資料處理。 P.S. 這裡真是體會到了一個好的命名的力量,G

SQL系列四——分組(group byhaving

首先,建立資料表如下: 1、資料分組(GROUP BY): SQL中資料可以按列名分組,搭配聚合函式十分實用。 例,統計每個班的人數:  SELECT student_class,COUNT(ALL student_name) AS 總人數 FROM t_stud

group by having子句

列名 2010年 article 入職 maximum 標準 imu taf 分組查詢 GROUP BY語法可以根據給定數據列的每個成員對查詢結果進行分組統計,最終得到一個分組匯總表。 select子句中的列名必須為分組列或列函數,列函數對於group by

關於sql當中的group by partition by 的區別。

的區別 輸出 sel color 輸出類型 區別 inf col code 今天在做一個實驗的時候碰到了關於group by 和partition by 的區別,簡單的總結一下。 實驗的題目是,按照類型進行分組,然後對其金額進行累加。然後輸出類型對應的金額總和:

mysqlgroup byorder by同時使用無效的替代方案

前言 最近一年由於工作需要大部分使用的都是NoSql資料庫,對關係型資料庫感覺越來越陌生,一個由group by和order by 引發的血案由此而生。在此做個記錄,以備不時之需。 需求(得到所有barCode的最新的一條資料) 首先,看一下整體的表結構。 

sql語句的insert insert into 的區別?into有什麼用?

insert into tableName values(........)insert tableName (欄位名1,欄位名2,。。。)values(。。。。。。)看語句結構就知道區別了 。insert into 是直接對應表所有欄位,values裡必須包含所有欄位。insert是指定欄位對應,value

SQL語句not in not exist的區別

in和exists in 是把外表和內表作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。 如果查詢的兩個表大小相當,那麼用in和exists差別不大。 如果兩個表中一個較小,一個是