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 语句的主要内容,如果未能解决你的问题,请参考以下文章