MySQL GROUP BY 语句

Posted sdges

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL GROUP BY 语句相关的知识,希望对你有一定的参考价值。

MySQL GROUP BY 语句

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;

实例演示

本章节实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。


SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `employee_tbl`
-- ----------------------------
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl` (
  `id` int(11) NOT NULL,
  `name` char(10) NOT NULL DEFAULT \'\',
  `date` datetime NOT NULL,
  `signin` tinyint(4) NOT NULL DEFAULT \'0\' COMMENT \'登录次数\',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `employee_tbl`
-- ----------------------------
BEGIN;
INSERT INTO `employee_tbl` VALUES (\'1\', \'小明\', \'2016-04-22 15:25:33\', \'1\'), (\'2\', \'小王\', \'2016-04-20 15:25:47\', \'3\'), (\'3\', \'小丽\', \'2016-04-19 15:26:02\', \'2\'), (\'4\', \'小王\', \'2016-04-07 15:26:14\', \'4\'), (\'5\', \'小明\', \'2016-04-11 15:26:40\', \'4\'), (\'6\', \'小明\', \'2016-04-04 15:26:54\', \'2\');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

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


mysql> set names utf8;
mysql> SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name   | date                | signin |
+----+--------+---------------------+--------+
|  1 | 小明 | 2016-04-22 15:25:33 |      1 |
|  2 | 小王 | 2016-04-20 15:25:47 |      3 |
|  3 | 小丽 | 2016-04-19 15:26:02 |      2 |
|  4 | 小王 | 2016-04-07 15:26:14 |      4 |
|  5 | 小明 | 2016-04-11 15:26:40 |      4 |
|  6 | 小明 | 2016-04-04 15:26:54 |      2 |
+----+--------+---------------------+--------+
6 rows in set (0.00 sec)

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


mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
+--------+----------+
| name   | COUNT(*) |
+--------+----------+
| 小丽 |        1 |
| 小明 |        3 |
| 小王 |        2 |
+--------+----------+
3 rows in set (0.01 sec)

使用 WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT...)。

例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:


mysql> SELECT name, SUM(signin) as signin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name   | signin_count |
+--------+--------------+
| 小丽 |            2 |
| 小明 |            7 |
| 小王 |            7 |
| NULL   |           16 |
+--------+--------------+
4 rows in set (0.00 sec)

其中记录 NULL 表示所有人的登录次数。

我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:


select coalesce(a,b,c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

以下实例中如果名字为空我们使用总数代替:


mysql> SELECT coalesce(name, \'总数\'), SUM(signin) as signin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
+--------------------------+--------------+
| coalesce(name, \'总数\') | signin_count |
+--------------------------+--------------+
| 小丽                   |            2 |
| 小明                   |            7 |
| 小王                   |            7 |
| 总数                   |           16 |
+--------------------------+--------------+
4 rows in set (0.01 sec)

python:mysql之GROUP BY语句


接下来。装逼开始....



GROUP BY 语句常用于结合合计函数(SUM、COUNT、AVG)根据一个或多个列的结果集进行分组


示例1:终端执行SQL语句,查询老师所带班级的数量和

mysql> select * from test_teacher_copy;+----+--------+---------+--------------+----------+-----------+---------------------+| id | name | subject | class | address | province | school |+----+--------+---------+--------------+----------+-----------+---------------------+| 1 | JAVA | 语文 | 初三(4)班 | Beijing | Beijing | Beijing University || 2 | JAVA | 语文 | 初三(3)班 | Beijing | Beijing | Beijing University || 3 | SQL | 数学 | 初三(3)班 | Beijing | Beijing | Zhejiang University || 4 | SQL | 数学 | 初三(4)班 | Beijing | Beijing | Zhejiang University || 5 | C++ | 化学 | 初三(4)班 | Shenzhen | Guangdong | Beijing University || 6 | C++ | 化学 | 初三(3)班 | Shenzhen | Guangdong | Beijing University || 7 | Go | 政治 | 初三(3)班 | Hefei | Anhui | Shanghai University || 8 | Go | 政治 | 初三(1)班 | Hefei | Anhui | Shanghai University || 9 | Python | 物理 | 初三(2)班 | Hefei | Anhui | NnjingUniversity |+----+--------+---------+--------------+----------+-----------+---------------------+9 rows in set (0.00 sec)
mysql> select name, count(*) from test_teacher_copy group by name;+--------+----------+| name | count(*) |+--------+----------+| C++ | 2 || Go | 2 || JAVA | 2 || Python | 1 || SQL | 2 |+--------+----------+5 rows in set (0.00 sec)

上述结果集计算了每个老师所教班级的数量计算之和,但又想把所有老师所教班级和再给求下和,该怎么改操作呢?


这里就引入了 with rollup,它是在分组统计数据的基础上再进行相同统计...


使用 with rollup 实现所教班级和之再统计:

mysql> select name, count(*) from test_teacher_copy group by name with rollup;+--------+----------+| name | count(*) |+--------+----------+| C++ | 2 || Go | 2 || JAVA | 2 || Python | 1 || SQL | 2 || NULL | 9 |+--------+----------+6 rows in set (0.00 sec)

从结果集可以看到,NULL表示所有教师所教班级数量的计算之和......


NULL显示的并不是很美观,要使用一个方法来设置下名称....


这里就引入了 coalesce 函数:

coalesce(a,b,c);

  • 如果a==null,则选择b

  • 如果b==null,则选择c

  • 如果a!=null,则选择a

  • 如果a、b、c均为null,则返回null


示例2:使用python脚本执行含 coalesce 函数的sql语句

import pymysql

class MysqlData: def __init__(self, host="8.136.250.157", user="root", password="123456", database="testing", port=3306): # 连接数据库 self.connection = pymysql.connect(host=host, user=user, password=password, database=database, port=port, charset='utf8', cursorclass=pymysql.cursors.DictCursor)
def modify_data(self, sql, args=None): """
Args: sql: sql语句 args: 接收格式化参数
Returns:
""" try: with self.connection: self.connection.ping(reconnect=True) with self.connection.cursor() as cursor: # 执行sql语句 cursor.execute(sql, args=args) # 提交sql语句 self.connection.commit() except pymysql.err.MySQLError as _error: raise _error
def get_data(self, sql, args=None, is_data=False): """
Args: sql: sql语句 args: 接收格式化参数 is_data: 判断获取多条数据还是单个数据,默认获取单个数据
Returns:
""" try: with self.connection: self.connection.ping(reconnect=True) with self.connection.cursor() as cursor: # 执行sql语句 cursor.execute(sql, args=args)
# 返回查询出的数据信息 return cursor.fetchall() if is_data else cursor.fetchone()
except pymysql.err.MySQLError as _error: raise _error

if __name__ == '__main__': # 初始化类,创建对象 info = MysqlData()
# 调用查询方法并打印出来 results = info.get_data(""" SELECT COALESCE (NAME, 'total') AS COALESCE, COUNT(*) AS sum FROM test_teacher_copy GROUP BY NAME WITH ROLLUP; """, is_data=True) for i in results: print(i)
{'COALESCE': 'C++', 'sum': 2}{'COALESCE': 'Go', 'sum': 2}{'COALESCE': 'JAVA', 'sum': 2}{'COALESCE': 'Python', 'sum': 1}{'COALESCE': 'SQL', 'sum': 2}{'COALESCE': 'total', 'sum': 9}
Process finished with exit code 0

从结果集中可以看到,NULL值已经变成了 total 别名了...


至此,mysql中使用 GROUP BY 语句查询数据完成...




以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;感觉还不错记得点赞呦,谢谢!

未完,待续…

一直都在努力,希望您也是!



以上是关于MySQL GROUP BY 语句的主要内容,如果未能解决你的问题,请参考以下文章

MySQL GROUP BY 语句

python:mysql之GROUP BY语句

MySQL GROUP BY 语句

MySQL GROUP BY 语句

[Mysql 查询语句]——分组查询group by

MySQL版本号不同导致的group by语句报错