最近、私は、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 | |
+-----------+------------------+------+-----+---------+----------------+
Iを学生が(カード番号で)選択したすべてのコースを検索したい場合、 の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'はテーブルのawfull名です。 –