我不是SQL方面的专家,但是最近我开始在sqlite3
中的Python
模块中使用数据库,并与pandas
及其read_sql_query()
一起使用,工具。
现在,说,我有一个看起来像这样的数据库(我只是出于演示目的而将其编排而成)。
age iq married
===============
91 77 0
54 124 1
31 124 0
32 95 0
74 34 0
18 56 0
43 42 0
78 56 0
91 77 1
任务就在这里,这可能会引起一些混乱。我想选择智商与married=1
的行相同的所有行(人)(包括已婚的人本身)。所以我希望结果看起来像这样:
age iq married
===============
91 77 0
54 124 1
31 124 0
91 77 1
甚至一般来说,我的限制更为严格,希望选择与已婚者具有相同iq
和age
的所有人员。在这种情况下,结果将如下所示:
age iq married
===============
54 124 1
91 77 0
91 77 1
可能有很多其他列无法忽略。
现在,我当然可以迭代地做到这一点,首先选择已婚的,然后比较(age,iq)
的元组,但这有点无聊。问题是,是否有一种巧妙的方法可以pandas.read_sql_query()
一次完成此操作?
因此,简而言之,我正在尝试做这样的事情(我知道这只是选择已婚者,但这只是一个例子):
import sqlite3
import pandas as pd
connection = sqlite3.connect('people.db')
mydata = pd.read_sql_query(
"""
SELECT *
from People
WHERE married=1 ... *some magic here*
GROUP BY *foo*
HAVING *bar*
""", connection)
在这里我真的无法提出任何“魔术”来使其达到我想要的效果(可能是由于对所有SQL命令和条件的了解不足)。也许可以使用嵌套的SELECT
命令和诸如IN
之类的方法来做到这一点,但我不确定。
我觉得必须有一个简单的方法(否则我可能错了,并且迭代起来更容易),所以我要问社区!
答案 0 :(得分:3)
一种方法是在EXISTS
子句中使用WHERE
条件,该条件断言给定的IQ值至少与其他一条已婚记录匹配:
SELECT age, iq, married
FROM People p1
WHERE EXISTS (SELECT 1 FROM People p2 WHERE p1.iq = p2.iq AND p2.married = 1);
EXISTS
子查询在使用以下索引的情况下可能会具有更好的性能:
CREATE INDEX idx ON People (iq, married);
这将允许在表中快速查找给定的iq
值,并检查married
的状态。m
答案 1 :(得分:1)
尝试此查询:
select * from People
where iq in (
select iq from People
group by iq
having sum(married) > 0
)