mysql精粹:group by 中很好的函數

http://blog.csdn.net/easyboor/article/details/5806977 mysql

GROUP_CONCAT sql

mysql> SELECT student_name, spa

    ->     GROUP_CONCAT(test_score) .net

    ->     FROM student blog

    ->     GROUP BY student_name; 排序

Or: 字符串

mysql> SELECT student_name, get

    ->     GROUP_CONCAT(DISTINCT test_score 產品

    ->               ORDER BY test_score DESC SEPARATOR ' ') it

    ->     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添加的行

相關文章
相關標籤/搜索