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="9.133.250.157", user="root", password="123452", 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

更多内容欢迎关注公众号

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值