GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
GROUP BY 语法
SELECT column_name,function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
实例演示
本章节实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。
MariaDB [RUNOOB]> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)
MariaDB [RUNOOB]> SET FOREIGN_KEY_CHECKS = 0;
Query OK, 0 rows affected (0.00 sec)
MariaDB [RUNOOB]> DROP TABLE IF EXISTS `employee_tbl`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
MariaDB [RUNOOB]> CREATE TABLE `employee_tbl` (
-> `id` int(11) NOT NULL,
-> `name` char(10) NOT NULL DEFAULT '',
-> `date` datetime NOT NULL,
-> `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec)
MariaDB [RUNOOB]> BEGIN;
Query OK, 0 rows affected (0.00 sec)
MariaDB [RUNOOB]> INSERT INTO employee_tbl VALUES ('1', 'aa', '2016-04-22 15:25:33', '1'), ('2', 'bb', '2016-04-20 15:25:47', '3'), ('3', 'cc', '2016-04-19 15:26:02', '2'), ('4', 'bb', '2016-04-07 15:26:14', '4'), ('5', 'aa', '2016-04-11 15:26:40', '4'), ('6', 'aa', '2016-04-04 15:26:54', '2');
Query OK, 6 rows affected, 6 warnings (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 6
MariaDB [RUNOOB]> COMMIT;
Query OK, 0 rows affected (0.00 sec)
MariaDB [RUNOOB]> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)
导入成功后,执行以下 SQL 语句:
MariaDB [RUNOOB]> select * from employee_tbl;
+----+------+---------------------+--------+
| id | name | date | singin |
+----+------+---------------------+--------+
| 1 | aa | 2016-04-22 15:25:33 | 1 |
| 2 | bb | 2016-04-20 15:25:47 | 3 |
| 3 | cc | 2016-04-19 15:26:02 | 2 |
| 4 | bb | 2016-04-07 15:26:14 | 4 |
| 5 | aa | 2016-04-11 15:26:40 | 4 |
| 6 | aa | 2016-04-04 15:26:54 | 2 |
+----+------+---------------------+--------+
6 rows in set (0.00 sec)
接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
MariaDB [RUNOOB]> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+------+----------+
| name | COUNT(*) |
+------+----------+
| aa | 3 |
| bb | 2 |
| cc | 1 |
+------+----------+
3 rows in set (0.00 sec)
使用 WITH ROLLUP
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:
MariaDB [RUNOOB]> SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
+------+--------------+
| name | singin_count |
+------+--------------+
| aa | 7 |
| bb | 7 |
| cc | 2 |
| NULL | 16 |
+------+--------------+
4 rows in set (0.00 sec)
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
select coalesce(a,b,c);
参数说明:
如果a!=null,则选择a;
如果a==null,则选择b;
如果b==null,则选择c;
如果a b c 都为null ,则返回为null(没意义)。
以下实例中如果名字为空我们使用总数代替:
MariaDB [RUNOOB]> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
+------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+------------------------+--------------+
| aa | 7 |
| bb | 7 |
| cc | 2 |
| 总数 | 16 |
+------------------------+--------------+
4 rows in set (0.00 sec)
相关推荐
MySQL数据库中group by语句与update语句的用法研究.pdf
在MySQL中,新建立一张表,该表有三个字段,分别是id,a,b,插入1000条每个字段都相等的记录,如下: mysql> show create table t1\G *************************** 1. row *************************** Table: t1...
十二.MySQL 查询数据 十三.MySQL WHERE 子句 十四.MySQL UPDATE 更新 十五.MySQL DELETE 语句 十六.MySQL LIKE 子句 十七.MySQL UNION 操作符 十八.MySQL 排序 十九.MySQL GROUP BY 语句 二十.MySQL 连接的...
本文实例讲述了mysql获取group by总记录行数的方法,分享给大家供大家参考。具体方法分析如下: 一般来说,mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数。 mysql中可以使用...
Linux运维-运维课程d2-MySQL基本SQL语句(下)-15-GROUP BY子句之统计函数.mp4
本文给大家带来了Mysql中错误使用SQL语句Groupby被兼容的情况,及sql的grop by 语句介绍。感兴趣的朋友一起通过本文学习吧
Linux运维-运维课程d2-MySQL基本SQL语句(下)-16-GROUP BY子句之分组原理与实
创建表&创建索引 ...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT
主要介绍了MySQL中无GROUP BY情况下直接使用HAVING语句的问题探究,同时探究了该情况下MAX与MIN功能的使用情况,需要的朋友可以参考下
mysql查询语句汇总 MySQL 是一种常用的关系型数据库管理系统,可以通过 SQL 语言 进行数据的查询和操作。下面列举了 10 个常见的 MySQL 数据查询 ...5. GROUP BY 子句:用于将查询结果按照指定列进行分组。通常
mysql查询语句汇总 MySQL 是一种常用的关系型数据库管理系统,可以通过 SQL 语言 进行数据的查询和操作。下面列举了 10 个常见的 MySQL 数据查询 ...5. GROUP BY 子句:用于将查询结果按照指定列进行分组。通常
主要介绍了MySQL中distinct语句的基本原理及其与group by的比较,一般情况下来说group by和distinct的实现原理相近且性能稍好,需要的朋友可以参考下
mysql中group by语句用于分组查询,可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表, 经常和having一起使用,需要的朋友可以参考下
满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有)。在某些情况中,MySQL能够做得更好,即通过索引访问而不用创建...
mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数。 mysql的SQL_CALC_FOUND_ROWS 使用 获取查询的行数 在很多分页的程序中都这样写: 代码如下 SELECT COUNT(*) from `table` ...
mysql中order by 排序查询、asc升序、desc降序,group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。
在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group by会做个排序(一般是ASC)。...
mysql查询语句汇总 MySQL作为流行的关系型数据库管理系统,其查询语句的灵活性和强大性是它深受欢迎的原因之一。下面,我们将进一步探讨MySQL查询语句的不同方面,从基础查询到高级查询,以...结合GROUP BY子句,可以
现在需要把这些重复的数据删除掉,使用到的语句就是Group By来完成。为了进一步了解这条语句的作用,我打算先从简单入手。 建一个测试表 代码如下:create table test_group(id int auto_increment primary key, ...