2009-04-19 207 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'上創建一個索引,這將是一個非常簡單的查找。

但是,如果你不這樣做,子查詢可能會更快。如果您有很多課程由相對較少的老師教授,那麼將執行一次表掃描以生成一個小臨時表,然後可以更快地檢查教師表中的每一行。

但在這種情況下,最好只是添加索引。