MySQL之GROUP BY用法誤解

1.說明mysql

   「Group By」從字面意義上理解就是根據「By」指定的規則對數據進行分組,所謂的分組就是將一個「數據集」劃分紅若干個「小區域」,而後針對若干個「小區域」進行數據處理。(只是簡單說明這個語句的做用,不是這篇文章的重點)sql

2.使用舉例:函數

  2.1表結構類型blog

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是否會正常執行呢?rem

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.分析ast

     這是什麼狀況?不是說若是select指定的字段要麼出如今GROUP BY裏面要麼出如今聚合函數裏面呢?我上面的SQL 沒有在GROUP BY裏面指定相應的字段也是能夠正常執行的啊!!!原來我查過MYSQL的官方文檔才知道:若是select指定的字段沒有在GROUP BY 裏面,那麼必定要保證的是他們這些字段都直接依賴與GROUP BY後面的字段。好比first_name,last_name都依賴主鍵actor_id,因此上面的結果是OK的。class

5.擴展

  須要指出的在MYSQL中,當沒法使用索引的時候,GROUP BY 使用兩種策略來完成:使用臨時表或者文件排序來分組。(其餘。。。。。。。。)

相關文章
相關標籤/搜索