MySQL高等查詢之與Group By聚集應用引見。本站提示廣大學習愛好者:(MySQL高等查詢之與Group By聚集應用引見)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL高等查詢之與Group By聚集應用引見正文
1 GROUP_CONCAT
mysql> SELECT student_name,
-> GROUP_CONCAT(test_score)
-> FROM student
-> GROUP BY student_name;
Or:
mysql> SELECT student_name,
-> GROUP_CONCAT(DISTINCT test_score
-> ORDER BY test_score DESC SEPARATOR ' ')
-> FROM student
-> GROUP BY student_name;
在MySQL中,你可以獲得表達式組合的銜接值。你可使用DISTINCT刪去反復值。假若你願望多成果值停止排序,則應當應用 ORDER BY子句。若要按相反次序分列,將 DESC (遞加) 症結詞添加到你要用ORDER BY 子句停止排序的列稱號中。默許次序為升序;可以使用ASC將其明白指定。 SEPARATOR 前面追隨應當被拔出成果的值中央的字符串值。默許為逗號 (‘,')。經由過程指定SEPARATOR '' ,你可以刪除一切分隔符。
PS:就是可以在一個語句中獲得 GROUP BY 被 聚合的項的每一個子值的一個組合的字符串
2 WITH ROLLUP
GROUP BY子句許可一個將額定行添加到簡單輸入端 WITH ROLLUP 潤飾符。這些行代表高層(或高集合)簡單操作。ROLLUP 因此許可你在多層剖析的角度答復有關詢問的成績
或許你可使用 ROLLUP, 它能用一個詢問供給雙層剖析。將一個 WITH ROLLUP潤飾符添加到GROUP BY 語句,使訊問發生另外一行成果,該行顯示了一切年份的總價值:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 | 4525 |
| 2001 | 3010 |
| NULL | 7535 |
+------+-------------+
總計高集合行被年份列中的NULL值標出。
當有多重 GROUP BY 列時,ROLLUP發生的後果加倍龐雜。這時候,每次在除最初一個分類列以外的任何列湧現一個 “break” (值的轉變) ,則問訊會發生一個高集合累計行。
例如,在沒有 ROLLUP的情形下,一個以年、國度和產物為基本的關於 sales 表的一覽表能夠以下所示:
mysql> SELECT year, country, product, SUM(profit)
-> FROM sales
-> GROUP BY year, country, product;
+------+---------+------------+-------------+
| year | country | product | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer | 1500 |
| 2000 | Finland | Phone | 100 |
| 2000 | India | Calculator | 150 |
| 2000 | India | Computer | 1200 |
| 2000 | USA | Calculator | 75 |
| 2000 | USA | Computer | 1500 |
| 2001 | Finland | Phone | 10 |
| 2001 | USA | Calculator | 50 |
| 2001 | USA | Computer | 2700 |
| 2001 | USA | TV | 250 |
+------+---------+------------+-------------+
表現總值的輸入成果僅位於年/國度/產物的剖析級別。當添加了 ROLLUP後, 詢問會發生一些額定的行:
mysql> SELECT year, country, product, SUM(profit)
-> FROM sales
-> GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+
| year | country | product | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer | 1500 |
| 2000 | Finland | Phone | 100 |
| 2000 | Finland | NULL | 1600 |
| 2000 | India | Calculator | 150 |
| 2000 | India | Computer | 1200 |
| 2000 | India | NULL | 1350 |
| 2000 | USA | Calculator | 75 |
| 2000 | USA | Computer | 1500 |
| 2000 | USA | NULL | 1575 |
| 2000 | NULL | NULL | 4525 |
| 2001 | Finland | Phone | 10 |
| 2001 | Finland | NULL | 10 |
| 2001 | USA | Calculator | 50 |
| 2001 | USA | Computer | 2700 |
| 2001 | USA | TV | 250 |
| 2001 | USA | NULL | 3000 |
| 2001 | NULL | NULL | 3010 |
| NULL | NULL | NULL | 7535 |
+------+---------+------------+-------------+
當你應用 ROLLUP時, 你不克不及同時應用 ORDER BY子句停止成果排序。換言之, ROLLUP 和ORDER BY 是相互排擠的。但是,你仍可以對排序停止一些掌握。在 MySQL中, GROUP BY 可以對成果停止排序,並且你可以在GROUP BY列表指定的列中應用明白的 ASC和DESC症結詞,從而對個體列停止排序。 (豈論若何排序被ROLLUP添加的較高等其余總計行仍湧現在它們被盤算出的行前面)。
LIMIT可用來限制前往客戶真個行數。LIMIT 用在 ROLLUP前面, 是以這個限制 會撤消被ROLLUP添加的行