--?? ?? Tips:聚合和排序
--?? ?一、對(duì)表進(jìn)行聚合查詢
-- 1.聚合函數(shù)
-- (1)5 個(gè)常用函數(shù):
-- ①COUNT:計(jì)算表中的記錄(行)數(shù)婶博。
-- ②SUM:計(jì)算表中數(shù)值列的數(shù)據(jù)合計(jì)值。
-- ∑钢场③AVG:計(jì)算表中數(shù)值列的數(shù)據(jù)平均值。
-- ⌒腥稹④MAX:求出表中任意列中數(shù)據(jù)的最大值奸腺。
-- ⑤MIN:求出表中任意列中數(shù)據(jù)的最小值血久。
-- ⊥徽铡(2)聚合:將多行匯總成一行。
--2.計(jì)算表中數(shù)據(jù)的行數(shù)
--示例
SELECT COUNT(*)?? ??? ?-- *:參數(shù)氧吐,這里代表全部列
FROM dbo.Conbio;
--------------------------------------
--3.計(jì)算 NULL 以外數(shù)據(jù)的行數(shù)
-- 將 COUNT(*) 的參數(shù)改成指定對(duì)象的列讹蘑,就可以得到該列的非 NULL 行數(shù)末盔。
SELECT COUNT(Conbio_price2)
FROM dbo.Conbio;
--【備注】除了 COUNT 函數(shù),其它函數(shù)不能將星號(hào)作為參數(shù)衔肢。
-- 【備注】COUNT 函數(shù)的結(jié)果根據(jù)參數(shù)的不同而不同庄岖。COUNT(*) 會(huì)得到包含 NULL 的數(shù)據(jù)行數(shù),而 COUNT(<列名>) 會(huì)得到 NULL 之外的數(shù)據(jù)行數(shù)角骤。
--------------------------------------
--4.計(jì)算合計(jì)值
select
SUM(Conbio_price1) as sum_Conbio_price1,?? ??? ?--總和
AVG(Conbio_price1) as avg_Conbio_price1,?? ??? ?--平均
MAX(Conbio_price1) as max_Conbio_price1,?? ??? ?--最大值
MIN(Conbio_price1) as min_Conbio_price1 ?? ??? ?--最小值
from dbo.Conbio;
--【備注】所有的聚合函數(shù)隅忿,如果以列名為參數(shù),會(huì)無(wú)視 NULL 值所在的行邦尊。
------------------
SELECT MAX(Conbio_DATE),?? ??? ?--Conbio_DATE 為日期
MIN(Conbio_date)
FROM dbo.Conbio
--【備注】MAX/MIN 函數(shù)幾乎適用于所有數(shù)據(jù)類型的列背桐。SUM/AVG 函數(shù)只適用于數(shù)值類型的列。
--------------------------------------
-- 5.使用聚合函數(shù)刪除重復(fù)值(關(guān)鍵字 distinct)
--示例1:計(jì)算去除重復(fù)數(shù)據(jù)后的數(shù)據(jù)行數(shù)
SELECT COUNT(DISTINCT Conbio_varieties)
FROM dbo.conbio;
------------------
--示例2:先計(jì)算數(shù)據(jù)行數(shù)再刪除重復(fù)數(shù)據(jù)的結(jié)果
SELECT DISTINCT COUNT(Conbio_Varieties)
FROM dbo.Conbio;
--【備注】在聚合函數(shù)的參數(shù)中使用 DISTINCT(示例1)蝉揍,可以刪除重復(fù)數(shù)據(jù)链峭。DISTINCT 不僅限于 COUNT 函數(shù),所有的聚合函數(shù)都可以使用又沾。
--------------------------------------
--?? ?二弊仪、對(duì)表進(jìn)行分組
-- 1.GROUP BY 子句
--語(yǔ)法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...;
--示例
SELECT conbio_varieties AS '商品種類',
COUNT(*) AS '數(shù)量'
FROM dbo.conbio
GROUP BY conbio_varieties;
--【備注】GROUP BY 子句中指定的列稱為“聚合鍵”或“分組列”。
-- 【子句的書寫順序(暫定)】SELECT --> FROM --> WHERE --> GROUP BY
------------------
--2.聚合鍵中包含 NULL 的情況
SELECT conbio_price2, COUNT(*)
FROM dbo.conbio
GROUP BY conbio_price2;
--【備注】聚合鍵中包含 NULL 時(shí)杖刷,在結(jié)果中也會(huì)以 NULL 行的形式表現(xiàn)出來(lái)励饵。
--------------------------------------
--3.WHERE 對(duì) GROUP BY 執(zhí)行結(jié)果的影響
--語(yǔ)法
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--WHERE <表達(dá)式>
--GROUP BY <列名1>, <列名2>, ...
SELECT conbio_price2, COUNT(*)
FROM dbo.conbio
WHERE conbio_varieties = '衣服'
GROUP BY conbio_price2
--這里是先根據(jù) WHERE 子句指定的條件進(jìn)行過(guò)濾,然后再進(jìn)行聚合處理滑燃。
-- 【執(zhí)行順序】FROM --> WHERE --> GROUP BY --> SELECT役听。這里是執(zhí)行順序,跟之前的書寫順序是不一樣的表窘。
--------------------------------------
--4.與聚合函數(shù)和 GROUP BY 子句有關(guān)的常見錯(cuò)誤
--〉溆琛(1)易錯(cuò):在 SELECT 子句中書寫了多余的列
-- SELECT 子句只能存在以下三種元素:
-- ①常數(shù)
-- ±盅稀②聚合函數(shù)
-- ×鲂洹③GROUP BY 子句中指定的列名(即聚合鍵)
--易錯(cuò)點(diǎn)1
-- 【總結(jié)】使用 GROUP BY 子句時(shí),SELECT 子句不能出現(xiàn)聚合鍵之外的列名昂验。
-- ∧跻(2)易錯(cuò):在 GROUP BY 子句中寫了列的別名
--回顧之前說(shuō)的執(zhí)行順序,SELECT 子句是在 GROUP BY 子句之后執(zhí)行凛篙。所以執(zhí)行到 GROUP BY 子句時(shí)無(wú)法識(shí)別別名。
-- 【總結(jié)】GROUP BY 子句不能使用 SELECT 子句中定義的別名栏渺。
--∏喊稹(3)易錯(cuò):GROUP BY 子句的結(jié)果能排序嗎?
-- 【解答】它是隨機(jī)的磕诊。如果想排序填物,請(qǐng)使用 ORDER BY 子句纹腌。
-- 【總結(jié)】GROUP BY 子句結(jié)果的顯示是無(wú)序的。
--(4)易錯(cuò):在 WHERE 子句中使用聚合函數(shù)
-- 【總結(jié)】只有 SELECT 子句和 HAVING 子句(以及 ORDER BY 子句)中能夠使用聚合函數(shù)滞磺。
--------------------------------------
--三升薯、為聚合結(jié)果指定條件
-- 1.HAVING 子句
-- WHERE 子句智能指定記錄(行)的條件,而不能用來(lái)指定組的條件击困。
-- 【備注】HAVING 是 HAVE(擁有)的現(xiàn)在分詞涎劈。
--語(yǔ)法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...
--HAVING <分組結(jié)果對(duì)應(yīng)的條件>
--【書寫順序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING
SELECT conbio_varieties, COUNT(*)
FROM dbo.conbio
GROUP BY conbio_varieties
HAVING COUNT(*) = 2
------------------
--2.HAVING 子句的構(gòu)成要素
-- (1)3 要素:
-- ≡牟琛①常數(shù)
-- ≈朊丁②聚合函數(shù)
-- ③GROUP BY 子句中指定的列名(即聚合鍵)
------------------
--3.HAVING 與 WHERE
-- 有些條件可以寫在 HAVING 子句中脸哀,又可以寫在 WHERE 子句中蹦浦。這些條件就是聚合鍵所對(duì)應(yīng)的條件。
--【建議】雖然結(jié)果一樣撞蜂,聚合鍵對(duì)應(yīng)的條件應(yīng)該寫在 WHERE 子句中盲镶,不是 HAVING 子句中。
-- 【理由】①WHERE 子句的執(zhí)行速度比 HAVING 快蝌诡。
-- 「然摺②意義:WHERE 子句 = 指定行所對(duì)應(yīng)的條件,HAVING 子句 = 指定組所對(duì)應(yīng)的條件送漠。
--------------------------------------
--四顽照、對(duì)查詢結(jié)果進(jìn)行排序
--1.ORDER BY 子句
--語(yǔ)法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--ORDER BY <排序基準(zhǔn)列1>, <排序基準(zhǔn)列2>, ...
SELECT conbio_id, conbio_price1
FROM dbo.conbio
ORDER BY conbio_price1;??? --升序排列
--排序鍵:ORDER BY 子句中書寫的列名。
--【書寫順序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY
------------------
--2.升序(ASC)和降序(DESC):
SELECT conbio_id, conbio_price1
FROM dbo.conbio
ORDER BY conbio_price1 DESC;??? --降序排列
--ORDER BY conbio_id asc;??? --降序排列
--【備注】ORDER BY 子句中排列順序時(shí)會(huì)默認(rèn)使用升序(ASC)進(jìn)行排列闽寡。
------------------
--3.指定多個(gè)排序鍵
SELECT conbio_id, conbio_name, conbio_price1, conbio_price2
FROM dbo.conbio
ORDER BY conbio_price1, conbio_price2;
------------------
--4.NULL 值的順序:排序鍵中包含 NULL 時(shí)代兵,會(huì)在開頭或末尾進(jìn)行匯總。
------------------
--5.在排序鍵中使用 SELECT 子句中的別名
SELECT conbio_id AS id, conbio_name, conbio_price1 AS ht
FROM dbo.conbio
ORDER BY ht, id;
--【執(zhí)行順序】FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY
--【備注】ORDER BY 子句可以使用 SELECT 子句中定義的別名爷狈,GROUP BY 子句不能使用別名植影。
------------------
--6.ORDER BY 子句中使用聚合函數(shù)
SELECT conbio_varieties, COUNT(*)
FROM dbo.conbio
GROUP BY conbio_varieties
ORDER BY COUNT(*);
------------------
--7.不建議使用列的編號(hào)進(jìn)行排序,雖然可以
SELECT conbio_id ,
conbio_name ,
conbio_varieties ,
conbio_price1 ,
conbio_price2 ,
conbio_date
FROM dbo.conbio
ORDER BY conbio_price1 DESC, conbio_id;
------------------
SELECT conbio_id ,
conbio_name ,
conbio_varieties ,
conbio_price1 ,
conbio_price2 ,
conbio_date
FROM dbo.conbio
ORDER BY 4 DESC, 1;?? ??? ??? ??? ?--這里使用列的編號(hào)涎永,由于閱讀不便思币,不推薦使用
--【備注】在 ORDER BY 子句中不要使用列的編號(hào)。
--------------------------------------
--歡迎關(guān)注個(gè)人公眾號(hào):Zkcops
由:zkcops 撰寫(希望能對(duì)你有所幫助羡微,轉(zhuǎn)載注明出處9榷觥)
--------------------------------------