900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 查询至少选了1班2号同学所选课的所有同学班号 学号

查询至少选了1班2号同学所选课的所有同学班号 学号

时间:2023-08-02 13:50:28

相关推荐

查询至少选了1班2号同学所选课的所有同学班号 学号

目录

查询至少选了1班2号同学所选课的所有同学班号、学号1.元组演算关系图形表示关系演算2.元组演算转换成没有∀\forall∀符号的语句3.sql语句

查询至少选了1班2号同学所选课的所有同学班号、学号

这类问题应该是本学期数据库查询里比较难的题了,涉及到了exists的使用,但是搞清楚原理还是很简单的。

假设有学生选课表sc(sclass,sno,cno),其他属性忽略不计

1.元组演算

关系图形表示

以下的四张表均为sc表,他们的关联关系如下

u同学是我们要找的同学,v是u同学选修课程,w是1班2号同学所选的课程

关系演算

∃u(sc(u)∧∀w((sc(w)∧w[1]=1∧w[2]=2)→∃v(w[3]=v[3]∧u[1]=v[1]∧u[2]=v[2])))\exists u(sc(u)\land\forall w((sc(w)\land w[1]=1\land w[2]=2)\rightarrow\exist v(w[3]=v[3]\land u[1]=v[1]\land u[2]=v[2])))∃u(sc(u)∧∀w((sc(w)∧w[1]=1∧w[2]=2)→∃v(w[3]=v[3]∧u[1]=v[1]∧u[2]=v[2])))

2.元组演算转换成没有∀\forall∀符号的语句

转换之前需要把元组演算中的所有∀\forall∀语句全部转换成∃\exist∃语句,这里涉及到数理逻辑的知识

注意,3)4)中的∀∃\forall\exists∀∃互转后里面的P也要取反

转换后的结果如下

∃u(sc(u)∧¬∃w((sc(w)∧w[1]=1∧w[2]=2)∧¬∃v(w[3]=v[3]∧u[1]=v[1]∧u[2]=v[2])))\exists u(sc(u)\land\lnot\exist w((sc(w)\land w[1]=1\land w[2]=2)\land\lnot\exist v(w[3]=v[3]\land u[1]=v[1]\land u[2]=v[2])))∃u(sc(u)∧¬∃w((sc(w)∧w[1]=1∧w[2]=2)∧¬∃v(w[3]=v[3]∧u[1]=v[1]∧u[2]=v[2])))

3.sql语句

select * from sc uwhere not exists(select * from sc wwhere sc.sno=2 and sc.sclass=1and not exists(select * from sc vwhere o=o and u.sno=v.sno and u.sclass=v.sclass))

基本上和2中的每个符号按顺序对应,应该也比较容易理解

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。