1. 程式人生 > >SQL Server 聚合函式與分組學習(group by)

SQL Server 聚合函式與分組學習(group by)

一、SQLServer裡面的常用的五種聚合函式。

1.Sum(和)-—對於NULL值預設為0

2.MAX(最大值)MIN(最小值)

3.AVG (平均值)—不統計空值,例如存在有四個人,但是隻有三個人有成績,平均成績為:總和/3

4.COUNT(數量)

--統計所有人分數總和
 select sum(score) from T_table
 
 --統計表中一共有多少條記錄
 select count(*) from T_table
 
 --求平均分數
 
 --方式一
 select
 平均分數=(select sum(score)as sumScore from T_table) *1.0/(select count(*) from T_table)
 
 --方式二
 select avg(score*1.0) from T_table
 
 --求分數最高的
 select max(score)from T_table 
 --求分數最低的
 select min(score)from T_table 

--最大日期與最小日期
select max(createTime )as 最大日期,min(createTime)as 最小日期 from T_table

效果展示:

 二、聚合函式使用注意事項

1.聚合函式不統計空值

1.Sum(和)-—對於NULL值預設為0

2.AVG (平均值)—不統計空值(null),例如存在有四個人,但是隻有三個人有成績,平均成績為:總和/3

 

--方式一
select
 平均分數=(select sum(score)as sumScore from T_table) *1.0/(select count(*) from T_table)
 
 --方式二
 select avg(score*1.0) from T_table

效果展示:

3.聚合函式如果沒有手動的Group By,預設整個表當做成一組,然後對組進行的統計

--統計表中一共有多少條記錄
 select count(*) from T_table

 三,分組(group by)

Select 查詢的時候,需要的資料進行彙總,這裡就用到了groupby 語句,分組一般都和聚合函式連用。下面我們介紹一個分組的小中例子,以及展示效果。

注意:(特別強調)

  1.group by 子句一定放在where 語句之後,與order by 都是對篩選後的資料進行處理,where後面匹配的是條件,通常是用來篩選資料的。

 2.沒有出現在group By 子句中的列是不能放在Select語句列名錶中(聚合函式除外)

 

      當使用了分組語句groupby 語句,或者聚合函式的時候,在select查選列表中,不能包含其他的列名,除非該列在group by 句子中,或者該列包含在某個聚合函式當中。

!!!錯誤例子:班級號是不可能存在select後面的。

select 
  班級號=class,
  性別=sex,
  人數=count(*)
from T_user
group by sex

例子學習:

--查詢每個班號存在所少人
select 
   class as 班號,
   班級人數 =count(*)
from T_user
group by class

--按照性別統計人數
select 
  性別=sex,
  人數=count(*)
from T_user
group by sex

--查詢每個班級男同學人數
select
  班級號=class,
  男同學人數=count(*)
from T_user
where sex='男'
group by class

效果展示:

四、Having 與where 的區別

where用來匹配條件,是分組前對每一條資料進行篩選,後面是不可以有聚合函式的,但是可以有任何列進行條件判斷篩選。having 是對分組後的每一組資料進行篩選,後面可以有聚合函式的,但是不一定有資料表中的任何列。

     通過上面概述,我們可以將select語句執行順序分為以下形式:

先 From 表   

ON

JOIN

 where 條件 

Group BY 列   

Having 篩選條件 

SELECT

DISTLNCT

Order By列

TOP

 

五,向表中插入多條資料(將一個表中的資料備份到另一個新的表中)

     1.例如將下面的T_user表中的資料完完全全的插入到一個不存在的表中,該如何實現呢?

程式碼:select into 語句不能重複執行,因為每次執行都會建立一個新的表,但是新的資料表不存在舊資料表的約束,只是備份了資料,表的結構沒有進行備份

--select * into 要插入的表 from 帶有資料的表 
select * into T_person from T_user  

 效果展示:

那麼如何只備份表的結構呢?

--只是拷貝了表的結構,但是沒有拷貝表的資料
select top 0 * into  T_data from T_user 

2.向一個已經存在資料表插入多條資料:(插入的時候,自增長的資料是不行的哦)

--例如將T_user表中的所有女同學插入到T_data表中
insert into T_data
select  sex, name, class
from T_user 
where sex='女'
 

效果展示

關於聚合函式和分組學習就先分享到這裡。如果本篇部落格對您有所幫助,記得點贊哦!