mysqlクエリでmysqlのleft(right)joinフィルタ条件を使用してonとwhereの間でクエリされたデータに違いがあるかどうかについての質問があります。
2 つのキーワードを見るだけでは問題が見つからないかもしれません。実際の例を使用して、違いがあるかどうかを確認してみましょう。
たとえば、2つのテーブル構造があります
テーブル構造1
ステートメント 2 のクエリ結果は次のとおりです:
2 つのクエリの間に違いが見つかりました。
なぜ違いがあるのでしょうか? これは on と where のクエリ順序に関係しています。
標準的なクエリキーワードの実行順序は、from->where->group by->having->order by であることがわかっています[はっきりとは覚えていません]
左結合は from range クラスにあるため、テーブルは最初に on 条件によってフィルターされ、次に 2 つのテーブルに対して左結合が実行されます。
どこで、左側の結合結果が再度フィルタリングされます。
最初のSQLステートメントのクエリプロセスは次のとおりです:
1: 最初の左結合
2: クエリ結果から B.ID または BID
これが上で見た結果です。
2 番目の SQL ステートメントのクエリ プロセスは次と同等です:
1: 最初に on 条件に従ってテーブルをブラッシングすることは、最初に B テーブルをフィルタリングすることと同じです:
2: 前のクエリ結果とテーブル A に対して左結合を実行します。これが、2 番目のクエリの SQL がテーブル A を保持していることがわかる理由です。
ON を使用する場合とその場所に注意してください:
(1): ON の背後にあるフィルター条件は主に関連テーブル用です (ただし、メイン テーブルのブラシ選択条件は適用されません)。
例:
予想と異なる結果が得られ、AID=3のデータがふるいにかけられたのには驚きました。
しかし、AIDのAID 1と2に対応する値はNULLであり、関連付けられたテーブルはテーブルAのフィルタリング条件を満たす値のみを取ることもわかりました。
つまり、メインテーブルの条件がon以降の場合、アタッチされたテーブルはメインテーブルの選択条件を満たす値のみを取り、メインテーブルは丸められたテーブルのままになります。
(2): メインテーブルのフィルター条件は ON の後ではなく where の後に配置する必要があります
(3): 関連テーブルを別の方法で扱う必要があります。接続する前に条件をクエリする必要がある場合は、クエリ部分を追加する必要があります
後ろに置きます。接続完了後にフィルタリングしたい場合は、whereの後に条件を置く必要があります
(4):
関連テーブルの場合、実際には最初にサブクエリを実行してから結合することができますしたがって、2番目のSQLは以下と同等です
コードをコピーします
www.bkjia.com