Sql 查询的关系代数表达式
我刚刚接触关系代数,可能是学习SQL查询之前的一步。您能帮助我使用基本运算符为以下每个查询生成关系代数表达式的表达式吗。 这些表包含在总线驱动程序数据库中Sql 查询的关系代数表达式,sql,algebra,relational,relational-algebra,Sql,Algebra,Relational,Relational Algebra,我刚刚接触关系代数,可能是学习SQL查询之前的一步。您能帮助我使用基本运算符为以下每个查询生成关系代数表达式的表达式吗。 这些表包含在总线驱动程序数据库中 • driver( driver_id, driver_name, age, rating ); • bus( bus_id, bus_name, color); • reserves( driver_id, bus_id, date); 查找由Mark保留的总线颜色 查找评级至少为7或保留总线112的所有驾驶员ID 查找未预订
• driver( driver_id, driver_name, age, rating );
• bus( bus_id, bus_name, color);
• reserves( driver_id, bus_id, date);
如果有人能在这里帮助我,我将不胜感激这是我的最终代码。我在网上搜索过,但是关系代数是一门很难的学科,所以我只做了第一道题。通过研究来完成剩下的工作。祝你好运
我拿到了(⋈) 来自维基百科的符号。它被称为自然连接。
这里使用的其他符号是希腊字母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
);
有多种方法可以编写这些查询,但这里有一些选项 (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) 您需要跨两个表进行左连接,并按总线id和额定值进行筛选:
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) 您需要获取不在联接中的驱动程序:
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 )
人们会首先要求你努力,否则他们可能会因为你的问题太快而感到不快——但我认为你的最后两个问题是不正确的。如果司机预订了两辆公交车,一辆蓝色的和一辆黄色的,他们会出现在你的最后两个问题中。No see:“查找没有预订黄色公交车的司机的姓名。”但是,如果一个司机“Bob”预订了一辆蓝色巴士和一辆黄色巴士,即使他们预订了一辆黄色巴士,他们仍然会在您的查询中返回。@ChinaPlums另一个答案似乎是对的。使用它。@marionjeff您熟悉这些基本运算符并将其应用到您的答案中吗。@marionjeff您好,我可以翻译这些吗对关系代数运算符(如select)的解答: 项目: 工会: 设置差异:–笛卡尔积:x重命名:感谢您的回答。请理解我仍在学习,因此获得答案的目的是我获得正确想法的基础。此外,我需要使用符号将您给出的答案翻译为关系代数表达式。您好,我可以将这些答案翻译为关系代数运算符,如select: 项目: 工会: 设置差异:–笛卡尔积:x重命名: