web-dev-qa-db-ja.com

左結合またはコンマ(、)を使用して複数のテーブルから選択

カンマを使用して複数のテーブルを選択できるので、なぜLEFT JOINを使用する必要があるのか​​知りたいです。

LEFT JOINとコンマを使用して複数のテーブルを選択する場合の違いは何ですか。

どちらが速いですか?

これが私のコードです:

   SELECT mw.*, 
          nvs.* 
     FROM mst_words mw 
LEFT JOIN (SELECT no as nonvs, 
                  owner, 
                  owner_no, 
                  vocab_no, 
                  correct 
             FROM vocab_stats 
            WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no 
    WHERE (nvs.correct > 0 ) 
      AND mw.level = 1

...そして:

SELECT * 
  FROM vocab_stats vs, 
       mst_words mw 
 WHERE mw.no = vs.vocab_no 
   AND vs.correct > 0 
   AND mw.level = 1 
   AND vs.owner = 1111
14
bbnn

まず第一に、完全に同等であるためには、最初のクエリが書かれている必要があります

   SELECT mw.*, 
          nvs.* 
     FROM mst_words mw 
LEFT JOIN (SELECT *
             FROM vocab_stats 
            WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no 
    WHERE (nvs.correct > 0 ) 
      AND mw.level = 1

そのため、mw。*とnvs。*は一緒に、2番目のクエリの単数形*と同じセットを生成します。作成したクエリには、nvs.correctのフィルターが含まれているため、INNER JOINを使用できます。

一般的な形

TABLEA LEFT JOIN TABLEB ON <CONDITION>

attempts条件に基づいてTableBレコードを検索します。が失敗した場合、TABLEAの結果が保持され、TableBのすべての列がNULLに設定されます。対照的に

TABLEA INNER JOIN TABLEB ON <CONDITION>

また、attemptsで、条件に基づいてTableBレコードを検索します。 ただし、失敗すると、TableAの特定のレコードが出力結果セットから削除されます。

CROSS JOINのANSI規格は、2つのテーブル間に デカルト積 を生成します。

TABLEA CROSS JOIN TABLEB
  -- # or in older syntax, simply using commas
TABLEA, TABLEB

構文の目的は、TABLEAの各行がTABLEBの各行に結合されることです。したがって、Aの4行とBの3行は、12行の出力を生成します。 WHERE句の条件と組み合わせると、同じことを表現するため、INNER JOINの動作が同じになる場合があります(AとBの間の条件=>保持するかどうか)。ただし、コンマの代わりにINNER JOINを使用する場合の意図について読むと、より明確になります。

パフォーマンスの面では、ほとんどのDBMSはLEFT結合をINNER JOINよりも速く処理します。コンマ表記は、データベースシステムが意図を誤って解釈し、不正なクエリプランを生成する原因となる可能性があるため、SQL92表記のもう1つの利点です。

なぜLEFT JOINが必要なのですか?上記のLEFT JOINの説明だけでは不十分な場合(AのレコードをBの一致なしで保持)、それを考慮してください同じ結果を得るには、同じ効果を得るために古いコンマ表記を使用して2つのセットの間に複雑なUNIONが必要になります。 しかし、前述のように、これは実際には左結合の後ろに隠れている内部結合である例には適用されません。

ノート:

  • RIGHT JOINはLEFTと同じですが、AではなくTABLEB(右側)で始まる点が異なります。
  • RIGHTおよびLEFT JOINSはどちらもOUTER結合です。 Word OUTERはオプションです。つまり、LEFT OUTER JOIN
  • 3番目のタイプのOUTER結合はFULL OUTER結合ですが、ここでは説明しません。
4
RichardTheKiwi

結合ロジックをWHERE条件と混同しないように、JOINをWHEREから分離すると読みやすくなります。また、サーバーが2つの個別のクエリを実行して結果を組み合わせる必要がないため、一般的に高速になります。

最初の例にサブクエリを含めたため、指定した2つの例は実際には同等ではありません。これはより良い例です:

SELECT vs.*, mw.*
FROM vocab_stats vs, mst_words mw
LEFT JOIN vocab_stats vs ON mw.no = vs.vocab_no
WHERE vs.correct > 0 
AND mw.level = 1
AND vs.owner = 1111
0
Bazmatiq