原文地址,優先更新https://hhe0.github.iohtml
group by
是一個咱們在平常工做學習過程當中常常遇到的一個Mysql
關鍵字。現總結其用法以下,內容會不斷補充,出現錯誤歡迎批評指正。mysql
咱們首先建立學生的成績表courses
:git
CREATE TABLE `courses` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id', `student` VARCHAR(255) DEFAULT NULL COMMENT '學生', `class` VARCHAR(255) DEFAULT NULL COMMENT '課程', `score` INT(255) DEFAULT NULL COMMENT '分數', PRIMARY KEY (`id`), UNIQUE KEY `course` (`student`, `class`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
該表記錄了學生某節課的考試分數。
往courses
表中插入記錄:github
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('A', 'Math', 90); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('A', 'Chinese', 80); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('A', 'English', 70); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('A', 'History', 80); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('B', 'Math', 73); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('B', 'Chinese', 60); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('B', 'English', 70); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('B', 'History', 90); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('C', 'Math', 70); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('C', 'Chinese', 50); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('C', 'English', 20); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('C', 'History', 10); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('D', 'Math', 53); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('D', 'Chinese', 32); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('D', 'English', 99); INSERT INTO `courses`(`student`, `class`, `score`) VALUES('D', 'History', 100);
咱們使用幾個簡單的例子看一下group by
的做用:sql
SELECT * FROM `courses` GROUP BY `class`;
執行的結果是:
微信
score
對記錄進行分組:
SELECT * FROM `courses` GROUP BY `score`;
執行的結果是:
學習
group by
:
SELECT * FROM `courses` GROUP BY `class`,`student`;
執行的結果是:
3d
SELECT * FROM `courses` GROUP BY `student`,`class`;
執行的結果是:
code
sql
首先會按照
class
進行分組獲得四張中間表,而後輸出的時候將每個分組的第一個記錄組合在一塊兒造成了最終的結果。咱們還能夠發現,最終的記錄是按照
class
進行排序的。這樣的順序並不可靠,具體造成的緣由恐怕須要在
Mysql
的底層原理中找到答案。
咱們須要學生的成績表,且每一個學生每科的成績按照由大到小的順序排列htm
咱們能夠很天然的寫出下面的sql
:
SELECT * FROM `courses` GROUP BY `student`,`class` ORDER BY `score` DESC;
然而,執行的結果貌似並非咱們想要的:
sql
是將全部的記錄按照
score
由大到小的順序排列了,爲何會出現這樣的結果呢?
sql
的執行順序,真正的執行順序是
from
...
where
...
group by
...
order by
...
select
,
order by
做用在整個記錄,而不是每一個分組上。
sql
實現:
SELECT * FROM `courses` GROUP BY `student`,`class` ORDER BY `student`,`score` DESC;
執行的結果是:
咱們須要獲得全部功課平均分達到60分的同窗和他們的均分:
SELECT `student`, AVG(`score`) AS`avg_score` FROM `courses` GROUP BY `student` HAVING AVG(`score`) >= 60 ORDER BY `avg_score` DESC;
執行的結果爲:
where
與
having
的區別。
where
做用於全部的記錄,而
having
則做用於一個分組。
假設咱們這裏須要獲得全部功課(除歷史課)平均分達到60分的同窗和他們的均分:
SELECT `student`, AVG(`score`) AS `avg_score` FROM `courses` WHERE `class` <> 'History' GROUP BY `student` HAVING AVG(`score`) >= 60 ORDER BY `avg_score` DESC;
執行的結果以下:
咱們須要列出均分最高的三門課:
SELECT `class`, AVG(`score`) AS `avg_score` FROM `courses` GROUP By `class` ORDER BY `avg_score` DESC LIMIT 3;
執行的結果以下:
group by
分組的依據,以及
where
過濾條件做用的粒度
group by
關鍵字的用法,歡迎移步至
Mysql關鍵字之Group By(二),有點小練習在等着你。。。