sql - 数据库代数:从数据库结构中导出属性
问题描述
我目前正在编写一段代码,该代码使用 sqlalchemy 从数据库结构模型生成 SQL 查询。这个工具的目标是无论定义什么数据库结构都可以工作。
为了使其正常工作,我需要实施规则来过滤无用的生成查询。
例如:
SELECT SUM(col_a)
FROM (
SELECT SUM(col_b) AS col_a
FROM tableA
GROUP BY col_c
)
和
SELECT SUM(col_b) FROM tableA
产生完全相同的结果。因此,不应生成其中之一(例如更复杂的)
其他示例:
SELECT * FROM tableA WHERE col_a = True and col_a = False
此查询始终返回一个空集
对于这两个示例,结果是静态可预测的(仅使用数据库结构而不使用其中的数据)。
所以,我想知道是否存在可以表达这些概念的代数,以帮助我生成有关列、表、查询结果等的属性。
属性示例如下:如果两列 col_a 和 col_b 通过一对一关系连接,则 SELECT col_a 的每一行始终只有一个 col_b 值。因此:
SELECT col_a FROM tableA WHERE col_b = "value1" and col_b = "value2"
将始终返回一个空集(也因为 col_b 不能同时有两个值,但无论如何..)
解决方案
通常有大量关于查询优化的已发表研究,如果您不熟悉,请查看研究档案和出版物,如 SIGMOD Record。
你这种语义优化对于 SQL 来说是一个很难解决的问题。您可以通过使用更正确地基于关系代数的语言来使事情变得更容易,然后可能将其转换为 SQL 作为最后一步。SQL 不是关系型的,也不等同于 RA。SQL 的特性意味着您可能期望的查询实际上是等价的。
只是您在 SQL 中必须处理的一些额外困难:未命名的列(您的前两个示例查询);别名(您的第一个查询是非法的,需要别名,但其他查询不需要);类型转换;列名范围的上下文相关规则;缺少密钥和密钥派生;重复的列;重复行;三值逻辑。这些“特征”和遗漏使查询处理更加复杂,而对查询作者/用户没有任何特殊价值。
推荐阅读
- azure - 如何将 csv 文件内容传递给 Azure 逻辑应用程序中的 Http 调用
- sql - 如何替换 Oracle 数据库中 nclob 类型列中的 xml 元素?
- r - 如何删除列表中的相同行?
- apple-music - 历史:播放的歌曲
- pic - PIC如何将PPS映射到正常输入
- nuget - 如何使用 JFrog CLI 按版本号对 Artifactory 包搜索结果进行排序?
- sql - 如何更改此动态查询
- php - tcpdf 中的 SVG 渲染器不支持 00FF 以上的 UTF-8 字符吗?
- javascript - 将多个动作传递给 bindActionCreators
- r - override.aes 与列表参数的命名向量