【问题标题】:Can all Relational Alegbra queries be done in SQL?所有关系代数查询都可以在 SQL 中完成吗?
【发布时间】:2015-11-18 04:17:36
【问题描述】:

我目前正在大学学习数据库课程。

我们被告知要在 SQL 中编写查询,您必须在一个语句中完成整个查询(即,以分号结尾的长行)。也就是说,我们被告知没有办法通过

构建复杂的查询
  • 使用查询创建一个表并将该表“保存”在某个地方(可能在某种变量中),
  • 然后使用不同的查询创建一个不同的表并“保存”它,
  • 然后最后使用这两个表(例如,加入它们)。

但是,您可以轻松编写执行此操作的关系代数表达式。

我的一个作业问题涉及很多外部连接,采用上述方法会更自然/更接近我对解决方案的看法。

这让我想到:所有关系代数表达式都可以用 SQL 编写吗?

【问题讨论】:

  • 为什么不能 ypu select * from (select * from A) A outer join (select * from B) B on A.x == B.x 这不行吗?
  • 嗯。它可能!我得试试看。我从未见过 (select * from A) A [即我想要“将表从查询中保存到变量中”] 的构造,我的教授强烈暗示 SQL 中不存在这样的构造......
  • 可以创建一个表并“保存”它”使用通用表表达式:with t1 as (select * from foo), t2 as (select * from bar) select * from t1 join t2 on t1.id = t2.other_id;。有关示例,请参见此处:postgresql.org/docs/current/static/queries-with.html
  • 您也可以使用临时表...但您不应该做这些事情。关系代数很好,但使用临时表来完成它就很糟糕了。

标签: sql subquery relational-algebra


【解决方案1】:

TL;DR 是的,任何代数表达式都可以通过子选择/子查询表示为单个 SQL 表达式。如果可用,也可以通过 CTE(公用表表达式)。您可以通过添加视图或(可能是临时的)基数来使用多个 SQL 表达式来表达代数表达式。

您可以嵌套 SELECT 语句。您必须将它们放在括号中,并在 FROM 子句连接中给它们一个别名(通过隐式或显式 AS)。 (也由 Jerry Jeremiah 评论。)

select * from mytable join (select x from yourtable) s

“保存”嵌套的选择值。 (又名派生表(值)。)它为您将在条件中提到的子选择/子查询表中的任意行提供名称。

您可以使用 CTE 和 WITH。同样,这不会“保存”表值。 (也由 a_horse_with_no_name 评论。)

with c as (select a from yourtable)
select c from yourtable

您可以创建自动填充的视图。

create view v select a from yourtable;
select * from mytable join v;

您可以创建临时表。 (后来由 Joel Coehoorn 评论)。 (或者 只需创建永久表。)您可以插入它们,然后在查询中使用。

create temporary table t as select a from yourtable;
select * from mytable join t;

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多