SQL之Group by和Having
在介紹GROUP BY 和 HAVING 子句前,我們必需先講講sql語言中一種特殊的函數:聚合函數,例如SUM, COUNT, MAX, AVG等。這些函數和其它函數的根本區別就是它們一般作用在多條記錄上。
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實例:
一、顯示每個地區的總人口數和總面積:
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回記錄分成多個組,這就是GROUP BY的字面含義。分完組後,然後用聚合函數對每組中的不同字段(一或多條記錄)作運算。
二、 顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在這裡,我們不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。
相反,HAVING子句可以讓我們篩選成組後的各組數據.
GROUP BY 子句。HAVING 的語法如下:
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1"
HAVING (函數條件)
請讀者注意: GROUP BY 子句並不是一定需要的。
在我們Store_Information 表格這個例子中,
Store_Information 表格
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
我們打入,
SELECT store_name, SUM(sales)
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500
結果:
store_name SUM(Sales)
Los Angeles $1800
在這一頁中,我們列出所有在這個網站有列出 SQL 指令的語法。若要更詳盡的說明,請點選指令名稱。
sql語法
Select
SELECT "欄位" FROM "表格名"
Distinct
SELECT DISTINCT "欄位"
FROM "表格名"
Where
SELECT "欄位"
FROM "表格名"
WHERE "condition"
And/Or
SELECT "欄位"
FROM "表格名"
WHERE "簡單條件"
{[AND|OR] "簡單條件"}+
In
SELECT "欄位"
FROM "表格名"
WHERE "欄位" IN ('值1', '值2', ...)
Between
SELECT "欄位"
FROM "表格名"
WHERE "欄位" BETWEEN '值1' AND '值2'
Like
SELECT "欄位"
FROM "表格名"
WHERE "欄位" LIKE {模式}
Order By
SELECT "欄位"
FROM "表格名"
[WHERE "條件"]
ORDER BY "欄位" [ASC, DESC]
Count
SELECT COUNT("欄位")
FROM "表格名"
Group By
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1"
Having
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1"
HAVING (欄位)
Create Table
CREATE TABLE "表格名"
("欄位 1" "欄位 1 資料種類",
"欄位 2" "欄位 2 資料種類",
... )
Drop Table
DROP TABLE "表格名"
Truncate Table
TRUNCATE TABLE "表格名"
Insert Into
INSERT INTO "表格名" ("欄位1", "欄位2", ...)
VALUES ("值1", "值2", ...)
Update
UPDATE "表格名"
SET "欄位1" = [新值]
WHERE {條件}
Delete From
DELETE FROM "表格名"
WHERE {條件}