2017-08-15 1 views
3

私はSQL経由で2つのテーブルを結合し、where句を追加します。結合は、where句の条件によって行われます。 where節がjoin節を期待しているかどうかに違いがあるかどうかは、大かっこでグループ化されているのだろうかと思います。結合の際に条件がグループ化されるかどうかはSQLで重要ですか?

例として質問してください:例1は例2と例3に相当しますか?

例1(なしグルーピング):

SELECT * FROM employees, vacation 
WHERE employees.first_name = 'Maria' and vacation_start > 2017 
    AND employees.employee_id = vacation.employee_id 

例2(句がグループ化されている参加以外のすべて):

SELECT * FROM employees, vacation 
WHERE (employees.first_name = 'Maria' and vacation_start > 2017) 
    AND employees.employee_id = vacation.employee_id 

例3(句に参加する最初の場合の引数である):

SELECT * FROM employees, vacation 
WHERE employees.employee_id = vacation.employee_id 
    AND (employees.first_name = 'Maria' and vacation_start > 2017) 

私はいつもデータベースがこの種のクエリを最適化すると想定していました。 しかし、それらは?私は主にMariaDBとSQLiteを使っています。

答えて

2

はいこれは同等です。

SELECT * 
FROM employees 
JOIN vacation 
    ON employees.employee_id = vacation.employee_id 
WHERE employees.first_name = 'Maria' and vacation_start > 2017; 

シンプルなロジック:

-- AND has associative property 
cond1 AND cond2 AND cond3 
<=> 
(cond1 AND cond2) AND cond3 
<=> 
cond1 AND (cond2 AND cond3) 
+0

私は実際にテーブル関係を明確にするので、できる限り明示的な結合を優先します。しかし、クエリは、私がselect-from-joinバリアントを実行できないプログラミングライブラリの結果です。( – capfan

+1

@capfan、 'JOIN'構文は1992年以降の標準構文です。ライブラリはサポートしていません。 –

1
  1. 条件は関係ない場所の順序が、あなたが行うに参加する中で書いているテーブルの順序しかし、あなたは、明示的な参加の代わりに、古いWHERE構文を使用する必要があります問題。
  2. 結合の左側に少ないレコードでテーブルを保持すると、パフォーマンスが向上します。
  3. WHERE条件に関しては、オプティマイザは常に述語を押し下げて結合操作を高速化します。つまり、まずテーブルの条件を適用し(employees.first_name = 'Maria'とvacation_start> 2017)、フィルタリングされたレコードセットに対してjoin(employees.employee_id = vacation.employee_id)を実行します。

    問合せのEXPLAIN PLANを確認すると、より理解しやすくなります。

    句は、まず、あなたの場合、論理式のために重要にグループ化
1

。例えば;

(A及びB及びC)

A及び(B及びC)

は等価です。

しかし

(A又はB及びC)

(A又はB)及びC

異なっています。

すべてのクエリはと同じです。非常に大きなデータがある場合は、グループ化の選択肢に少しのパフォーマンス問題が発生することがあります。問題ない場合は。

関連する問題