最近,我處理了從MySQL數據庫中檢索大量由數千條記錄組成的數據。由於這是我第一次處理這樣的大數據集,我沒有想到SQL語句的效率。問題就來了。NATURAL JOIN與WHERE IN子句
這裏是數據庫 的表(這僅僅是一個課程體系的簡單數據庫模型):
課程:
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| course_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| lecturer | varchar(20) | NO | | NULL | |
| credit | float | NO | | NULL | |
| week_from | tinyint(3) unsigned | NO | | NULL | |
| week_to | tinyint(3) unsigned | NO | | NULL | |
+-----------+---------------------+------+-----+---------+----------------+
選擇:
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| select_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| card_no | int(10) unsigned | NO | | NULL | |
| course_id | int(10) unsigned | NO | | NULL | |
| term | varchar(7) | NO | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
當我想要檢索學生選擇的所有課程(使用他的卡號), SQL語句爲
SELECT course_id, name, lecturer, credit, week_from, week_to
FROM `course` WHERE course_id IN (
SELECT course_id FROM `select` WHERE card_no=<student's card number>
);
但是,它非常緩慢,並且很長時間沒有返回任何東西。 因此,我將WHERE IN
條款更改爲NATURAL JOIN
。這裏是SQL,
SELECT course_id, name, lecturer, credit, week_from, week_to
FROM `select` NATURAL JOIN `course`
WHERE card_no=<student's card number>;
它立即返回並正常工作!
所以我的問題是:
- 什麼
NATURAL JOIN
和WHERE IN
從句有什麼區別? - 是什麼使他們的表現不同? (這可能是因爲我沒有設置任何
INDEX
?) - 我們什麼時候應該使用
NATURAL JOIN
或WHERE IN
?
'select'是一個表的名稱。 –