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

MySQL入门 - 数据分组之 group by

MySQL入门 - 数据分组之 group by

MySQL入门 - 数据分组之 group by

mysql sql优化之 优化GROUP BY 和 DISTINCT

mysql优化 之 group by索引松散扫描和紧凑扫描

MYSQL5.7特性之GROUP BY 排序