select r.index, sum(c.points)
from records r join exams e2 on r.index = e2.index
join courses c on c.id_course = e2.id_course
where not exists ( select *
from required_courses rs
where rs.id_studie = r.id_studie
and not exists (select *
from exams e
where e.id_course = rs.id_course
and r.index = e.index
and score>5))
and score>5
group by index;
我有那个查询。我知道它的作用,但不知道如何。
我有16个表格相对较大的数据库,但在此查询中只使用4个。
使用过的表格是:
(1)我不太懂英文。在某些教师身上有信息学,数学,物理等课程。信息学是一个研究。 (2)分数从5到10分.10是最好的。通过时至少需要6个。
查询: - 找到所有通过studie thay studie所有必修考试的学生。打印索引和点数。
我的问题:同一个人可以用简单的词语解释这是如何工作的?
我不明白不存在&不存在的部分。
抱歉我的英语不好。
答案 0 :(得分:2)
始终从内到外分析查询。
最内层查询: 选择分数高于5的考试
中间一个:
选择没有得分高于5的考试所需的课程
外面的一个:
选择没有必修课程且未获得分数高于5的考试的学生
答案 1 :(得分:1)
该示例是双嵌套NOT EXISTS
查询。
如果子查询返回任何行,EXISTS
子查询为TRUE
,NOT EXISTS
子查询为FALSE
。
也就是说,它在NOT EXISTS
子句中有一个NOT EXISTS
子句。
更容易说嵌套NOT EXISTS
回答问题“对于所有y来说,x是否为真?”
--Part 3
SELECT r.index,
SUM(c.points)
FROM records r
join exams e2
ON r.index = e2.index
join courses c
ON c.id_course = e2.id_course
WHERE NOT EXISTS (
--Part 2 starts
SELECT *
FROM required_courses rs
WHERE rs.id_studie = r.id_studie
AND NOT EXISTS (
--Part 1 starts
SELECT *
FROM exams e
WHERE e.id_course = rs.id_course
AND r.index = e.index
AND score > 5
--Part 1 ends
)
--Part 2 ends
)
AND score > 5
GROUP BY index;
--Part 3 ends
第1部分:从EXAMS表中获取得分超过5分的学生的所有记录。您应该获得所有课程的所有通过考试的学生
第2部分:在学生ID上以REQUIRED_COURSES
加入Part1结果,并获取学生尚未通过考试的所有必修课程(学生的分数不超过5分) )。你应该把所有学生的课程名称都用在不成功的地方
第3部分:使用索引上的RECORDS
表以及课程ID上的COURSES
表来加入第2部分结果,以获取索引和点总和。你可以把这部分分成两部分。首先是包含两个表的普通JOIN
,然后是包含第2部分的NOT EXISTS
。当您在第2部分上应用NOT EXISTS
时,您将获得所有成功的学生ID通过在结尾添加另一个SCORE > 5
条件来获得成功的条目。