開発でよく犯すエラー→【joinテーブル接続関連クエリー】

1312 ワード

最近SQLを審査する時、いくつかの開発はいつもこの間違いを犯すことを発見して、以下は簡単な例を挙げて、A表とB表idの同じ記録を探し出して(しかもB表のないid記録も探し出して)、しかもnameの名前は'b'の記録に等しいことを説明します.表のデータ:
mysql> select * from t1;           
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
|  5 | e    |
|  6 | b    |
+----+------+
6 rows in set (0.00 sec)
mysql> select * from t2;           
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | cc   |
|  4 | e    |
|  5 | b    |
+----+------+
5 rows in set (0.00 sec)

間違った書き方:
mysql> select * from t1 left join t2 on t1.id=t2.id and t1.name='b';
+----+------+------+------+
| id | name | id   | name |
+----+------+------+------+
|  2 | b    |    2 | b    |
|  1 | a    | NULL | NULL |
|  3 | c    | NULL | NULL |
|  4 | d    | NULL | NULL |
|  5 | e    | NULL | NULL |
|  6 | b    | NULL | NULL |
+----+------+------+------+
6 rows in set (0.00 sec)

正しい書き方:
mysql> select * from t1 left join t2 on t1.id=t2.id where t1.name='b';
+----+------+------+------+
| id | name | id   | name |
+----+------+------+------+
|  2 | b    |    2 | b    |
|  6 | b    | NULL | NULL |
+----+------+------+------+
2 rows in set (0.00 sec)

ほほほ、面接問題になることができます.