MySQLの結合の種類を簡単に説明したいと思います。私はこれらのことを知っていますが、それ以外の意味はわかりません。
SELECT * FROM a, b WHERE b.id = a.beeId AND ...
SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...
私は他の結合を見てきましたが、それらが何が違うのか、INNER
/OUTER
とは何か、LEFT
を追加すると変化するものを知りたいです。
結合がどのように機能するかは既に知っています。他の種類の結合があるかどうか、または同じ結果を得るための異なる方法かどうかだけを知りたいです。
コメントに基づいて、それぞれの簡単な定義は W3Schools で見つけるのが最適です。各タイプの最初の行は、結合タイプの簡単な説明を提供します
- JOIN:両方のテーブルに少なくとも1つの一致がある場合に行を返します
- LEFT JOIN:右のテーブルに一致がない場合でも、左のテーブルからすべての行を返します
- RIGHT JOIN:左のテーブルに一致がない場合でも、右のテーブルのすべての行を返します
- FULL JOIN:いずれかのテーブルに一致がある場合に行を返します
END EDIT
一言で言えば、あなたが与えたカンマ区切りの例
SELECT * FROM a, b WHERE b.id = a.beeId AND ...
テーブルを区切るコンマでテーブルaとbからすべてのレコードを選択しています。これは次のような列でも使用できます
SELECT a.beeName,b.* FROM a, b WHERE b.id = a.beeId AND ...
次に、例でb.id列とa.beeId列が一致する行で指示された情報を取得しています。したがって、この例では、b.idがa.beeIdに等しいテーブルaおよびbからすべての情報を取得します。この例では、b.idがa.beeIdと等しい場合、bテーブルからすべての情報を取得し、a.beeName列からのみ情報を取得します。 AND句もあることに注意してください。これは結果を絞り込むのに役立ちます。
MySQL結合と左結合に関するいくつかの簡単なチュートリアルと説明については、TizagのmySQLチュートリアルをご覧ください。 Keith J. BrownのWebサイト をチェックアウトすることもできます。結合の詳細については、これも非常に優れています。
これがあなたのお役に立てば幸いです
Mysqlには完全外部結合は存在しません。左結合と右結合の組み合わせを使用する必要がある場合があります。
このような2つのテーブルがあります。
> SELECT * FROM table_a;
+------+------+
| id | name |
+------+------+
| 1 | row1 |
| 2 | row2 |
+------+------+
> SELECT * FROM table_b;
+------+------+------+
| id | name | aid |
+------+------+------+
| 3 | row3 | 1 |
| 4 | row4 | 1 |
| 5 | row5 | NULL |
+------+------+------+
INNER JOINは両方のテーブルを考慮します
INNER JOINは両方のテーブルを処理するため、両方のテーブルに1つのテーブルがある場合にのみ行を取得します。一致するペアが複数ある場合、複数の行を取得します。
> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
+------+------+------+------+------+
順序を逆にしても、INNER JOINには何の違いもありません。なぜなら、両方のテーブルを気にするからです。
> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
+------+------+------+------+------+
同じ行を取得しますが、表の順序が異なるため、列の順序は異なります。
LEFT JOINは最初のテーブルのみを考慮します
LEFT JOINは最初に与えたテーブルを気にし、2番目のテーブルはあまり気にしないので、2番目に対応する行がない場合でも、常に最初のテーブルから行を取得します。
> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| 2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+
上記の例では、table_aのすべての行は表示されませんが、tablebのすべての行とは一致しません。table_bのすべての行とは一致しません。
テーブルの順序を逆にすると、LEFT JOINの動作は異なります。
> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| 5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+
Table_bのすべての行を取得しますが、table_aの一致する行のみを取得します。
RIGHT JOINは2番目のテーブルのみを考慮します
a RIGHT JOIN b
は、b LEFT JOIN a
とまったく同じ行を取得します。唯一の違いは、列のデフォルトの順序です。
> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| NULL | NULL | 5 | row5 | NULL |
+------+------+------+------+------+
これは、LEFT JOINセクションで見たtable_b LEFT JOIN table_a
と同じ行です。
同様に:
> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| NULL | NULL | NULL | 2 | row2 |
+------+------+------+------+------+
table_a LEFT JOIN table_b
と同じ行です。
まったく結合しないと、すべてのコピーが得られます
JOIN句をまったく使用せずに、コンマで区切ってテーブルを記述する場合、最初のテーブルのすべての行が、2番目のテーブルのすべての行の隣に、あらゆる組み合わせで書き込まれます。
> SELECT * FROM table_b b, table_a;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 3 | row3 | 1 | 2 | row2 |
| 4 | row4 | 1 | 1 | row1 |
| 4 | row4 | 1 | 2 | row2 |
| 5 | row5 | NULL | 1 | row1 |
| 5 | row5 | NULL | 2 | row2 |
+------+------+------+------+------+
(これは私のブログ投稿からです SQL結合タイプの例 )