MySQL之GROUP BY用法誤解

來源:互聯網
上載者:User

標籤:

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用法誤解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.