【问题标题】:How does this Python list reads as a SQL query这个 Python 列表如何读取为 SQL 查询
【发布时间】:2017-10-04 18:38:38
【问题描述】:

假设我在 Python 中有这个列表理解

[f(x, y) for (x, y) in itertools.product(X, Y) if g(x, y)]

其中XY 是列表,fg 是作用于列表成员的函数。它如何转换为 SQL 查询?这是我的解决方案:

SELECT
    do_something(X.column, Y.another_column, X.our_column), 
    do_something_else(Y.that_column, X.that_column, Y.my_column)
FROM
    this_scheme.your_table as X,
    that_scheme.our_table as Y
WHERE
    condition(X.column, Y.my_column) AND
    another_condition(Y.another_column, X.our_column) 

正确吗?可以改进吗?效率高吗?

【问题讨论】:

  • 效率取决于诸如索引之类的实现细节,它通常只能用于某些类型的条件(列之间的比较,而不是函数调用)。
  • 提供真实的数据样本和预期的结果
  • (x, y) 表示每个原始表中只有一列,X.xY.y。这与您的 SQL 查询有何关系,该查询在每个表中列出了几列?什么是“坏”列?
  • | 如何链接 f(x,y) 和 g(x,y) ?我们假设是一个过滤结果的条件?

标签: python mysql sql


【解决方案1】:

您的代码是正确的,尽管在现代 SQL 中,我们更喜欢使用显式的 JOIN 子句而不是叉积,因此最好将其写为:

SELECT
    do_something(X.column, Y.another_column, X.our_column), 
    do_something_else(Y.that_column, X.that_column, Y.my_column)
FROM this_scheme.your_table as X,
INNER JOIN that_scheme.our_table as Y
ON condition(X.column, Y.my_column) AND
    another_condition(Y.another_column, X.our_column) 

请参阅INNER JOIN ON vs WHERE clause,了解INNER JOIN 相对于交叉产品的优点。

如果条件是实际的函数调用,这很可能是非常低效的,因为它无法利用索引。 DBMS 必须生成完整的叉积,然后调用所有列上的函数以确定它是否应包含在结果集中,因此它将是O(m * n),其中mn 是数字表中的行数。但是如果是像X.colA = Y.colB 这样简单的东西,这些列上的索引可以用来优化查询。

索引通常可用于优化相等和不等比较(例如col1 < col2)和字符串前缀(col1 LIKE 'foo%')。您还可以为全文搜索和地理坐标创建专门的索引。

【讨论】:

  • 如果f 被定义为f(X, Y) = (do_something(X, Y), do_something_else(X, Y))g 被定义为g(X, Y) = condition(X, Y) AND another_condition(X, Y),那么您在问题中的答案很好。 Barmar 的答案是等价的,只是它没有对 fg 的形式施加任何限制,因此更直接地翻译了您的数学符号和 Python 列表理解。
  • @barmar 谢谢,你的代码比我的更受欢迎有什么原因吗?老实说(我刚开始使用 sql)我的代码更具可读性
  • 它只是更现代的语法。 JOINON 让您可以清楚地了解哪些条件用于关联表格,而哪些条件更普遍适用。当您连接多个表时,它特别有用,您可以清楚地看到关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2015-03-02
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多