关系代数中除法的SQL实现
文章目录
引言
关系代数中的运算主要有选择、投影、连接(或者说乘法,即笛卡尔积)、除法,以及集合运算。其中,选择、投影、连接能直接用SQL表达,但除法和大部分集合运算不能。尤其是除法的缺失,使得涉及该操作的查询难以编写。本文将介绍用如何现有SQL实现除法,并分析困难产生的原因。
除法
笛卡尔积的逆
关系除法可以看作笛卡尔积的逆,即对于R÷SR\div SR÷S,其结果为所有满足T×S⊆RT\times S\subseteq RT×S⊆R的TTT中最大的那个,有
T=π(R)−π((π(R)×S)−R)T=\pi(R)-\pi((\pi(R)\times S)-R)T=π(R)−π((π(R)×S)−R)
可以将该结论表达为SQL以实现除法吗?在不支持MINUS, EXCEPT的数据库中不能。由于R至少有两列,用NOT EXISTS实现MINUS并不简单。
SQL实现
应用场景举例
假设如下关系,
人与技能
person
skill
张大仙
LOL
殷子
笑
卫小妹
CV
成少
LOL
孙文涛
Java
张大仙
打剑
张大仙
机器学习
成少
机器学习
卫小妹
笑
需求的技能
skill
LOL
机器学习
要求:找出P