sqlの中でleft jonの複数の条件は特殊な注意を必要とします。
2569 ワード
定義:
LEFT JOINキーワードは左のテーブルからすべての行を返します。右のテーブルにマッチする行がありません。例えば以下のようなクエリーがあります。
基礎クエリデータテーブル
ユーザテーブル:
クエリ文2:
LEFT JOINキーワードは左のテーブルからすべての行を返します。右のテーブルにマッチする行がありません。例えば以下のようなクエリーがあります。
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
このクエリのonの条件は一つしかないので、特に注意点がありません。しかし、私たちのonの条件が複数存在すると、私たちの予想に反するクエリ結果がいくつか出てきます。具体例をあげて説明します。基礎クエリデータテーブル
ユーザテーブル:
mysql> select * from tab_user;
+---------+------+--------+----------+
| name | age | sex | addr |
+---------+------+--------+----------+
| daxin | 18 | male | beijing |
| mali | 28 | female | shandong |
| wangsan | 34 | male | beijing |
| lisi | 45 | male | liaoning |
| liwu | 58 | female | beijing |
| maoliu | 43 | male | anhui |
| zhouba | 62 | female | beijing |
+---------+------+--------+----------+
7 rows in set (0.00 sec)
注文書:mysql> select * from tab_order;
+-------+-----------+
| name | gname |
+-------+-----------+
| daxin | Smartisan |
| mali | iPhone |
| liwu | Mac |
| lisi | xiaomi |
| maliu | nike |
+-------+-----------+
5 rows in set (0.00 sec)
クエリ文1:mysql> select * from tab_user u left join tab_order o on u.name=o.name and u.name='lisi';
+---------+------+--------+----------+------+--------+
| name | age | sex | addr | name | gname |
+---------+------+--------+----------+------+--------+
| daxin | 18 | male | beijing | NULL | NULL |
| mali | 28 | female | shandong | NULL | NULL |
| wangsan | 34 | male | beijing | NULL | NULL |
| lisi | 45 | male | liaoning | lisi | xiaomi |
| liwu | 58 | female | beijing | NULL | NULL |
| maoliu | 43 | male | anhui | NULL | NULL |
| zhouba | 62 | female | beijing | NULL | NULL |
+---------+------+--------+----------+------+--------+
7 rows in set (0.00 sec)
どのように見ますととてもモンゴルの輪ではありませんか?どうしてすでにu.name='lisi'を制限しましたが、調査結果はまだlisiがありますか?もしwhere制約を使うなら、クエリ文2.クエリ文2:
mysql> select * from tab_user u left join tab_order o on u.name=o.name where u.name='lisi';
+------+------+------+----------+------+--------+
| name | age | sex | addr | name | gname |
+------+------+------+----------+------+--------+
| lisi | 45 | male | liaoning | lisi | xiaomi |
+------+------+------+----------+------+--------+
1 row in set (0.00 sec)
今回は確かにリシしかいません。なぜ語句1を調べたら予想に合わないですか?left joinの定義を振り返ってみると、左の表はすべての行に戻りますので、left joinは左の表を制約すると効果がありません。ただし、left joinの右の表に条件を加えると効果的です。逆に、right joinは同じです!