用SQL语句表示关系代数中的除法,用NOT EXISTS实现
数据库中的除法
数据库中的除法一般用在,关系代数题中有表示所有,全部,至少等词。
关系代数除法示例
题目来源:中国矿业大学2020年计算机应用技术考研真题
数据库表为
团队(团队编号,团队名称,人员数量,所属单位,联系电话)
项目(项目编号,项目名称,等级)
参与(团队编号,项目编号,负责内容,开始时间,是否结题)
其中,“开始时间”为日期型,格式为 YYYY/MM/DD;“是否结题”为布尔型,true 表示已经结题,false 表示还未结题。
- 用关系代数表示至少参与过“蓝鸟”队参与的所有项目的团队名称和联系电话。
∏ ∏ ∏团队名称,联系电话,项目编号 ( 团 队 ∞ 参 与 ) ÷ (团队∞参与)÷ (团队∞参与)÷ ∏ ∏ ∏项目编号 ( σ (σ (σ团队名称=“蓝鸟” ( 团 队 ∞ 参 与 ) ) (团队∞参与)) (团队∞参与))
用SQL语句实现
- 将上述关系代数用SQL语句表示
//SQL
SELECT 团队名称,联系电话
FROM 团队 AS 团队1
WHERE NOT EXISTS
(SELECT *
FROM 团队,参与
WHERE 团队.团队编号=参与.团队编号
AND 团队名称='蓝鸟'
AND NOT EXIST
(SELECT *
FROM 参与 AS 参与1
WHERE 参与1.团队编号=团队1.团队编号
AND 参与1.项目编号=参与.项目编号));
如果你能通过分析直接写出上述代码,那么就无需看接下来转换
将关系代数转化为SQL语句
我们将NOT EXIST实现除法的SQL语句分为三部分,看每一部分是如何来的。
- 第一层:要查什么属性,并且这些属性来自于哪一个表,我们就将其写在第一层;团队名称,联系电话是我们想要的属性,它来自团队表,起别名是因为,第二层中也有团队,防止冲突。
- 第二层:关系代数除法,除数是什么就将其放在第二层,SELECT * 是固定格式;除数为 ∏ ∏ ∏项目编号 ( σ (σ (σ团队名称=“蓝鸟” ( 团 队 ∞ 参 与 ) ) (团队∞参与)) (团队∞参与)),写在第二层。
- 第三层:第三层“连接”第一层和第二层,哪种表用来“连接”就将其放在第三层,SELECT * 是固定格式;参与表是用来“连接”的表,这里的“连接”指的是通过那种属性进行除运算,该题通过项目编号进行除运算,而项目编号在被除数中来自参与表,所以通过参与表“连接”第一层和第二层,起别名是因为第二层中也有参与,防止冲突。
通过分析上面三层,我们就通过关系代数实现了SQL语句的除法。
后言
该方法是通过实践分析得到的方法不是理论推导得到的方法,博主自己建立数据库使用上述方法做查询,结果没有问题。