python:mysql之GROUP BY语句
Posted 就用python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 语句查询数据完成...
以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;感觉还不错记得点赞呦,谢谢!
未完,待续…
一直都在努力,希望您也是!
以上是关于python:mysql之GROUP BY语句的主要内容,如果未能解决你的问题,请参考以下文章