一、基本SQL語句
1犯祠、基本執(zhí)行順序
SELECT
DISTINGCT(T1.name)
FROM table_name1 T1
JOIN table_name2 T2
ON T2.t1_id = T1.id
WHERE T1.name = 'test'
GROUP BY T1.class
HAVING AVG(T1.age)
ORDER BY createTime DESC
LIMIT 1,10;
2旭等、說明
FORM: 對FROM的左邊的表和右邊的表計算笛卡爾積。產(chǎn)生虛表VT1
ON: 對虛表VT1進行ON篩選衡载,只有那些符合<join-condition>的行才會被記錄在虛表VT2中搔耕。
JOIN: 如果指定了OUTER JOIN(比如left join、 right join)痰娱,那么保留表中未匹配的行就會作為外部行添加到虛擬表VT2中弃榨,產(chǎn)生虛擬表VT3, rug from子句中包含兩個以上的表的話,那么就會對上一個join連接產(chǎn)生的結(jié)果VT3和下一個表重復(fù)執(zhí)行步驟1~3這三個步驟梨睁,一直到處理完所有的表為止鲸睛。
WHERE: 對虛擬表VT3進行WHERE條件過濾。只有符合<where-condition>的記錄才會被插入到虛擬表VT4中
GROUP BY: 根據(jù)group by子句中的列坡贺,對VT4中的記錄進行分組操作官辈,產(chǎn)生VT5.
CUBE | ROLLUP: 對表VT5進行cube或者rollup操作,產(chǎn)生表VT6.
HAVING: 對虛擬表VT6應(yīng)用having過濾遍坟,只有符合<having-condition>的記錄才會被 插入到虛擬表VT7中拳亿。
SELECT: 執(zhí)行select操作,選擇指定的列愿伴,插入到虛擬表VT8中肺魁。
DISTINCT: 對VT8中的記錄進行去重。產(chǎn)生虛擬表VT9.
ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進行排序操作隔节,產(chǎn)生虛擬表VT10.
LIMIT:取出指定行的記錄鹅经,產(chǎn)生虛擬表VT11, 并將結(jié)果返回。
- 寫的順序:
select ... from. where.. group by.. having.. order by.. limit [offset,] (rows)
- 執(zhí)行順序:
from... where...group by... having.... select ... order by... limit
3怎诫、WHERE瘾晃、HAVING 的區(qū)別
WHERE
是一個約束聲明,使用Where來約束來之?dāng)?shù)據(jù)庫的數(shù)據(jù)刽虹,Where是在結(jié)果返回之前起作用的酗捌,且Where中不能使用聚合函數(shù)。HAVING
是一個過濾聲明,是在查詢返回結(jié)果集以后對查詢結(jié)果進行的過濾操作胖缤,在Having中可以使用聚合函數(shù)尚镰。HAVING
子句可以讓我們篩選成組后的各組數(shù)據(jù),WHERE
子句在聚合前先篩選記錄,也就是說作用在GROUP BY
子句和HAVING子
句前哪廓;而HAVING
子句在聚合后對組記錄進行篩選狗唉。
1、實例
- 顯示每個地區(qū)的總?cè)丝跀?shù)和總面積:
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回記錄分成多個組涡真,這就是GROUP BY的字面含義分俯。分完組后,然后用聚合函數(shù)對每組中的不同字段(一或多條記錄)作運算哆料。
- 顯示每個地區(qū)的總?cè)丝跀?shù)和總面積.僅顯示那些人口數(shù)量超過1000000的地區(qū)缸剪。并通過sum后的字段進行排序
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(population)>1000000
ORDER BY sum(population) desc
<font color='red'>用having就一定要和group by連用,
用group by不一有having (它只是一個篩選條件用的)</font>
二东亦、聚合函數(shù)
1杏节、常用聚合函數(shù)
- 平均值
AVG
- 標(biāo)準(zhǔn)偏差
STDEV
- 方差
VAR
- 最大值
MAX
- 最小值
MIN
- 合計
SUM
- 次數(shù)
COUNT
- 極差值
MAX-MIN
- 變異系數(shù)
STDEV/AVG*100
SELECT Name AS '射擊手' ,
AVG(Score) AS '平均值' ,
STDEV(Score) AS '標(biāo)準(zhǔn)偏差' ,
VAR(Score) AS '方差' ,
MAX(Score) AS '最大值' ,
MIN(Score) AS '最小值' ,
MAX(Score) - MIN(Score) AS '極差值' ,
STDEV(Score) / AVG(Score) AS '變異系數(shù)' ,
COUNT(Score) AS '次數(shù)'
FROM @t1
GROUP BY Name
2、為什么要用標(biāo)準(zhǔn)差?
方差和標(biāo)準(zhǔn)差時表示一組數(shù)據(jù)離散程度的最好指標(biāo)典阵,是最常用的差異量數(shù)奋渔。
-
其特點有:
- 1、反應(yīng)靈敏壮啊,每個數(shù)據(jù)變化都應(yīng)在方差上體現(xiàn)嫉鲸;
- 2、計算嚴(yán)密歹啼;
- 3玄渗、容易計算;
- 4狸眼、適合代數(shù)運算捻爷;
- 5、受抽樣變動影響蟹萜蟆;
- 6巡莹、簡單明了司志;
- 7、容易受極端數(shù)據(jù)影響降宅。
計算方差的步驟可概括為“先平均骂远,后求差,平方后腰根,再平均”.
方差用來衡量一批數(shù)據(jù)的波動大小.(即這批數(shù)據(jù)偏離平均數(shù)的大小).
方差越大,說明數(shù)據(jù)的波動越大,越不穩(wěn)定.
3激才、變異系數(shù):
變異系數(shù)又稱“標(biāo)準(zhǔn)差率”,是衡量資料中各觀測值變異程度的另一個統(tǒng)計量。當(dāng)進行兩個或多個資料變異程度的比較時瘸恼,如果度量單位與平均數(shù)相同劣挫,可以直接利用標(biāo)準(zhǔn)差來比較。如果單位和(或)平均數(shù)不同時东帅,比較其變異程度就不能采用標(biāo)準(zhǔn)差压固,而需采用標(biāo)準(zhǔn)差與平均數(shù)的比值(相對值)來比較。
4靠闭、極差值:
指一組數(shù)據(jù)中最大數(shù)據(jù)與最小數(shù)據(jù)的差帐我,在統(tǒng)計中常用極差來刻畫一組數(shù)據(jù)的離散程度。
4愧膀、注意
having放在group by 的后面
group by 后面只能放非聚合函數(shù)的列
where 子句的作用是在對查詢結(jié)果進行分組前拦键,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù)檩淋,條件中不能包含聚組函數(shù)芬为,使用where條件顯示特定的行。
having 子句的作用是篩選滿足條件的組狼钮,即在分組之后過濾數(shù)據(jù)碳柱,條件中經(jīng)常包含聚組函數(shù),使用having 條件顯示特定的組熬芜,也可以使用多個分組標(biāo)準(zhǔn)進行分組莲镣。
用having就一定要和group by連用,
用group by不一有having (它只是一個篩選條件用的
三涎拉、實例
- 查詢每個租戶對應(yīng)的用戶數(shù)量瑞侮,且用戶數(shù)量大于10,并且以數(shù)量倒序排序
SELECT a.tenantId,COUNT(1)
FROM fsmuserex a
WHERE !a.deleted
GROUP BY a.tenantId
HAVING COUNT(1) > 10
ORDER BY COUNT(1) DESC;