Query(查询)是操作数据的灵魂——无论是从百万级数据库里抓取一条记录,还是从DataFrame中筛选特定行,都离不开它。一句话结论:有数据库就用SQL query,有数据框就用pandas query,两者语法相似但场景不同。SQL是ANSI/ISO标准语言,适用于MySQL、PostgreSQL等关系型数据库;pandas的query()方法则专为Python数据分析设计,一行代码替代繁琐的布尔索引。下面用5种经典用法,一次性讲清query怎么用。
SQL(Structured Query Language)是操作关系型数据库的标准语言,核心目的是让用户与数据库交互。一个典型的SQL query包含SELECT、WHERE、FROM等关键字,就像在数据库里“问问题”。例如查询所有客户记录:SELECT * FROM Customers;,返回Customers表的全部行和列。更常用的场景是带条件筛选:
| SQL命令 | 功能 | 示例 |
|---|---|---|
| SELECT | 检索数据 | SELECT CustomerName, City FROM Customers WHERE Country='USA'; |
| UPDATE | 更新记录 | UPDATE Customers SET City='New York' WHERE CustomerName='Alfreds Futterkiste'; |
| DELETE | 删除记录 | DELETE FROM Customers WHERE CustomerName='Berglunds snabbköp'; |
| INSERT INTO | 插入新记录 | INSERT INTO Customers (CustomerName, City) VALUES ('New Customer', 'London'); |
| CREATE DATABASE | 创建数据库 | CREATE DATABASE MyDatabase; |
表:SQL常用命令及示例(来源:SQL标准文档)
场景翻译:你是一家电商公司的数据管理员,想查看“2025年下单但未付款”的订单——用SELECT * FROM Orders WHERE OrderDate='2025' AND Status='Pending';,秒出结果。如果是普通办公人员,使用Excel的筛选功能也能做到类似效果,但SQL能处理百万行数据且速度更快。人群判断:后端开发、数据库管理员、数据分析师必须掌握SQL query,它是查询关系型数据库的唯一标准方式。
Python pandas库的query()方法让你用类似SQL的语法过滤DataFrame,一行代码取代多层布尔逻辑。基本语法:df.query('A > 2'),直接选出A列大于2的所有行。以下是5个经典用法,覆盖90%的数据筛选场景:
假设你有一个销售数据表,包含商品名称和销量:
import pandas as pd
data = {'product': ['A', 'B', 'C'], 'sales': [100, 200, 150]}
df = pd.DataFrame(data)
# 筛选销量大于120的商品
result = df.query('sales > 120')
print(result) 输出结果是B和C两行。与用df[df['sales'] > 120]相比,query写法更接近自然语言,尤其适合长条件。
同时满足多个条件用&(与)或|(或):
# 筛选销量大于100且小于200的商品
result = df.query('sales > 100 & sales < 200') 注意:pandas中&两侧的条件要用括号括起来?在query字符串里无需额外括号,引擎会自动解析优先级。如果你要筛选“销量大于100或商品名为C”:df.query('sales > 100 | product == "C"')。
先查询再排序,常见于TopN分析:
# 查询销量小于等于150的商品,并按销量升序
result = df.query('sales <= 150').sort_values(by='sales', ascending=True) 场景翻译:你是一个电商运营,想找出“上月订单金额超过500元的用户”并按金额从高到低排列——用df.query('amount > 500').sort_values(by='amount', ascending=False),5秒搞定。
pandas的query支持in关键字,适用于分类变量:
# 筛选颜色为红色、绿色或蓝色的行
data = {'color': ['red', 'green', 'blue', 'yellow']}
df = pd.DataFrame(data)
result = df.query('color in ["red", "green", "blue"]')注意列表要用引号包裹字符串。
当条件值来自外部变量时,用@引用:
threshold = 150
result = df.query('sales > @threshold')这比f-string拼接更安全,避免SQL注入风险(pandas内部处理)。
场景翻译:数据科学家做特征工程时,经常需要从DataFrame中按规则筛选子集,query能让代码更整洁。例如按“年龄>30且收入<5万”筛选目标人群,一行完成。唯一需要注意的是,query内部表达式不能包含Python原生函数(如str.contains),此时需退回到传统布尔索引。人群判断:Python数据分析师、机器学习从业者闭眼用query,它比手动构造条件节约50%代码量。
两者并非竞争关系,而是互补工具。SQL query适合处理存储在数据库中的海量数据(如10亿行交易记录),pandas query适合加载到内存后的数据框(通常百万行以内)。如果你已经用Python读取了数据,pandas query更快捷;如果你直接连接数据库,用SQL原生接口效率更高。一个简单的判断标准:数据在哪里,query就用哪种。例如,从MySQL取数用SQL,数据取出后用pandas做分析用query。两者语法相似度超过80%,学会一个能快速迁移到另一个。
Q1:SQL中的query和pandas的query性能哪个好?
没有绝对答案。SQL的查询由数据库引擎优化(如索引),对大数据集(千万级以上)性能远优于pandas。pandas的query适合内存可容纳的数据(通常百万行以内),且不支持并行计算(至少原生不支持)。建议:数据量>100万行优先用SQL,≤100万行用pandas query更灵活。
Q2:pandas query中字符串条件为什么要加双引号?
因为query()的参数本身就是一个字符串(expr),内部字符串需要用引号包裹。例如df.query('product == "A"'),外层单引号是整个表达式,内层双引号表示字符串值。如果值本身包含单引号,可以互换或使用转义。这是Python字符串的常规规则。
Q3:如何用query实现模糊匹配(如包含某关键词)?
pandas query不支持直接写str.contains,但可以通过变量配合@结合Python函数实现:pattern = '关键词'; df.query('product.str.contains(@pattern)', engine='python')。注意需要指定engine='python',因为默认numexpr引擎不支持字符串方法。SQL中则用LIKE:SELECT * FROM table WHERE product LIKE '%关键词%';。
Q4:SQL和pandas query中in的写法有何不同?
SQL: WHERE color IN ('red', 'blue'),pandas query: df.query('color in ["red", "blue"]')。差别在于列表括号:SQL用小括号、字符串用单引号;pandas用方括号、字符串用双引号(可为单引号但需一致)。注意pandas的in不区分大小写?默认区分,可用str.lower()转换。
更新日期:2026年07月30日
来源