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