• Python遇上SQL,于是一个好用的Python第三方库出现了


    1. 演示数据

    本文的所有演示数据,均是基于下方的四张表。下面这四张表大家应该不陌生,这就是网传50道经典MySQL面试题中使用到的几张原表。关于下方各表之间的关联关系,我就不给大家说明了,仔细观察字段名,应该就可以发现。
    在这里插入图片描述

    2. pandasql的使用

    1)简介

    pandas中的DataFrame是一个二维表格,数据库中的表也是一个二维表格,因此在pandas中使用sql语句就显得水到渠成,pandasql使用SQLite作为其操作数据库,同时Python自带SQLite模块,不需要安装,便可直接使用。

    这里有一点需要注意的是:使用pandasql读取DataFrame中日期格式的列,默认会读取年月日、时分秒,因此我们要学会使用sqlite中的日期处理函数,方便我们转换日期格式,下方提供sqlite中常用函数大全,希望对你有帮助。

    sqlite函数大全http://suo.im/5DWraE

    导入相关库:

    import pandas as pd
    from pandasql import sqldf
    
    • 1
    • 2

    2)声明全局变量的2种方式

    • ① 在使用之前,声明该全局变量;
    • ② 一次性声明好全局变量;
    ① 在使用之前,声明该全局变量
    df1 = pd.read_excel("student.xlsx")
    df2 = pd.read_excel("sc.xlsx")
    df3 = pd.read_excel("course.xlsx")
    df4 = pd.read_excel("teacher.xlsx")
    
    
    global df1
    global df2
    global df3
    global df4
    query1 = "select * from df1 limit 5"
    query2 = "select * from df2 limit 5"
    query3 = "select * from df3"
    query4 = "select * from df4"
    
    sqldf(query1)
    sqldf(query2)
    sqldf(query3)
    sqldf(query4)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    部分结果如下:
    在这里插入图片描述

    ② 一次性声明好全局变量
    df1 = pd.read_excel("student.xlsx")
    df2 = pd.read_excel("sc.xlsx")
    df3 = pd.read_excel("course.xlsx")
    df4 = pd.read_excel("teacher.xlsx")
    
    pysqldf = lambda q: sqldf(q, globals())
    
    query1 = "select * from df1 limit 5"
    query2 = "select * from df2 limit 5"
    query3 = "select * from df3"
    query4 = "select * from df4"
    
    sqldf(query1)
    sqldf(query2)
    sqldf(query3)
    sqldf(query4)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    部分结果如下:
    在这里插入图片描述

    3)写几个简单的SQL语句

    ① 查看sqlite的版本
    student = pd.read_excel("student.xlsx")
    pysqldf = lambda q: sqldf(q, globals())
    query1 = """
        select sqlite_version(*)
    """
    pysqldf(query1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果如下:
    在这里插入图片描述

    ② where筛选
    student = pd.read_excel("student.xlsx")
    pysqldf = lambda q: sqldf(q, globals())
    query1 = """
        select * 
        from student 
        where strftime('%Y-%m-%d',sage) = '1990-01-01'
    """
    pysqldf(query1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果如下:
    在这里插入图片描述

    ③ 多表连接
    student = pd.read_excel("student.xlsx")
    sc = pd.read_excel("sc.xlsx")
    
    
    pysqldf = lambda q: sqldf(q, globals())
    query2 = """
        select *
        from student s
        join sc on s.sid = sc.sid
    """
    pysqldf(query2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    部分结果如下:
    在这里插入图片描述

    ④ 分组聚合
    student = pd.read_excel("student.xlsx")
    sc = pd.read_excel("sc.xlsx")
    
    
    pysqldf = lambda q: sqldf(q, globals())
    query2 = """
        select s.sname as 姓名,sum(sc.score) as 总分
        from student s
        join sc on s.sid = sc.sid
        group by s.sname
    """
    pysqldf(query2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果如下:
    在这里插入图片描述

    ⑤ union查询
    student = pd.read_excel("student.xlsx")
    pysqldf = lambda q: sqldf(q, globals())
    query1 = """
        select * 
        from student 
        where strftime('%Y-%m',sage) = '1990-01'
        union
        select * 
        from student 
        where strftime('%Y-%m',sage) = '1990-12'
    """
    pysqldf(query1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果如下:
    在这里插入图片描述

  • 相关阅读:
    有了HTTP,为什么还要RPC?
    API设计笔记:pimpl技巧
    U-boot下netconsole实现
    React中函数式组件与类组件有何不同?
    python抓取制定产品图片及简介代码实现
    安装ipfs-swarm-key-gen
    提交SCI论文修改稿时标注修改文字颜色
    91. 解码方法
    【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(难度⭐⭐)(65)
    信息系统项目管理师---第八章 项目质量管理
  • 原文地址:https://blog.csdn.net/m0_67403188/article/details/125241350