少し単純化すると、JOIN最初に s が評価され、次にWHEREs フィルターが適用されると考えることができます。次の式を使用します。
1)最初のクエリは、フィールドに一致する特定の値を持つ、テーブルからのすべてのレコードと、テーブルaからの対応するレコードb(存在する場合、そうでない場合は s のセット)を返します。結果のセットは、次のレコードのみを持つようにフィルター処理され、最初のレコードがクライアントに返されます。NULLtb1_iduida.tb1_id=yyy
2) 2 番目のクエリは、a一致する. 結果のセットは、特定の値を持つレコードだけが含まれるように除外されます。最後の部分が重要です。この特定の条件は、一致するセットがなかったすべてのレコードをテーブルから破棄します。基本的に、の「ハード」条件と a を混在させないでください。これを行うと、すぐにjoin をoneに変換します。残りのセットの最初のレコードがクライアントに返されます。bNULLtb1_ida.tb1_idb.uidabNULL != xxxxxxxLEFT JOINWHEREOUTERINNER
そうは言っても、あなたの場合、同じ結果が得られる可能性があります。偶然にも。クエリに が含まれていないORDER BYため、返されるレコードの順序はデータベース エンジンに依存します (決定論的ではなく、信頼できないと考えたほうがよいでしょう。いずれにせよそうなる可能性が非常に高いです)。そのため、両方のクエリによって返される最初のレコードが、すべての条件に一致するレコードであるtb1_idことaが起こりbます。xxxxxxxb.uid