天天看点

oracle子查询order by_数据分析之数据查询:SQL和Python的数据查询对比

1 数据查询的工具

数据分析过程中,少不了数据查询和数据清洗的工作,相关的工具有Excel、SQL、Python等。

对于少量数据:Excel是图形化操作的办公软件,处理少量数据不成问题。处理方法是:使用工具栏的工具或函数,“查询”功能对应的是筛选,“匹配”功能对应的vlookup函数。

对于大量数据:一般使用sql或python处理。sql是结构化查询语言,数据一般存储在数据库中,使用sql查询出来。python是一门编程语言,有很多数据处理的包,比如pandas包就广泛的应用于数据处理。

2 需求和数据源介绍

2.1 数据查询的需求

一般情况下需求有:了解数据概览、查询某一列数据、分组、聚合、表的连接、自定义排序、子查询等。

2.2 数据源介绍

oracle子查询order by_数据分析之数据查询:SQL和Python的数据查询对比

两个表的数据

一共2个表,sales表是用户和购买商品的信息,product表是产品信息。已经使用mysql创建表和添加数据,pandas已经加载数据。

3 SQL和Python数据查询的对比

在数据查询方面,SQL非常经典,所以本文把SQL作为标准,使用Pandas来实现SQL类似的查询功能。

3.1 数据概览

拿到一个表,首先需要了解表的基本信息,有哪些字段,分别是什么意思,快速获得数据概览。

  • SQL:desc sales;
  • Pandas:sales.describe()

3.2 查询前n行记录

  • SQL:select * from sales limit 5;
  • Pandas:sales.head(5)

3.3 查询某几列数据

  • SQL:select id, date from sales;
  • Pandas:sales[['id', 'date']]、sales.loc[:, ['id', 'date']]、sales.iloc[:, [0, 2]]

3.4 使用筛选条件查询数据

  • SQL:

select * from sales where id > 2;

select * from sales where id=2 and price>=5;

  • Pandas:

sales[sales['id'] > 2]

sales[(sales['id'] == 2) & (sales['price'] >= 5)] # pandas中用&符号实现多条件

3.5 判断空值

  • SQL:select * from sales where name is null;
  • Pandas:sales[sales['name'].isnull()]

3.6 剔除重复值

  • SQL:select distinct id , name from sales;
  • Pandas:sales[sales.duplicated(subset=['id', 'name'])]

3.7 分组

  • SQL:select id,name from sales group by id;
  • Pandas:[x[1] for x in sales.groupby(by='id', axis=0)]

3.8 聚合

  • SQL:select count(*) from sales;
  • Pandas:sales.count()

3.9 分组后聚合

  • SQL:select count(id) , sum(amount) from sales group by id;
  • Pandas:sales.groupby(by='id').agg({'productId': 'count', 'amount': 'sum'}

3.10 排序

  • SQL:select * from sales order by id asc, date desc;
  • Pandas:sales.sort_values(by=['id', 'date'],ascending=[True, False])

3.11 case-when

  • SQL:select case when amount=0 then'没有购买' when amount<=5 then '购买数量少' else '购买数量多' end from sales;
  • Pandas:pd.cut(sales['amount'], bins=[-0.01, 0, 5, 99], labels=['没有购买', '购买数量少', '购买数量多'])

3.12 连接

  • SQL:select a.*, b.* from sales a join product b on a.productId=b.productId;
  • Pandas:pd.merge(sales, product, how='inner', on='productId')

3.13 合并

  • SQL:select * from sales where id>3 union all select * from sales where id>4;
  • Pandas:pd.concat([sales[sales['id'] > 3], sales[sales['id'] > 4]], axis=0)

3.14 值的计数

  • SQL:select * from(select id, count(id) as count from sales group by id ) as t order by t.count desc;
  • Pandas:pd.value_counts(sales['id'])

3.15 自定义排序

  • SQL:select * from sales order by field(name,'david','mike','beck','john','kobe','jason');
  • Pandas:

name_order = ['david','mike','beck','john','kobe','jason'] # 排序字典

sales['name_order'] = sales['name'].astype('category').cat.set_categories(name_order) # 新增一列用于排序

sales.sort_values(by='name_order') # 自定义排序结果

3.16 子查询

  • SQL:select * from sales where productId in (select productId from product where productName='苹果');
  • Pandas:sales.loc[sales['productId'].isin(product.loc[product['productName'] == '苹果', 'productId']), :] # 先从product取出productName为苹果的productId,再匹配sales表的productId构构造出布尔索引,最后再从sales筛选这些数据。

4 总结

oracle子查询order by_数据分析之数据查询:SQL和Python的数据查询对比

SQL和Pandas对比总结

不同的人会使用不同的工具,sql和pandas适用于不同的人群,工具之间本身并没有谁好谁坏,因为都是程序去实现的。数据分析师一般需要同时掌握sql和pandas,为了不混淆语法,所以做此对比。