如何理解sql語句的分組概念
在介紹group by 和having子句前,我們必需先講講sql語言中一種特殊的函數:聚合函數,例如sum、count、max、 avg等。這些函數和其它函數的根本區別就是它們一般作用在多條記錄上。 Sql代碼 select sum(population) from bbc select sum(population) from bbc 這里的sum作用在所有返回記錄的population字段上,結果就是該查詢只返回一個結果,即所有國家的總人口數。
通過使用group by子句,可以讓sum 和count這些函數對屬于一組的數據起作用。當你指定group by region 時,屬于同一個region(地區)的一組數據將只能返回一行值,也就是說,表中所有除region(地區)外的字段,只能通過 sum、count等聚合函數運算后返回一個值。
having子句可以讓我們篩選成組后的各組數據,where子句在聚合前先篩選記錄.也就是說作用在group by子句和having子句前.
而having子句在聚合后對組記錄進行篩選。
讓我們還是通過具體的實例來理解group by和having子句,還采用第三節介紹的bbc表。
SQL實例:
一、顯示每個地區的總人口數和總面積:Sql代碼 select region,sum(population),sum(area) from bbc group by region select region,sum(population),sum(area) from bbc group by region 先以region把返回記錄分成多個組,這就是group by的字面含義。分完組后,然后用聚合函數對每組中的不同字段(一或多條記錄)作運算。
二、 顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。Sql代碼 select region,sum(population),sum(area) from bbc group by region having sum(area)>1000000 select region,sum(population),sum(area) from bbc group by region having sum(area)>1000000 在這里,我們不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。
相反,having子句可以讓我們篩選成組后的各組數據.
SQL語句分組怎么寫
1.如果你的時間格式是2012-01-13 17:35:52.217這樣的形式,(主要是那個01不要是1),用下面這個 SELECT convert(varchar(10),時間,23),SUM(數字數據) FROM 表 group by convert(varchar(10),時間,23) 2.如果你的時間格式不是上面的格式,先轉化成datetime: SELECT convert(varchar(10),cast(時間 as datetime),23) ,SUM(數字數據) FROM 表 group by convert(varchar(10),cast(時間 as datetime),23) 3.如果報錯,請追問~。
SQL中分組短語是什么
SQL中分組短語是:group by。
GROUP BY 語句 GROUP BY 語句用于結合合計函數,根據一個或多個列對結果集進行分組。GROUP BY 語法 SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator valueGROUP BY column_name Group By 的使用:1、 Group By [Expressions]:這個恐怕是Group By語句最常見的用法了,Group By + [分組字段](可以有多個)。
在執行了這個操作以后,數據集將根據分組字段的值將一個數據集劃分成各個不同的小組。比如有如下數據集,其中水果名稱(FruitName)和出產國家(ProductPlace)為聯合主鍵:如果我們想知道每個國家有多少種水果,那么我們可以通過如下SQL語句來完成:SELECT COUNT(*) AS 水果種類, ProductPlace AS 出產國 FROM T_TEST_FRUITINFO GROUP BY ProductPlace這個SQL語句就是使用了Group By + 分組字段的方式,那么這句SQL語句就可以解釋成“我按照出產國家(ProductPlace)將數據集進行分組,然后分別按照各個組來統計各自的記錄數量。”
很好理解對吧。這里值得注意的是結果集中有兩個返回字段,一個是ProductPlace(出產國),一個是水果種類。
如果我們這里水果種類不是用Count(*),而是類似如下寫法的話:SELECT FruitName, ProductPlace FROM T_TEST_FRUITINFO GROUP BY ProductPlace那么SQL在執行此語句的時候會報如下的類似錯誤:選擇列表中的列 'T_TEST_*ame' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。這就是我們需要注意的一點,如果在返回集字段中,這些字段要么就要包含在Group By語句的后面,作為分組的依據;要么就要被包含在聚合函數中。
我們可以將Group By操作想象成如下的一個過程,首先系統根據SELECT 語句得到一個結果集,如最開始的那個水果、出產國家、單價的一個詳細表。然后根據分組字段,將具有相同分組字段的記錄歸并成了一條記錄。
這個時候剩下的那些不存在于Group By語句后面作為分組依據的字段就有可能出現多個值,但是目前一種分組情況只有一條記錄,一個數據格是無法放入多個數值的,所以這里就需要通過一定的處理將這些多值的列轉化成單值,然后將其放在對應的數據格中,那么完成這個步驟的就是聚合函數。這就是為什么這些函數叫聚合函數(aggregate functions)了。
2、 Group By All [expressions] :Group By All + 分組字段, 這個和前面提到的Group By [Expressions]的形式多了一個關鍵字ALL。這個關鍵字只有在使用了where語句的,且where條件篩選掉了一些組的情況才可以看出效果。
在SQL Server 2000的聯機幫助中,對于Group By All是這樣進行描述的:如果使用 ALL 關鍵字,那么查詢結果將包括由 GROUP BY 子句產生的所有組,即使某些組沒有符合搜索條件的行。沒有 ALL 關鍵字,包含 GROUP BY 子句的 SELECT 語句將不顯示沒有符合條件的行的組。
其中有這么一句話“如果使用ALL關鍵字,那么查詢結果將包含由Group By子句產生的所有組。沒有ALL關鍵字,那么不顯示不符合條件的行組。”
這句話聽起來好像挺耳熟的,對了,好像和LEFT JOIN 和 RIGHT JOIN 有點像。其實這里是類比LEFT JOIN來進行理解的。
還是基于如下這樣一個數據集:首先我們不使用帶ALL關鍵字的Group By語句:SELECT COUNT(*) AS 水果種類, ProductPlace AS 出產國 FROM T_TEST_FRUITINFO WHERE (ProductPlace <> 'Japan') GROUP BY ProductPlace那么在最后結果中由于Japan不符合where語句,所以分組結果中將不會出現Japan。現在我們加入ALL關鍵字:SELECT COUNT(*) AS 水果種類, ProductPlace AS 出產國 FROM T_TEST_FRUITINFO WHERE (ProductPlace <> 'Japan') GROUP BY ALL ProductPlace重新運行后,我們可以看到Japan的分組,但是對應的“水果種類”不會進行真正的統計,聚合函數會根據返回值的類型用默認值0或者NULL來代替聚合函數的返回值。
3、 GROUP BY [Expressions] WITH CUBE | ROLLUP:首先需要說明的是Group By All 語句是不能和CUBE 和 ROLLUP 關鍵字一起使用的。首先先說說CUBE關鍵字,以下是SQL Server 2000聯機幫助中的說明:指定在結果集內不僅包含由 GROUP BY 提供的正常行,還包含匯總行。
在結果集內返回每個可能的組和子組組合的 GROUP BY 匯總行。GROUP BY 匯總行在結果中顯示為 NULL,但可用來表示所有值。
使用 GROUPING 函數確定結果集內的空值是否是 GROUP BY 匯總值。結果集內的匯總行數取決于 GROUP BY 子句內包含的列數。
GROUP BY 子句中的每個操作數(列)綁定在分組 NULL 下,并且分組適用于所有其它操作數(列)。由于 CUBE 返回每個可能的組和子組組合,因此不論指定分組列時所使用的是什么順序,行數都相同。
我們通常的Group By語句是按照其后所跟的所有字段進行分組,而如果加入了CUBE關鍵字以后,那么系統將根據所有字段進行分組的基礎上,還會通過對所有這些分組字段所有可能存在的組合形成的分組條件。