将查询转换为嵌套查询

时间:2016-11-22 09:01:32

标签: mysql database database-design

如何将连接查询转换为嵌套查询(使用"其中"条件)? 例如,如何将其转换为嵌套查询?

SELECT student.studentname,
       schedule.subcode,
       AVG(attendance.ispresent)*100 AS Attendance_Status 
FROM student
JOIN attendance
    ON student.usn = attendance.usn
JOIN schedule
    ON schedule.sched_id = attendance.sched_id
WHERE student.usn="4jc14is008"
GROUP BY schedule.subcode
ORDER BY schedule.subcode;

1 个答案:

答案 0 :(得分:0)

这将被评估为NLJ("嵌套循环加入")。

  1. 查看usn = '...',过滤attendance
  2. 对于每个这样的行(在这种情况下可能是一行),将NLJ写入ON以找到满足给定schedule的任何和所有行。这会导致更长(或更短)的行列表。
  3. 对于#2中的每一行,根据ON将NLJ转换为GROUP BY。现在有一组行......
  4. 执行ORDER BYGROUP BY(这些可以同时完成,因为它们完全相同)。这将不会提供比#3更多的行。 (WHERE x IN ( SELECT ... )永远不会增加行数。)
  5. 将查询重新连接到{{1}},这通常会使其运行速度变慢。