最近,我处理了从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'是一个表的名称。 –