[关闭]
@yanglt7 2018-06-06T06:37:20.000000Z 字数 3197 阅读 945

5 MySQL 排序、分组

MySQL


MySQL ORDER BY 语句

我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。
如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

ORDER BY 语法

SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:

  1. select field1,field2,...,fieldN table_name1,table_name2...
  2. order by field1,[field2...] [ASC [DESC]]

实例

  1. mysql> select * from runoob_tbl order by submission_date ASC;
  2. +-----------+--------------+---------------+-----------------+
  3. | runoob_id | runoob_title | runoob_author | submission_date |
  4. +-----------+--------------+---------------+-----------------+
  5. | 5 | 学习Python | RUNOOB.COM | 2016-03-06 |
  6. | 4 | JAVA教程 | RUNOOB.COM | 2016-05-06 |
  7. | 1 | 学习 PHP | 菜鸟教程 | 2017-08-10 |
  8. | 2 | 学习MYSQL | 菜鸟教程 | 2017-08-10 |
  9. +-----------+--------------+---------------+-----------------+
  10. mysql> select * from runoob_tbl order by submission_date DESC;
  11. +-----------+--------------+---------------+-----------------+
  12. | runoob_id | runoob_title | runoob_author | submission_date |
  13. +-----------+--------------+---------------+-----------------+
  14. | 1 | 学习 PHP | 菜鸟教程 | 2017-08-10 |
  15. | 2 | 学习MYSQL | 菜鸟教程 | 2017-08-10 |
  16. | 4 | JAVA教程 | RUNOOB.COM | 2016-05-06 |
  17. | 5 | 学习Python | RUNOOB.COM | 2016-03-06 |
  18. +-----------+--------------+---------------+-----------------+

MySQL GROUP BY 语句

GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

GROUP BY 语法

  1. select column_name,function(column_name)
  2. from table_name
  3. WHERE column_name operator value
  4. group by column_name

实例

先将以下数据导入数据库中:

  1. mysql> CREATE TABLE `employee_tbl` (
  2. -> `id` int(11) NOT NULL,
  3. -> `name` char(10) NOT NULL DEFAULT '',
  4. -> `date` datetime NOT NULL,
  5. -> `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
  6. -> PRIMARY KEY (`id`)
  7. -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  8. mysql> insert into `employee_tbl` values ('1','小明','2016-04-22 15:25:33','1'),('2','小王','2016-04-20 15:25:47','3'),
  9. -> ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'),
  10. -> ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');

导入成功后,执行以下 SQL 语句:

  1. mysql> set names utf8;
  2. mysql> select * from employee_tbl;
  3. +----+--------+---------------------+--------+
  4. | id | name | date | singin |
  5. +----+--------+---------------------+--------+
  6. | 1 | 小明 | 2016-04-22 15:25:33 | 1 |
  7. | 2 | 小王 | 2016-04-20 15:25:47 | 3 |
  8. | 3 | 小丽 | 2016-04-19 15:26:02 | 2 |
  9. | 4 | 小王 | 2016-04-07 15:26:14 | 4 |
  10. | 5 | 小明 | 2016-04-11 15:26:40 | 4 |
  11. | 6 | 小明 | 2016-04-04 15:26:54 | 2 |
  12. +----+--------+---------------------+--------+

接下来使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:

  1. mysql> select name,count(*) from employee_tbl group by name;
  2. +--------+----------+
  3. | name | count(*) |
  4. +--------+----------+
  5. | 小丽 | 1 |
  6. | 小明 | 3 |
  7. | 小王 | 2 |
  8. +--------+----------+

使用 WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:

  1. mysql> select name,sum(singin) as singin_count from employee_tbl group by name with rollup;
  2. +--------+--------------+
  3. | name | singin_count |
  4. +--------+--------------+
  5. | 小丽 | 2 |
  6. | 小明 | 7 |
  7. | 小王 | 7 |
  8. | NULL | 16 |
  9. +--------+--------------+

其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:

  1. select coalesce(a,b,c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。
以下实例中如果名字为空我们使用总数代替:

  1. mysql> select coalesce(name,'总数'),sum(singin) as singin_count from employee_tbl group by name with rollup;
  2. +-------------------------+--------------+
  3. | coalesce(name,'总数') | singin_count |
  4. +-------------------------+--------------+
  5. | 小丽 | 2 |
  6. | 小明 | 7 |
  7. | 小王 | 7 |
  8. | 总数 | 16 |
  9. +-------------------------+--------------+
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注