標籤:
1.說明
“Group By”從字面意義上理解就是根據“By”指定的規則對資料進行分組,所謂的分組就是將一個“資料集”劃分成若干個“小地區”,然後針對若干個“小地區”進行資料處理。(只是簡單說明這個語句的作用,不是這篇文章的重點)
2.使用舉例:
2.1表結構類型
mysql> desc actor;+-------------+----------------------+------+-----+-------------------+-----------------------------+| Field | Type | Null | Key | Default | Extra |+-------------+----------------------+------+-----+-------------------+-----------------------------+| actor_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment || first_name | varchar(45) | NO | | NULL | || last_name | varchar(45) | NO | MUL | NULL | || last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |+-------------+----------------------+------+-----+-------------------+-----------------------------+4 rows in set (0.00 sec)
2.2使用:
mysql> select first_name,last_name from actor group by first_name,last_name;+-------------+--------------+| first_name | last_name |+-------------+--------------+| ADAM | GRANT || ADAM | HOPPER || AL | GARLAND || ALAN | DREYFUSS || ALBERT | JOHANSSON || ALBERT | NOLTE || ALEC | WAYNE || ANGELA | HUDSON || ANGELA | WITHERSPOON || ANGELINA | ASTAIRE || ANNE | CRONYN || AUDREY | BAILEY || AUDREY | OLIVIER || BELA | WALKEN || BEN | HARRIS || BEN | WILLIS || BETTE | NICHOLSON || BOB | FAWCETT || BURT | DUKAKIS |
3.其他
我們知道在很早之前接觸到GROUP BY 的時候就被告知,在select指定的欄位要麼就要包含在Group By語句的後面,作為分組的依據;要麼就要被包含在彙總函式中。正如上面的使用方法那樣,那我能不能在select後面的欄位顯示出來而不包括在GROUP BY 欄位裡。看看下面的SQL是否會正常執行呢?
mysql> select first_name,last_name from actor group by actor_id;
結果可能出乎你的意料之外,來看看執行結果:
mysql> select first_name,last_name from actor group by actor_id;+-------------+--------------+| first_name | last_name |+-------------+--------------+| PENELOPE | GUINESS || NICK | WAHLBERG || ED | CHASE || JENNIFER | DAVIS || JOHNNY | LOLLOBRIGIDA || BETTE | NICHOLSON || GRACE | MOSTEL || MATTHEW | JOHANSSON || JOE | SWANK || CHRISTIAN | GABLE || ZERO | CAGE || KARL | BERRY || UMA | WOOD || VIVIEN | BERGEN || CUBA | OLIVIER || FRED | COSTNER || HELEN | VOIGHT || DAN | TORN || BOB | FAWCETT || LUCILLE | TRACY || KIRSTEN | PALTROW || ELVIS | MARX |
4.分析
這是什麼情況?不是說如果select指定的欄位要麼出現在GROUP BY裡面要麼出現在彙總函式裡面呢?我上面的SQL 沒有在GROUP BY裡面指定相應的欄位也是可以正常執行的啊!!!原來我查過MYSQL的官方文檔才知道:如果select指定的欄位沒有在GROUP BY 裡面,那麼一定要保證的是他們這些欄位都直接依賴與GROUP BY後面的欄位。比如first_name,last_name都依賴主鍵actor_id,所以上面的結果是OK的。
5.擴充
需要指出的在MYSQL中,當無法使用索引的時候,GROUP BY 使用兩種策略來完成:使用暫存資料表或者檔案排序來分組。(其他。。。。。。。。)
MySQL之GROUP BY用法誤解