【问题标题】:Relational algebra expression for queries [closed]查询的关系代数表达式
【发布时间】:2014-10-10 02:41:23
【问题描述】:

我只是关系代数的新手,可能是学习 SQL 查询之前的一个预备步骤。你能帮我用 BASIC OPERATORS 为以下每个查询制作关系代数表达式的表达式吗? 这些是包含在总线驱动程序数据库中的表。

•   driver( driver_id, driver_name, age, rating );
•   bus( bus_id, bus_name, color);
•   reserves( driver_id, bus_id, date);
  1. 查找 Mark 保留的总线颜色。
  2. 查找评分至少为 7 或已预订 112 路公交车的司机的所有 ID。
  3. 查找未预订黄色巴士的司机姓名。
  4. 查找未预订蓝色巴士的 35 岁以上司机的 ID。

使用基本运算符

如果有人可以在这里帮助我,我将不胜感激

【问题讨论】:

  • 人们会先要求你付出一些努力,否则他们可能会被你的问题冒犯

标签: sql algebra relational relational-algebra


【解决方案1】:

这是我的最终代码。我已经在网上搜索过,但关系代数是一个相当困难的学科,所以我只做了第一个问题。通过研究完成其余的工作。祝你好运!

我从 Wikipedia 获得了 (⋈) 符号。它被称为自然连接。
这里使用的其他符号是希腊字母 pi 和 delta。
pi 用于列名。如果它在 SELECT 子句之后,你知道它是否是列名(属性)。
增量用于条件。如果它在 WHERE 子句之后,你知道它是否是条件。
⋈ 用于表名。如果它在 FROM 和 JOIN 子句之后,你知道它是否是表名(关系)。

1)
SELECT b.COLOR
FROM RESERVES r
NATURAL JOIN BUS b
NATURAL JOIN DRIVER d
WHERE d.DRIVER_NAME='Mark';

Relation = ∏COLOR σDRIVER_NAME='Mark' (RESERVES ⋈ BUS ⋈ DRIVER)

2)
SELECT d.DRIVER_ID
FROM DRIVER d
LEFT JOIN RESERVES r
ON r.DRIVER_ID=d.DRIVER_ID
WHERE d.RATING>=7
OR r.BUS_ID=112;

3)
--Long Method
SELECT d.DRIVER_NAME
FROM DRIVER d
WHERE d.DRIVER_ID NOT IN (
    SELECT r.DRIVER_ID
    FROM BUS b
    JOIN RESERVES r
    ON r.BUS_ID=b.BUS_ID
    WHERE b.COLOR='yellow'
);

--Short Method, use this
SELECT d.DRIVER_NAME
FROM DRIVER d
WHERE NOT EXIST (
    SELECT r.DRIVER_ID
    FROM BUS b
    JOIN RESERVES r
    ON r.BUS_ID=b.BUS_ID
    WHERE b.COLOR='yellow'
    AND r.DRIVER_ID=d.DRIVER_ID
);

4)
--Long Method
SELECT d.DRIVER_ID
FROM DRIVER d
WHERE d.AGE>35
AND d.DRIVER_ID NOT IN (
    SELECT r.DRIVER_ID
    FROM BUS b
    JOIN RESERVES r
    ON r.BUS_ID=b.BUS_ID
    WHERE b.COLOR='blue'
);

--Short Method, use this
SELECT d.DRIVER_ID
FROM DRIVER d
WHERE d.AGE>35
AND NOT EXIST (
    SELECT r.DRIVER_ID
    FROM BUS b
    JOIN RESERVES r
    ON r.BUS_ID=b.BUS_ID
    WHERE b.COLOR='blue'
    AND r.DRIVER_ID=d.DRIVER_ID
);

【讨论】:

  • 这么快-但我认为您的最后两个查询不正确。如果司机预订了两辆公共汽车,一辆蓝色和一辆黄色,它们将显示在您的最后两个查询中。
  • 未见:“查找未预订黄色巴士的司机姓名。”但是,如果一位司机(例如“Bob”)预订了一辆蓝色巴士和一辆黄色巴士,即使他们预订了一辆黄色巴士,它们仍会在您的查询中返回。
  • @ChinaPlums 另一个答案似乎是正确的。使用它。
  • @marionjeff 您是否熟悉这些基本运算符并将其应用于您的答案。 Basic Operators in Relational Algebra
  • @marionjeff 你好,我可以将这些答案翻译成关系代数运算符,例如选择: 项目: 联合: 设置差异:- 笛卡尔积:x 重命名:
【解决方案2】:

有多种方法可以编写这些查询,但这里有一些选项。

(1) 需要跨三个表连接并按名称过滤:

select b.color
from bus b
join reserves r
on b.bus_id = r.bus_id join
join driver d
on d.driver_id = r.driver_id
where d.driver_name = 'Mark'

(或者可以在连接中包含 d.driver_name = 'Mark')

(2) 您需要在两个表之间进行左连接并按 bus_id 和 rating 进行过滤:

select d.driver_id
from driver d
left join reserves r
on d.driver_id = r.driver_id
where r.bus_id = 112
or d.rating >= 7

(或者可以合并两个查询)

(3) 需要获取不在join中的驱动:

select d.driver_name
from driver d
where not exists (
    select 1 from reserves r
    join bus b
    on r.bus_id = b.bus_id
    where b.color = 'yellow'
    and r.driver_id = d.driver_id )

(4)和上一个类似:

select d.driver_id
from driver d
where d.age > 35
and not exists (
    select 1 from reserves r
    join bus b
    on r.bus_id = b.bus_id
    where b.color = 'blue'
    and r.driver_id = d.driver_id )

【讨论】:

  • 感谢您的回答。了解我仍在学习它,因此获得答案的目的是我获得正确想法的基准。此外,我需要使用符号翻译您给出的关系代数表达式的答案。
  • 你好,我可以将这些答案翻译成关系代数运算符,例如选择: 项目: 联合: 设置差异:- 笛卡尔积:x 重命名:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多