子查询是邪恶的吗?

Ren*_*ani 3 sql subquery

这个问题是在朋友发表评论之后提出的.他说,当一个查询有很多子查询时,这是一个信号,表明数据库存在设计缺陷,必须避免这些缺陷.他还说很多书都有同样的建议.

我部分同意,但我认为这些查询具有复杂的逻辑,需要大量子查询,或者,为了避免子查询,查询的物化视图或大量数据冗余.

那么,子查询的真相是什么?他们必须始终避免吗?没问题吗?他们是否表明数据库设计存在缺陷?是否有可能使数据库设计允许复杂的查询而不需要数据冗余?

Mit*_*eat 5

不,子查询的存在并不一定意味着数据库模式的设计很差.

应谨慎使用相关子查询(即当内部条件指外部子句时).

除此之外,子查询通常是解决问题的有用且自然的方式.在可能的情况下,我倾向于使用连接而不是子查询.

许多查询优化器会将某些类型的子查询转换为连接.


one*_*hen 5

你朋友的逻辑有问题。

尽管 SQL 及其各种实现在某种程度上基于关系模型,但它缺少许多基本关系运算符的关键字或速记,特别是半连接、半差异(又名反连接)和除法。我经常使用子查询在 SQL 代码中编写半连接和半差异;至于除法,我不确定是否可以在不使用子查询的情况下在单个查询中执行!

所以我对子查询的使用是由 SQL 语言的可疑设计决定的,而不是我使用的数据库的设计。

ps 我想知道您和/或您的朋友是否使用术语“数据库”来表示数据库(数据集合)和 DBMS(管理数据的软件系统)。如果是这样并且在上下文中您指的是 DBMS,那么“当查询有很多子查询时,DBMS 有设计缺陷是一种‘气味’”这句话可能确实是正确的。