关系代数复习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!哈哈哈!