2009-04-19 100 views
2

注意:这些不是家庭作业问题。我正在学习dbms,因此这些作业类似的问题。高效SQL查询

两个表:

Teachers (teacher_id, teacher_name) 
Courses (teacher_id,course_id, course_name) 

为了选择谁不教任何课程的老师的名字,有 两个查询我能想到的:

mysql> explain select teacher_name from teachers left join courses on (teachers. 
teacher_id = courses.teacher_id) where course_id is null; 

mysql> explain select teacher_name from teachers where teacher_id not in (select 
teacher_id from courses); 

哪一个会更有效?为什么?

+0

您需要将TeacherID添加到课程表中。 – 2009-04-19 04:19:23

回答

-2

我会推荐第三个选项 - 那就是为你的第二个选项添加一个独特的子句,并给出一个去。

我会投票选择第二个选项,因为它更高效(尤其是在添加了distinct子句时)。你有希望在两个表中添加一个关于teacher_id的索引。

编辑:
我刚刚注意到这是一个技巧性的问题 - 课程中没有teacher_id字段。

如果不止一位教师可以教课程 - 添加一个表Teacher_Course(我总是避免在对象名称中的复数 - 只是一个练习)。在这个新表中存储TeacherCourseId(系统生成的ID),course_id和teacher_id,并且您可以允许每个班级有多个教师。

0

我认为,子查询(在你的情况下,第二个选项),因为它们限制行的量能跑得更快恢复,也列的金额退还。左外连接的第一个选项可能会更慢,并且会占用更多的内存。但是,它可以取决于其他几个因素,如返回的行数,列上的索引等。

0

哪一个会更高效?

一如既往:它取决于表中的内容以及索引的内容。

通常默认情况下,连接优于子查询。它会查看每位教师,然后直接进入课程表以查找与teacher_id匹配的内容。希望你会在'Courses.teacher_id'上创建一个索引,这将是一个非常简单的查找。

但是,如果你不这样做,子查询可能会更快。如果您有很多课程由相对较少的老师教授,那么将执行一次表扫描以生成一个小临时表,然后可以更快地检查教师表中的每一行。

但在这种情况下,最好只是添加索引。