是否可以在 SQL 中完成所有关系代数查询?
Can all Relational Alegbra queries be done in SQL?
我目前正在大学学习数据库课程。
我们被教导要在 SQL 中编写查询,您必须在一条语句中完成整个查询(即,以分号结尾的一长行)。也就是说,我们被教导没有办法通过
构造一个复杂的查询
- 创建一个带有查询的 table 和 "saving" table 某处(可能在某种变量中),
- 然后用不同的查询创建不同的 table 和 "saving" 它,
- 然后最后使用这两个 table(通过加入它们)。
但是,您可以轻松编写执行此操作的关系代数表达式。
我的一个作业问题涉及很多外连接,采用上述方法会更自然/更接近我对解决方案的看法。
这让我思考:所有的关系代数表达式都可以写成 SQL 吗?
TL;DR 是的,任何代数表达式都可以通过 subselects/subqueries 表示为单个 SQL 表达式。如果可用,也可以通过 CTE(常见的 table 表达式)。您可以通过添加视图或(可能是临时的)基使用多个 SQL 表达式来表达代数表达式。
您可以嵌套 SELECT 语句。您必须将它们放在括号中,并在 FROM 子句连接中给它们一个别名(通过隐式或显式 AS)。 (Jerry Jeremiah 也发表了评论。)
select * from mytable join (select x from yourtable) s
那 不是 "save" 嵌套的 select 值。 (又名派生 table(值)。)它为您将在条件中提及的 subselect/subquery table 中的任意行指定一个名称。
您可以使用 CTE 和 WITH。同样,这不是 "save" 一个 table 值。 (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;
我目前正在大学学习数据库课程。
我们被教导要在 SQL 中编写查询,您必须在一条语句中完成整个查询(即,以分号结尾的一长行)。也就是说,我们被教导没有办法通过
构造一个复杂的查询- 创建一个带有查询的 table 和 "saving" table 某处(可能在某种变量中),
- 然后用不同的查询创建不同的 table 和 "saving" 它,
- 然后最后使用这两个 table(通过加入它们)。
但是,您可以轻松编写执行此操作的关系代数表达式。
我的一个作业问题涉及很多外连接,采用上述方法会更自然/更接近我对解决方案的看法。
这让我思考:所有的关系代数表达式都可以写成 SQL 吗?
TL;DR 是的,任何代数表达式都可以通过 subselects/subqueries 表示为单个 SQL 表达式。如果可用,也可以通过 CTE(常见的 table 表达式)。您可以通过添加视图或(可能是临时的)基使用多个 SQL 表达式来表达代数表达式。
您可以嵌套 SELECT 语句。您必须将它们放在括号中,并在 FROM 子句连接中给它们一个别名(通过隐式或显式 AS)。 (Jerry Jeremiah 也发表了评论。)
select * from mytable join (select x from yourtable) s
那 不是 "save" 嵌套的 select 值。 (又名派生 table(值)。)它为您将在条件中提及的 subselect/subquery table 中的任意行指定一个名称。
您可以使用 CTE 和 WITH。同样,这不是 "save" 一个 table 值。 (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;