sql >> データベース >  >> RDS >> Mysql

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

    まず、完全に同等であるためには、最初のクエリを作成する必要があります

       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にフィルターが含まれているため、作成したクエリでINNERJOINを使用できます。

    一般的な形式

    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句の条件と組み合わせると、同じことを表すため(AとBの間の条件=>保持するかどうか)、INNERJOINと同じ動作を生成することがあります。ただし、コンマの代わりにINNER JOINを使用する場合の意図について読むと、はるかに明確になります。

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

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

    注:

    • RIGHT JOINはLEFTと同じですが、AではなくTABLEB(右側)で始まる点が異なります。
    • RIGHTおよびLEFTJOINSは両方ともOUTER結合です。 OUTERという単語はオプションです。つまり、LEFT OUTER JOINと書くことができます。 。
    • 3番目のタイプのOUTER結合は、FULL OUTER結合ですが、ここでは説明しません。


    1. MySQLへのUnity3D接続エラー

    2. SQLSELECTステートメント

    3. MySQL InnoDB Cluster 8.0-完全な操作のウォークスルー:パート2

    4. PostgresからSQLServer2008への移行