web-dev-qa-db-ja.com

LEFT JOINとWHERE句はどのように機能しますか?

以下のクエリを考える

    SELECT * FROM tableA 
    LEFT JOIN tableB ON tableB.id = tableA.id
    WHERE tableA.name = 'e'

tableA                        tableB
-----------                   ----------- 
id    name                     id    school
-----------                   -----------  
1     a                         1     AA
2     b                         2     BB                     
3     c                         3     CC                     
4     d                         4     DD                     
5     e                         5     EE  

私を困惑させるのは、背後で起こっているプロセスです。

システムは、WHERE句から行のみを選択する前に、まずtableAとtableBの両方を結合しますか?

はいの場合、このクエリはどうですか

SELECT * FROM 
(
    SELECT * FROM tableA     
    WHERE name = 'e'

) A LEFT JOIN tableB ON tableB.id = A.id 

このクエリは、他のテーブルにJOINする前に、まずWHERE句を使用して選択しますか?

ウェブで回答が見つかりません。 MySQLリソースの帯域幅を減らしたかった。 2番目のクエリはこの状況に最適ですか?

4
Jam Ville

クエリオプティマイザーが決定し、かなりスマートです。

SELECT * FROM tableA 
LEFT JOIN tableB 
  ON tableB.id = tableA.id
WHERE tableA.name = 'e'  

最初に結合を行う方が効率的である場合が多くあります。名前にインデックスが付けられ、 'e'がある程度一意である場合、最初に行う方が効率的です。

これは違う

SELECT * FROM tableA 
LEFT JOIN tableB 
  ON tableB.id = tableA.id
WHERE tableB.school = 'EE'   

これにより、左結合が内部結合に変更されますが、データに一致があるため、同じ結果が得られます。

5
paparazzo