数据库关系代数练习

现在有关系模式如下所示:

1
2
3
4
Department(dNo,dName,officeRoom,homePage)
Student(sNo,sName,sex,age,dNo)
Course(cNo,cName,cPNo,credit,dNo)
SC(sNo,cNo,score,recorddate)

一、基本查询

  1. 查询所有年龄小于18岁的男生姓名
    \[\pi_{sname}(\sigma_{age<18\bigwedge sex='man'}(student))\]
  2. 查询所有学分大于3的课程名称
    \[\pi_{cname}(\sigma_{credit>3}(course))\]
  3. 查询所有没有先修课的课程名称
    \[\pi_{cname}(\sigma_{cPNo\ is\ null}(course))\]

二、连接查询

  1. 查询“信息学院”所有学生姓名
    \[\pi_{sname}((\sigma_{dname='\text{信息学院}'}(department))\Join student)\]
  2. 查询所有具有不及格记录的学生姓名
    \[\pi_{sname}((\sigma_{score<60}(SC))\Join student)\]
  3. 查询“信息学院”所有年龄小于18岁的女生姓名
    \[\pi_{sname}((\sigma_{age<18\bigwedge sex='female'}(student))\Join (\sigma_{dname='\text{信息学院}'}(department)))\]
  4. 查询所有选修了“数据库”课程的学生姓名
    \[\pi_{sname}(\pi_{cno}(\pi_{cname='\text{数据库}'}(course))\Join SC \Join student)\]
  5. 查询“信息学院”所有选修了“科学技术简史”课程的学生姓名
    \[\pi_{sname}(\pi_{sno}(\sigma_{cname='\text{科学技术简史}'}(course))\Join SC\Join student \Join(\pi_{cname='\text{信息学院}'}(department)))\]
  6. 查询选修了“数据结构”课程并且不及格的学生姓名
    \[\pi_{sname}(\pi_{cno}(\sigma_{cname='\text{数据结构}'}(course))\Join (\sigma_{credit<60}(SC))\Join student)\]
  7. 查询“计算机学院”选修了“概率论”课程且成绩大于等于80分的学生姓名
    \[\pi_{sname}((\sigma_{dname='\text{计算机学院}'}\Join \pi_{cno}(\sigma_{cname='\text{概率论}'}(course))\Join (\sigma_{score\geq 80}(SC))\Join student)\]
  8. 查询“文学院”开设的所有学分大于等于3的课程名称
    \[\pi_{cname}((\sigma_{dname='\text{文学院}'}(department))\Join \sigma_{credit \geq 3}(course)))\]
  9. 查询“信息学院”所有选修了“数据库”课程并且不及格的学生姓名及分数
    \[\pi_{sname,score}((\sigma_{dname='\text{信息学院}'}(department))\Join (\pi_{cno}(\sigma_{cname='\text{数据库}'}(course)))\Join (\sigma_{score<60}(SC))\Join student)\]
  10. 查询“王强”同学所选修的全部课程名称、学分以及开课学院。
    \[\pi_{cname,credit,dname}(\pi_{cno}(\sigma_{sname='\text{王强}'}(student)\Join SC)\Join course \Join department)\]

三、综合查询

  1. 查询选修了“数据库”或者选修了“算法”课程的学生姓名
    \[\pi_{sname}(\sigma_{cname='\text{数据库}'\bigvee cname='\text{算法}'}(course))\Join SC \Join student)\]
  2. 查询选修了“数据库”并且选修了“算法”课程的学生姓名
    \[\pi_{sname((\pi_{sno,cno}(SC)\div(\sigma_{cname='\text{数据库}'}\bigwedge cname='\text{算法}'}(course))\Join student)\]
  3. 查询选修了“数据库”但没有选修“算法”课程的学生姓名
    \[\pi_{sname}((\pi_{sno}(\sigma_{cname='\text{数据库}'}(course))\Join SC)-(\pi_{sno}(\sigma_{cname='\text{算法}'}(course))\Join SC))\Join student)\]
  4. 查询没有选修“算法”课程的学生姓名
    \[\pi_{sname}(student)-\pi_{sname}(\sigma_{cname='\text{算法}'}(course)\Join SC \Join student)\]
  5. 查询仅仅选修了“算法”一门课程的学生姓名
    \[\pi_{sname}((\pi_{sno}(SC)-\pi_{sno}(\pi_{cname<>'\text{算法}'}(course)\Join SC))\Join student)\]
  6. 查询选修了“信息学院”开设的所有课程的学生姓名
    \[\pi_{cno,sname}(SC\Join student)\div\pi_{cno}((\sigma_{dname='\text{信息学院}'}(department))\Join course)\]
  7. 查询选修了所有学分大于3课程的学生姓名
    \[\pi_{sname}(\pi_{cno,sno}(SC)\div\pi_{cno}(\sigma_{credit>3}(course))\Join student)\]
  8. 查询“数据库”课程所有不及格学生姓名及所在学院
    \[\pi_{sname,dname}((\pi_{sno}(\sigma_{cname='\text{数据库}'}(course)\Join \sigma_{score<60}(SC))\Join student\Join department))\]
  9. 查询“数据库”先修课的课程名称
    \[\pi_{cname}(\pi_{cpno}(\sigma{cname='\text{数据库}'}(course \ \ AS\ \ C1)){\mathop \Join\limits_{C1.cpno=C2.cno}}(course\ \ AS\ \ C2))\]
  10. 查询先修课为“数据库”的课程名称
    \[\pi_{cname}(\pi_{cpno}(\sigma{cname='\text{数据库}'}(course \ \ AS\ \ C1)){\mathop \Join\limits_{C1.cno=C2.cpno}}(course\ \ AS\ \ C2))\]