gpt4 book ai didi

sql - 如何用 SQL 表示关系除法(基本代数表达式)

转载 作者:行者123 更新时间:2023-12-01 14:32:45 27 4
gpt4 key购买 nike

Query:查找已预订所有船只的水手姓名

这可以用关系代数表示为:
1. π<sub>sname</sub> ( ((σ<sub>sid,bid</sub> Reserves) / (σ<sub>bid</sub> Boats)) ⋈ Sailors)

根据关系代数,除法也可以使用基本代数运算符表示如下:

  1. A/B= π<sub>x</sub>(A) - π<sub>x</sub>((π<sub>x</sub>(A) * B) - A )

因此,如果我 convert声明1根据声明 2然后

  1. Reserves/Boats= π<sub>sid</sub>(Reserves) - π<sub>sid</sub>(( π<sub>bid</sub>(Reserves) * Boats) - Reserves )

我如何表示Statement 3在 SQL 方面,与在关系代数中的方式相同(即不使用除 minus/Except(-) and Cross join(*) 以外的任何运算符)。
我试图在不使用 NOT EXISTS and EXISTS 的情况下实现它条件。

表格结构如下:
Sailors (sid: integer, sname: string, rating: integer, age: real)
Boats (bid: integer, bname: string, color: string)
Reserves (sid: 整数, bid: 整数, day: 日期)

最佳答案

给定与您的相关关系对应的表的此 DDL:

create table Boats(
bid int,
bname varchar(50),
color varchar(50)
);

create table Reserves(
sid int,
bid int,
day date
);

您可以相当直接地将除法公式 (3) 音译为 Oracle SQL 语法,尽管它很冗长:

-- All sailors who reserved at least one boat
SELECT DISTINCT sid
FROM Reserves

MINUS

-- All sailors who reserved at least one boat, but not all of them
SELECT sid
FROM (
-- all combinations of a sailor who reserved any boat with any boat
-- available to be reserved:
SELECT Reserves.sid, Boats.bid
FROM
Reserves
CROSS JOIN
Boats

MINUS

-- all combinations of sailor and boat for actual reservations made
SELECT sid, bid
FROM Reserves
) sids

如前所述,仅使用CROSS JOINMINUS操作,直接对应关系代数公式。然而,在现实世界的数据库应用程序中,肯定会通过完全不同的查询获得相同的结果。

另请注意,SQL 数据库可能而且确实违反了关系不包含重复元组的形式关系代数原则。这就是第一个子查询中使用 SELECT DISTINCT 的原因。在查询的其他地方有策略地应用不同的选择可能会提高效率,但不会改变结果。

关于sql - 如何用 SQL 表示关系除法(基本代数表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32868224/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com