SQL与Pandas代码分析与比较
本文旨在详细分析并比较在处理数据库查询问题时SQL代码与Pandas代码的差异。我们将以一个具体的算法题为例,探讨如何在SQL和Pandas中实现相同的功能,并分析将SQL查询转换为Pandas操作的思考过程。
问题描述
本例涉及到的问题是:找出没有与特定公司(此例中为"RED"公司)相关订单的所有销售人员的姓名。
SQL代码解析
SQL代码1
SELECT
name
FROM
SalesPerson
WHERE
SalesPerson.sales_id
NOT IN (
SELECT
sales_id
FROM
Orders
WHERE
Orders.com_id = (
SELECT
com_id
FROM
Company
WHERE
Company.name = 'RED'
)
)
此SQL查询的目的是从SalesPerson
表中选择没有向“RED”公司销售过的销售人员的姓名。它的做法较为简单粗暴,通过一个嵌套的子查询来实现,首先在内部子查询中找出与“RED”公司相关的所有订单,然后在外部查询中选择那些不在这些订单中的销售人员。
SQL代码2
SELECT
name
FROM
SalesPerson
WHERE
SalesPerson.sales_id NOT IN (
SELECT
sales_id
FROM
Orders LEFT JOIN Company ON Company.com_id = Orders.com_id
WHERE
Company.name = 'RED'
)
这个查询与第一个查询相似,但使用了左连接(LEFT JOIN)来关联Orders
和Company
表,性能更优。这个查询的逻辑是先找出所有与“RED”公司有关的订单,然后选择那些不在这些订单中的销售人员。
Pandas代码解析
import pandas as pd
def sales_person(sales_person: pd.DataFrame, company: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:
df = pd.merge(orders, company, on='com_id')
fil = df[df['name'] == 'RED']
invalid_ids = fil.sales_id.unique()
valid_sales = sales_person[~sales_person['sales_id'].isin(invalid_ids)]
return valid_sales[['name']]
在SQL代码2的Pandas实现中,首先通过pd.merge
将orders
和company
表连接,然后筛选出与“RED”公司相关的订单。接着从这些订单中提取销售人员的ID,并在sales_person
表中选择那些不在这些ID中的销售人员。
SQL转Pandas思考步骤
- 数据关联:SQL中的JOIN操作在Pandas中通过
merge
或join
函数实现。 - 子查询转换:SQL中的子查询在Pandas中通常转换为一系列步骤,包括筛选操作和数据集的切片。
- 集合操作:SQL中的IN和NOT IN操作在Pandas中可以通过
isin
方法以及布尔索引实现。
在转换SQL到Pandas时,重要的是理解SQL查询的逻辑并将其分解成Pandas可以执行的步骤。在这个例子中,关键是理解如何关联不同的数据表并对数据进行适当的筛选和提取。
SQL代码执行步骤
- FROM从指定的数据表中开始。
- JOIN完成数据表之间的连接操作。
- WHERE根据条件筛选数据。
- SELECT返回数据。
希望这篇分析能够清晰地展示SQL与Pandas在数据处理方面的异同,并帮助读者更好地理解如何将SQL查询转换为Pandas操作。