关系代数复习ing

名单就是姓名。

学生名单就是学生姓名。

还是先在熟悉的   学生-学习-课程表进行查询讨论训练,2333!

学生(学号,姓名,性别,年龄,籍贯,出生年月,学院)

课程(课程号,课程名,学时,开课学期,先行课,学分,课程性质)

学习(学号,课程号,成绩)

1.查询至少选修课程名为'数据库原理''操作系统'课程的学生姓名。

很明显,这是一个集合包含性问题,可以用除法哦2333

当然扩展一下啦:交运算是可以表达部分"除法"运算实现的功能滴

当然,也可以用自连接,但是有些连接要多的一些,后续再写2333。

2.查询被所有同学选修的课程的课程号?查询选修所有课程的学生的学号?

进违啦,继续的除法运算!

3.找出计算机学院1980年以后出生的女同学的名单。

分析:找出计算机学院(学院)1980年以后出生(出生年月)女(性别)同学名单(姓名)

4.求选修1号课程的学生姓名和所在学院。

分析:求选修1号课程(学习表-,)的学生姓名和所在学院(学生表-)。将两表做自然连接投影相应的属性之。

5.求选修数据库原理的学生姓名。

分析:需要三个表做自然连接哦2333.

6.查询同时选修数据库原理以及操作系统的学生名单?

查询至少选修了数据库原理和操作系统的学生名单?

查询至少同时选修了数据库原理以及操作系统的学生名单?

求至少选修了数据库原理和操作系统的学生名单?

分析:继续:除法运算。

名单就是姓名。

7.查询没有被任何人选修的课程名?

分析:差运算

8.查询没有选修任何课程的学生学号和姓名?

分析:仍然的差运算

汉语中的"没有","是...但不包含"通常意义上是差运算的要求

9.查询至少选修1号同学选修的所有课程的学生姓名?

分析:查询至少选修1号同学选修的所有课程的学生的姓名。所有二字,一语揭示了全部所有包含性的问题这是,该用除法哦!

像另一个值得注意的查询语句"查询选修1号同学选修的课程的学生姓名。"这里面的意思和本题的查询意思就截然不同了嘤嘤。

全体性问题

10.查询选修1号同学选修的课程的学生姓名?

查询选修1号同学选修的一门或多门课程的学生姓名?

分析:这里要用自连接。

可能是选择了其中一门,这里是只要有只要存在就行了!

学习(学号,课程号,成绩)

学习*学习=(1,2,3,4,5,6)=(学号,课程号,成绩,学号,课程号,成绩)

存在性问题2333

11.查询至少选修了课程号为1和课程号为2的学生的学号?

分析:自连接可,除法也可。

忍不住写了一些代码,嘻嘻:

use try;

/*查询至少选修了1号同学选修的所有课程的学生姓名*/
select sname
from student
where not exists
(select * from sc as a where sno='1' and not exists
(select * from sc as b where sno=student.sno and cno=a.cno));


/*查询选修1号同学选修的课程的学生姓名*/
select sname
from student 
where sno in
(select a.sno
from sc as a,sc as b
where b.sno='1' and a.cno=b.cno);

  12.求至少选修了两门课程的学生学号。

分析:解决这个问题:

关系代数-------->自连接

SQL语言--------->集函数(统计函数count)尤其为佳,嘿嘿

/*求至少选修了两门课程的学生学号*/
select sno
from student
where sno in
(select sno
from sc
group by sno
having count(*)>=2);

  13.一些其他的参考嘤嘤:

 

来自一位17级学长的简书blog。

14.接下来了解一下关系代数表达式的优化算法---语法树

语法树是二叉树,千万不要整出三叉树这样的幺蛾子事件哦2333!哈哈哈!

 

原文地址:https://www.cnblogs.com/dragondragon/p/12510560.html