3

我想知道我是否可以获得一些关于我所做的关系代数的反馈以及任何关于改进它的建议,如果您发现我的 SQL 有任何问题,您能否指出它。

SELECT CourseName
FROM Course
WHERE CourseNo = 6;

∏CourseName(σCourseNo=6(Course))

SELECT CU.UnitNo
FROM C.Course, CU CourseUnit
WHERE C.CourseName = CU.CourseNo
AND C.CourseName = 'Research';

∏UnitNo(CourseUnit(σC​​ourseName='研究'(Course)))

SELECT U.UnitName
FROM S Student, SU StudentUnit, U Unit
WHERE S.StudentNo = SU.StudentNo
AND SU.UnitNo = U.UnitNo
AND S.StudentName = 'John Perry';

∏UnitName(Unit(StudentUnit(σStudentName='John Perry'(Student))))

SELECT count(S.StudentNo) ResearchStudents
FROM C Course, S Student
WHERE C.CourseNo = S.CourseNo
AND C.CourseName = 'Research';

∏ResearchStudents((C)count(StudentNo)(学生(σCourseName='Research'(Course))))

4

3 回答 3

3

from 子句有问题,我删除了 C.Course 之间的一个点

SELECT CU.UnitNo
FROM C Course, CU CourseUnit
WHERE C.CourseName = CU.CourseNo
AND C.CourseName = 'Research';
于 2010-01-24T23:18:12.750 回答
1

在 Pentium10 的评论之上,您可以考虑使用JOIN子句而不是在WHERE子句中指定连接。在我看来,它可以导致更容易理解的查询。所以

SELECT CU.UnitNo
FROM C Course, CU CourseUnit
WHERE C.CourseName = CU.CourseNo
AND C.CourseName = 'Research';

变成

SELECT CU.UnitNo
FROM C Course 
INNER JOIN CU CourseUnit
  ON C.CourseName = CU.CourseNo
WHERE C.CourseName = 'Research';

(旁注:表已被赋予别名但未使用别名 - 如果我的记忆正确,SQL Server 会抱怨这一点并且不执行查询。不确定其他 RDBMS)

于 2010-01-24T23:32:21.350 回答
0

如果要使用您的语法,我想必须交换特殊字符。(还记得 APL 键盘吗?)

在您的上一个示例中,Course 和 C 之间的距离令人不安。

此外,您在第三个示例中的加入也不完整。

我认为 Query By Example 或 Linq 是更有趣的选择。

于 2010-01-24T23:35:16.643 回答