初識MySQL(4)聚集函數,分組數據,子查詢,分組查詢

1.聚集函數

聚集函數其實就是一種函數的使用方式,用來進行一些比較高級的數據操作,使用起來也比較簡單,我們就先舉幾個例子,並對他們進行解釋分析即可。

SELECT  AVG(age) AS avg_age FROM TABLE1; 

以上語句使用了AVG()函數來求平均值,得到的結果就是查找出表中所有年齡的平均值並且起一個新的列名爲avg_age。

SELECT COUNT(e_mail) AS num_email FROM TABLE1;

以上語句使用COUNT()函數來達到計數的功能,即計算e_mail的數量,並起一個新的列名爲num_email。

SELECT MAX(price) FROM max_price FROM TABLE1;

使用MAX()函數來求一個列中的最大值。MIN()函數同理求最小值。

SELECT SUM(score) AS sum_score FROM TABLE1;

使用SUM()函數進行求和操作,計算成績的總和。

2.分組數據

我們之前學的where過濾數據與使用聚集函數得到一些更復雜的數據結論都是建立在對整張表的查詢上的。但是,當我們需要統計每個公司的員工數量這種要分公司,分組來進行統計處理的操作時,我們已知的操作就顯得捉襟見肘。因此我們引入了分組的概念與GROUP BY語句。

SELECT company,COUNT(id) AS num_workers FROM TABLE1 GROUP BY company;

以上的語句就實現了根據公司分組來統計每個公司中員工的數量。

而接下來我們就會想到,分組完成之後,我們如果並不需要得到所有分組的結果或者分組的數量過多,我們只需要查看其中的一部分分組的話,我們就需要過濾分組這個操作,完成這個操作WHERE語句已經不能滿足我們了,我們需要引入HAVING語句。
其實也可以理解爲WHERE用來過濾行,HAVING用來過濾分組!
也就是說WHERE語句都可以用HAVING進行替換,這種情況下就是將每一行看作一個分組。
我們先看一個例子:

SELECT id,COUNT(*) AS orders FROM orders GROUP BY id HAVING COUNT(*) >= 2;

我們先看HAVING之前的語句,很顯然就是將每一個id進行分組,並查詢出每個id的數量,然後HAVING來進行對這些id分組的篩選和過濾,即只保留下那些數量比2要大的分組。
從這也可以看出HAVING對於分組的篩選模式和WHERE對於行的篩選模式其實差不多的。

GROUP BY 和 ORDER BY的對比:

GROUP BY ORDER BY
分組行,但可能輸出的不是分組的順序 排序產生的輸出
只可能使用選擇列,而且必須使用每一個選擇的列 任意列都可以使用,什麼非選擇的列
如果與聚集函數一起使用列,則必須使用 不一定必須使用

ORDER BY語句是保證結果有序排列的唯一正確的語句,不能僅僅依賴GROUP BY想要實現分組的有序排列。

3.子查詢

SELECT num FROM TABLE1 WHERE thing = 'TNT2'
SELECT id FROM TABLE2 WHERE num IN (20005,20007);

以上兩個單獨的語句,第一個語句表示從TABLE1中查詢出id是TNT2的num,第二個語句表示的是從TABLE2中查詢出num在20005到20007中的id。
現在如果需要列出訂購TNT2的所有用戶的id,就需要用到兩個查詢的結合,即先查詢出所有訂購TNT2的用戶的num(結果爲20005和20007),在通過num在領一張表中去查詢id。
這個時候我們就可以用到一下包含子查詢的語句來一次性達到我們的查找要求:

SELECT id FROM TABLE2 WHERE num IN (SELECT num from TABLE1 WHERE thing = 'TNT2');

其含義很好理解。

4.組合查詢

之前我們學過的所有SQL語句都是單句的SELECT構成的,當我們需要一次性返回兩個SELECT查找的內容的時候,我們就需要使用到UNION關鍵字,使用方式比較簡單,就是在兩個獨立的SELECT語句之間使用UNION進行連接,請看下面的例子:

SELECT id FROM products WHERE prince <=5
UNION
SELECT id FROM products WHERE id IN (1001,1002);

這就是返回兩個SELECT語句查詢的內容。
值得注意的是,如果第一個SELECT語句返回的結果有4行,第二個語句返回的結果是5行,這其中很有可能包含重複的行,使用UNION聯結兩個查詢語句的時候會自動幫我們取消掉重複的行,但是當我們需要返回所有的行,即包括重複的行我們也要返回的時候我們可以使用UNION ALL關鍵字來連接兩個語句,這樣就不會幫我們自動取消重複行了。

而對於使用組合查詢的結果進行排序,ORDER BY語句只能出現在最後,而且只能出現一次,不存在對於一種結果集有兩種排序的方式。

發佈了15 篇原創文章 · 獲贊 0 · 訪問量 2941
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章