6
select e.last_name, e.hire_date
from employees e join employees m
on (m.last_name = 'Davies')
and (e.hire_date > m.hire_date);

select e.last_name, e.hire_date
from employees e join employees m
on (m.last_name = 'Davies')
where (e.hire_date > m.hire_date);

select e.last_name, e.hire_date
from employees e join employees m
on (e.hire_date > m.hire_date)
where (m.last_name = 'Davies');

これらの3つのステートメントの結果は同じです。whereを使用せずに排他的に使用できないという事実とは別に、テーブル結合でon使用する特別な理由はありますか?where

4

5 に答える 5

11

主な違いは、異なる結合を使用している場合です。

通常、内部結合を使用しても同じ結果が得られるはずですが、LEFT 結合を使用し始めると結果が変わります。

次の例を見てください。

SQL フィドルのデモ

そして、次の記事を見てください(非常に説明的です)

@ShannonSeveranceの編集

スキーマとテスト データ

CREATE TABLE Table1 (
  ID INT,
  Val VARCHAR(20)
 );

INSERT INTO Table1 VALUES (1,'a');
INSERT INTO Table1 VALUES (2,'a');

CREATE TABLE Table2 (
  ID INT,
  Val VARCHAR(20)
 );

INSERT INTO Table2 VALUES (1,'a');

とテスト

SELECT t1.ID,
t1.Val,
t2.ID ID2,
t2.Val Val2
FROM Table1 t1 INNER JOIN
Table2 t2 ON t1.ID = t2.ID AND t1.Val = t2.Val;

SELECT  t1.ID,
t1.Val,
t2.ID ID2,
t2.Val Val2
FROM Table1 t1,Table2 t2 
WHERE t1.ID = t2.ID
 AND t1.Val = t2.Val;

SELECT  t1.ID,
t1.Val,
t2.ID ID2,
t2.Val Val2
FROM Table1 t1 LEFT JOIN
Table2 t2 ON t1.ID = t2.ID  AND t1.Val = t2.Val;

SELECT  t1.ID,
t1.Val,
t2.ID ID2,
t2.Val Val2
FROM Table1 t1 LEFT JOIN
Table2 t2 ON t1.ID = t2.ID  
WHERE t1.Val = t2.Val;
于 2012-10-30T04:04:19.727 に答える
10

where結合を使用して行が選択された後に適用されるフィルターです。join ... on条件が意味的に条件と同等であるとは限りませんwhere。したがって、はい、テーブル結合でinを使用する特別な理由がありますwhere。それが正しいことを行う場合です。


...対照的に、ON条件は結合が行われているときに実行されます。ONマルチテーブル結合の初期の結合の条件は、何百万もの不要な結合を遮断する可能性があるため、意味的に正しい場合は一般的に推奨されます
ボヘミアン

于 2012-10-30T04:01:44.963 に答える
1

on通常、複数のテーブルのクエリに使用されます。そのクエリを作成するとき、テーブルは互いに関係を持っている必要があります。一般に、特定のフィールドで同じ値です。

onたとえば、次のように同じ値を接続します。

**table1**:

id_name   id_position   name
1         1             john
2         2             doe
3         2             tom
4         3             hawkins

**table2**
id_position   position
1             system analyst
2             programmer

SELECT t1.id_name, t1.name, t2.position
  FROM table1 t1 LEFT JOIN table2 t2
  ON t1.id_position = t2.id_position

-- RESULT:
id_name   name     position
1         john     system analyst
2         doe      programmer
3         tom      programmer
4         hawkins  NULL            -- NO MATCH IN table 2

ご覧のとおり、on同じ value を持つ table1 と table2 を接続するid_positionため、上で書いたものとは少し異なります。

whilewhereはすべてのクエリで使用でき、そのクエリ内のテーブルの数には依存しません。一般whereに、必要な条件付きのものに使用されます。

于 2012-10-30T04:54:03.570 に答える
0

違いは、エンジンがフィルタリングを実行するタイミングにあります。「where」は、両方のテーブルの計算結果に対するフィルターを表します。「on」キーワードは、結合の実行方法を指定します。両方が同じ結果を生成する場合があっても、意味的には同等ではありません。

乾杯

于 2012-10-30T04:03:26.937 に答える