web-dev-qa-db-ja.com

MySQL:結合の種類の簡単な内訳

MySQLの結合の種類を簡単に説明したいと思います。私はこれらのことを知っていますが、それ以外の意味はわかりません。

  • コンマ区切り(これはexactlyの略ですか?):SELECT * FROM a, b WHERE b.id = a.beeId AND ...
  • bに一致するものがない場合でも、aからの情報を表示します:SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...

私は他の結合を見てきましたが、それらが何が違うのか、INNER/OUTERとは何か、LEFTを追加すると変化するものを知りたいです。

結合がどのように機能するかは既に知っています。他の種類の結合があるかどうか、または同じ結果を得るための異なる方法かどうかだけを知りたいです。

143
Bryan Field
435
Rufinus

コメントに基づいて、それぞれの簡単な定義は 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サイト をチェックアウトすることもできます。結合の詳細については、これも非常に優れています。

これがあなたのお役に立てば幸いです

26
Ryan

Mysqlには完全外部結合は存在しません。左結合と右結合の組み合わせを使用する必要がある場合があります。

11
IBEANS

このような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結合タイプの例

10
Andy Balaam