python实现oracle数据库连接并转成dataframe

数据库

多表连接 INNER JOIN

INNER JOIN 连接两个数据表的用法:
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号

INNER JOIN 连接三个数据表的用法:
SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号

INNER JOIN 连接四个数据表的用法:
SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号

INNER JOIN 连接五个数据表的用法:
SELECT * FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号

数据分组 group by :

select 列a from 表明 where 过滤条件 group by 列a
where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组。

分组求平均

oracle与mysql不同,除group by 后面的字段,其他都需要加上函数。

SELECT distinct pi.COMPCODE,AVG(pi.ROEAVG),AVG(pi.ROTA), AVG(pi.ROA),AVG(pi.ROIC),AVG(pi.ROEANNUAL), AVG(pi.ROAAANNUAL),AVG(pi.SNPMARGINCONMS),AVG(pi.SGPMARGIN),AVG(pi.SCOSTRT), AVG(pi.OPEXPRT),AVG(pi.OPPTOTP), AVG(pic.NETPROFIT),AVG(pic.BIZTOTINCO),AVG(pic.PERPROFIT),AVG(pi.EBITTOTOPI), AVG(pic.BIZTOTCOST),AVG(pic.MANAEXPE),AVG(pic.FINEXPE),AVG(pic.ASSEIMPALOSS), AVG(pi.EBITDA),AVG(pic.BIZINCO),AVG(pi.OPANITOTP),AVG(pi.NVALCHGITOTP),AVG(pi.NNONOPITOTP), AVG(pi.INCOTAXTOTP),AVG(pi.NPCUT), AVG(pic.NETPROFIT),AVG(pi.SCASHREVTOOPIRT),AVG(pi.OPANCFTOOPNI),AVG(pi.OPNCFTOTNCF),AVG(pc.MANANETR),AVG(pic.BIZINCO),AVG(pi.OPANCFTOOPNI),AVG(pi.OPNCFTOTA),AVG(pi.ASSLIABRT), AVG(pi.TDEBTTOTA), AVG(pi.LTMDEBTTOEQU),AVG(pi.EM), AVG(pb.TOTCURRASSET),AVG(pb.TOTALNONCASSETS), AVG(pb.TOTALCURRLIAB),AVG(pb.TOTLIAB),AVG(pb.TOTALNONCLIAB),AVG(pi.CURRENTRT), AVG(pi.QUICKRT),AVG(pi.CONSVATQUICKRT),AVG(pi.MFTOSHTDEBT), AVG(pc.BIZNETCFLOW),AVG(pi.EQURT),AVG(pi.NTANGASSTOTLIAB),AVG(pi.NTANGASSTOTDEBT),AVG(pi.NTANGASSTONDEBT),AVG(pi.EBITDATOTDEBT),AVG(pi.LTMDEBT),AVG(pi.NDEBT),AVG(pi.EBITSCOVER),AVG(pi.LTMDEBTTOWORKCAP),AVG(pi.EBITDATOTDEBT),AVG(pi.EBITDASCOVER),AVG(pi.MFTOSHTDEBT),AVG(pi.OPCYCLE), AVG(pi.INVTURNDAYS),AVG(pi.ACCRECGTURNDAYS), AVG(pi.INVTURNRT),AVG(pi.ACCRECGTURNRT),AVG(pi.CURASSTURNRT),AVG(pi.FATURNRT),AVG(pi.TATURNRT),AVG(pic.BIZTOTINCO),  AVG(pic.PERPROFIT),AVG(pc.NETPROFIT),AVG(pc.INVNETCASHFLOW),AVG(pc.FINNETCFLOW) FROM ((TQ_FIN_PROINDICDATA pi INNER JOIN TQ_FIN_PROBALSHEETNEW pb ON pi.COMPCODE = pb.COMPCODE) INNER JOIN TQ_FIN_PROCFSTATEMENTNEW pc ON pi.COMPCODE =  pc.COMPCODE) INNER JOIN TQ_FIN_PROINCSTATEMENTNEW pic ON  pi.COMPCODE = pic.COMPCODE WHERE  (pi.REPORTYEAR = '2016'  AND pb.REPORTYEAR = '2016'  AND pc.REPORTYEAR = '2016'  AND pic.REPORTYEAR = '2016')  GROUP BY pi.COMPCODE

python连接

连接数据库


import cx_Oracle as cx
con = cx.connect('数据库名', '密码', '服务地址/表名')
cursor = con.cursor()       #创建游标
cursor.execute("SELECT pi.ROEAVG,pi.ROTA,pi.ROA,pi.ROIC,pi.ROEANNUAL,pi.ROAAANNUAL,pi.SNPMARGINCONMS,pi.SGPMARGIN,pi.SCOSTRT,pi.OPEXPRT,pi.OPPTOTP,pic.NETPROFIT,pic.BIZTOTINCO,pic.PERPROFIT,pi.EBITTOTOPI,pic.BIZTOTCOST,pic.MANAEXPE,pic.FINEXPE,pic.ASSEIMPALOSS,pi.EBITDA,pic.BIZINCO,pi.OPANITOTP,pi.NNONOPITOTP,pi.INCOTAXTOTP,pi.NVALCHGITOTP,pi.NPCUT,pic.NETPROFIT,pi.SCASHREVTOOPIRT,pi.OPANCFTOOPNI,pi.OPNCFTOTNCF,pc.MANANETR,pic.BIZINCO,pi.OPANCFTOOPNI,pi.OPNCFTOTA,pi.ASSLIABRT,pi.TDEBTTOTA,pi.LTMDEBTTOEQU,pi.EM,pb.TOTCURRASSET,pb.TOTALNONCASSETS,pb.TOTALCURRLIAB,pb.TOTLIAB,pb.TOTALNONCLIAB,pi.CURRENTRT,pi.QUICKRT,pi.CONSVATQUICKRT,pi.MFTOSHTDEBT,pc.BIZNETCFLOW,pi.EQURT,pi.NTANGASSTOTLIAB,pi.NTANGASSTOTDEBT,pi.NTANGASSTONDEBT,pi.EBITDATOTDEBT,pi.LTMDEBT,pi.NDEBT,pi.EBITSCOVER,pi.LTMDEBTTOWORKCAP,pi.EBITDATOTDEBT,pi.EBITDASCOVER,pi.MFTOSHTDEBT,pi.OPCYCLE,pi.INVTURNDAYS,pi.ACCRECGTURNDAYS,pi.INVTURNRT,pi.ACCRECGTURNRT,pi.CURASSTURNRT,pi.FATURNRT,pi.TATURNRT,pic.BIZTOTINCO,pic.PERPROFIT,pc.NETPROFIT,pc.INVNETCASHFLOW,pc.FINNETCFLOW FROM TQ_FIN_PROINDICDATA pi,TQ_FIN_PROBALSHEETNEW pb,TQ_FIN_PROCFSTATEMENTNEW pc,TQ_FIN_PROINCSTATEMENTNEW pic WHERE pi.COMPCODE = pb.COMPCODE AND  pb.COMPCODE =  pc.COMPCODE AND  pc.COMPCODE = pic.COMPCODE AND  pi.REPORTYEAR = '2016'  AND pb.REPORTYEAR = '2016'  AND pc.REPORTYEAR = '2016' AND pic.REPORTYEAR = '2016' ")
data = cursor.fetchone()        #获取一条数据
print(data)     #打印数据
cursor.close()  #关闭游标
con.close()     #关闭数据库连接

转化成dataframe

fetchone() : 返回单个的元组,也就是一条记录(row),如果没有结果 , 则返回 None
fetchall() : 返回多个元组,即返回多条记录(rows),如果没有结果,则返回 ()
fetchall()报内存不够的错误时,用fetchone()循环获取。


import cx_Oracle as cx
con = cx.connect('数据库名', '密码', '服务地址/表名') 
cursor = con.cursor()  # 创建游标
cursor.execute(
        "SELECT distinct pi.COMPCODE,AVG(pi.ROEAVG),AVG(pi.ROTA), AVG(pi.ROA),AVG(pi.ROIC),AVG(pi.ROEANNUAL), AVG(pi.ROAANNUAL),AVG(pi.ROAAANNUAL),AVG(pi.SNPMARGINCONMS),AVG(pi.SGPMARGIN),AVG(pi.SCOSTRT), AVG(pi.OPEXPRT),AVG(pi.OPPTOTP), AVG(pic.NETPROFIT),AVG(pic.BIZTOTINCO),AVG(pic.PERPROFIT),AVG(pi.EBITTOTOPI), AVG(pic.BIZTOTCOST),AVG(pic.MANAEXPE),AVG(pic.FINEXPE),AVG(pic.ASSEIMPALOSS), AVG(pi.EBITDA),AVG(pic.BIZINCO),AVG(pi.OPANITOTP),AVG(pi.NVALCHGITOTP),AVG(pi.NNONOPITOTP), AVG(pi.INCOTAXTOTP),AVG(pi.NPCUT), AVG(pic.NETPROFIT),AVG(pi.SCASHREVTOOPIRT),AVG(pi.OPANCFTOOPNI),AVG(pi.OPNCFTOTNCF),AVG(pc.MANANETR),AVG(pic.BIZINCO),AVG(pi.OPANCFTOOPNI),AVG(pi.OPNCFTOTA),AVG(pi.ASSLIABRT), AVG(pi.TDEBTTOTA), AVG(pi.LTMDEBTTOEQU),AVG(pi.EM), AVG(pb.TOTCURRASSET),AVG(pb.TOTALNONCASSETS), AVG(pb.TOTALCURRLIAB),AVG(pb.TOTLIAB),AVG(pb.TOTALNONCLIAB),AVG(pi.CURRENTRT), AVG(pi.QUICKRT),AVG(pi.CONSVATQUICKRT),AVG(pi.MFTOSHTDEBT), AVG(pc.BIZNETCFLOW),AVG(pi.EQURT),AVG(pi.NTANGASSTOTLIAB),AVG(pi.NTANGASSTOTDEBT),AVG(pi.NTANGASSTONDEBT),AVG(pi.EBITDATOTDEBT),AVG(pi.LTMDEBT),AVG(pi.NDEBT),AVG(pi.EBITSCOVER),AVG(pi.LTMDEBTTOWORKCAP),AVG(pi.EBITDATOTDEBT),AVG(pi.EBITDASCOVER),AVG(pi.MFTOSHTDEBT),AVG(pi.OPCYCLE), AVG(pi.INVTURNDAYS),AVG(pi.ACCRECGTURNDAYS), AVG(pi.INVTURNRT),AVG(pi.ACCRECGTURNRT),AVG(pi.CURASSTURNRT),AVG(pi.FATURNRT),AVG(pi.TATURNRT),AVG(pic.BIZTOTINCO),  AVG(pic.PERPROFIT),AVG(pc.NETPROFIT),AVG(pc.INVNETCASHFLOW),AVG(pc.FINNETCFLOW) FROM ((TQ_FIN_PROINDICDATA pi INNER JOIN TQ_FIN_PROBALSHEETNEW pb ON pi.COMPCODE = pb.COMPCODE) INNER JOIN TQ_FIN_PROCFSTATEMENTNEW pc ON pi.COMPCODE =  pc.COMPCODE) INNER JOIN TQ_FIN_PROINCSTATEMENTNEW pic ON  pi.COMPCODE = pic.COMPCODE WHERE  (pi.REPORTYEAR = '2016'  AND pb.REPORTYEAR = '2016'  AND pc.REPORTYEAR = '2016'  AND pic.REPORTYEAR = '2016')  GROUP BY pi.COMPCODE")
df = pd.DataFrame()
row = cursor.fetchone()
# print(len(row))#75
while row:
    # print(row)
    # df = df.append(pd.DataFrame({'COMPCODE': row[0],'POEAVG': row[1],'ROTA': row[2],'ROA': row[3],'ROIC': row[4],'ROEANNUAL': row[5],'ROAAANNUAL': row[6],'SNPMARGINCONMS': row[7],'SGPMARGIN': row[8],'SCOSTRT': row[9],'OPEXPRT': row[10],'OPPTOTP': row[11],'NETPROFIT': row[12],'BIZTOTINCO': row[13],'PERPROFIT':row[14],'EBITTOTOPI':row[15],'BIZTOTCOST':row[16],'MANAEXPE':row[17],'FINEXPE':row[18],'ASSEIMPALOSS':row[19],'EBITDA':row[20],'BIZINCO':row[21],'OPANITOTP':row[22],'NVALCHGITOTP':row[23],'NNONOPITOTP':row[24],'INCOTAXTOTP':row[25],'NPCUT':row[26],'NETPROFIT':row[27],'SCASHREVTOOPIRT':row[28],'OPANCFTOOPNI':row[29],'OPNCFTOTNCF':row[30],'MANANETR':row[31],'BIZINCO':row[32],'OPANCFTOOPNI':row[33],'OPNCFTOTA':row[34],'ASSLIABRT':row[35],'TDEBTTOTA':row[36],'LTMDEBTTOEQU':row[37],'EM':row[38],'TOTCURRASSET':row[39],'TOTALNONCASSETS':row[40],'TOTALCURRLIAB':row[41],'TOTLIAB':row[42],'TOTALNONCLIAB':row[43],'CURRENTRT':row[44],'QUICKRT':row[45],'CONSVATQUICKRT':row[46],'MFTOSHTDEBT':row[47],'BIZNETCFLOW':row[48],'EQURT':row[49],'NTANGASSTOTLIAB':row[50],'NTANGASSTOTDEBT':row[51],'NTANGASSTONDEBT':row[52],'EBITDATOTDEBT':row[53],'LTMDEBT':row[54],'NDEBT':row[55],'EBITSCOVER':row[56],'LTMDEBTTOWORKCAP':row[57],'EBITDATOTDEBT':row[58],'EBITDASCOVER':row[59],'MFTOSHTDEBT':row[60],'OPCYCLE':row[61],'INVTURNDAYS':row[62],'ACCRECGTURNDAYS':row[63],'INVTURNRT':row[64],'ACCRECGTURNRT':row[65],'CURASSTURNRT':row[66],'FATURNRT':row[67],'TATURNRT':row[68],'BIZTOTINCO':row[69],'PERPROFIT':row[70],'NETPROFIT':row[71],'INVNETCASHFLOW':row[72],'FINNETCFLOW':row[73]}, index=[0]))
    df = df.append(pd.DataFrame(
            {
    
    'COMPCODE': [row[0]], 'ROEAVG': [row[1]], 'ROTA': [row[2]], 'ROA': [row[3]], 'ROIC': [row[4]],
             'ROEANNUAL': [row[5]],'ROAANNUAL':[row[6]] ,'ROAAANNUAL': [row[7]], 'SNPMARGINCONMS': [row[8]], 'SGPMARGIN': [row[9]],
             'SCOSTRT': [row[10]], 'OPEXPRT': [row[11]], 'OPPTOTP': [row[12]], 'NETPROFIT': [row[13]],
             'BIZTOTINCO': [row[14]], 'PERPROFIT': [row[15]], 'EBITTOTOPI': [row[16]], 'BIZTOTCOST': [row[17]],
             'MANAEXPE': [row[18]], 'FINEXPE': [row[19]], 'ASSEIMPALOSS': [row[20]], 'EBITDA': [row[21]],
             'BIZINCO': [row[22]], 'OPANITOTP': [row[23]], 'NVALCHGITOTP': [row[24]], 'NNONOPITOTP': [row[25]],
             'INCOTAXTOTP': [row[26]], 'NPCUT': [row[27]], 'NETPROFIT': [row[28]], 'SCASHREVTOOPIRT': [row[29]],
             'OPANCFTOOPNI': [row[30]], 'OPNCFTOTNCF': [row[31]], 'MANANETR': [row[32]], 'BIZINCO': [row[33]],
             'OPANCFTOOPNI': [row[34]], 'OPNCFTOTA': [row[35]], 'ASSLIABRT': [row[36]], 'TDEBTTOTA': [row[37]],
             'LTMDEBTTOEQU': [row[38]], 'EM': [row[39]], 'TOTCURRASSET': [row[40]], 'TOTALNONCASSETS': [row[41]],
             'TOTALCURRLIAB': [row[42]], 'TOTLIAB': [row[43]], 'TOTALNONCLIAB': [row[44]], 'CURRENTRT': [row[45]],
             'QUICKRT': [row[46]], 'CONSVATQUICKRT': [row[47]], 'MFTOSHTDEBT': [row[48]], 'BIZNETCFLOW': [row[49]],
             'EQURT': [row[50]], 'NTANGASSTOTLIAB': [row[51]], 'NTANGASSTOTDEBT': [row[52]],
             'NTANGASSTONDEBT': [row[53]], 'EBITDATOTDEBT': [row[54]], 'LTMDEBT': [row[55]], 'NDEBT': [row[56]],
             'EBITSCOVER': [row[57]], 'LTMDEBTTOWORKCAP': [row[58]], 'EBITDATOTDEBT': [row[59]],
             'EBITDASCOVER': [row[60]], 'MFTOSHTDEBT': [row[61]], 'OPCYCLE': [row[62]], 'INVTURNDAYS': [row[63]],
             'ACCRECGTURNDAYS': [row[64]], 'INVTURNRT': [row[65]], 'ACCRECGTURNRT': [row[66]],
             'CURASSTURNRT': [row[67]], 'FATURNRT': [row[68]], 'TATURNRT': [row[69]], 'BIZTOTINCO': [row[70]],
             'PERPROFIT': [row[71]], 'NETPROFIT': [row[72]], 'INVNETCASHFLOW': [row[73]], 'FINNETCFLOW': [row[74]]}))
    row = cursor.fetchone()
# print(df)     #打印数据
cursor.close()  # 关闭游标
print('数据连接成功')

猜你喜欢

转载自blog.csdn.net/qq_47326711/article/details/126265903
今日推荐