の違いは何ですか"内"と"外"に加入す?
-
09-06-2019 - |
質問
もう LEFT JOIN
, RIGHT JOIN
や FULL JOIN
わか?
解決
という接合するカラムと重複するもの例:
内側joinのAとBによりが交差するB、内部の ベン図(Venn diagram) できます。
外側joinのA及びBに結合B、外部のベン図(Venn diagram)です。
例
いつのテーブルは、単一カラムにそれをデータとして
A B
- -
1 3
2 4
3 5
4 6
ご注意(1,2)特A(3,4)、および(5,6)自B.
Inner join
内参加のいずれかのと同等のクエリーの交差点のテーブル、すなわちを行います。
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Left outer join
左外部結合させいただいている列は、プラス共通の行B.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
右外部結合させ
右外部結合させいただいている列Bにプラスに共通の行A.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
全外の参加
フル外側joinで、A、B、すべての行のすべての行B.な場合において対応するデータBのB部分がnullの場合、その逆も当てはまります。
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
他のヒント
のVenn図解思いました。
なに有意差は、cross join、inner join、例えば、より一般的には有意差異なる種類の述語や枠組みを提供する問どのように作用します。
に勝るものはありませんの理解を論理的処理では比較的簡単に把握します。
- 想像のクロスに加入。
- の評価
on
項に対するすべての行からステップ1つあるいは述語に評価しtrue
- (外部接)の追加を背意外行することで、失われたステップ2に進みます。
(注:実際のクエリoptimiserがより効率的な方法を実行するクエリは純粋に論理的に説明の上で最終的な結果と同じでなければなら)
んとアニメーション版の 全外の参加.一層ごとに説明していきます。
説明
ソーステーブル
最初の始まり CROSS JOIN
(通称直交した。これません ON
条項を返すだけの全ての組み合わせ列からです。
選択A.色、肌の色からクロスを入B
内外参加して"の"述語項.
- 内。 評価の条件を"ON"の条項のすべての行のcross joinます。場合にtrueを返し参加します。その他廃棄します。
- 左側の加入。 同じ内の参加その他の行の左テーブルマッチしなかった出力これらのNULL値の右側のテーブル列あります。
- 右の外ります。 同じ内の参加その他の行の右テーブルマッチしなかった出力ことは、NULL値が左側のテーブル列あります。
- 完全に外す。 同じ内参加して保存左不一致列として、左側が加入権不一致列として当たりを右外部結合させ.
一例
選択A.色、色からはINNER JOIN B A.色=B.色
上記のクラシックエす。
アニメーション版
選択A.色、色からはINNER JOIN B A.色のない(グリーン"ブルー")
内側join条件が必要となる平等の条件である必要はありませんの参照カラムの両方から(あるいはどちらかのです。評価 A.Colour NOT IN ('Green','Blue')
各行の参加に戻ります。
選択A.色、色からはINNER JOIN B1=1
の参加状態の評価をtrueにすべての行のcross join結果なのでと同様にクロス。んですが、繰り返し、画像に16行す。
選択A.色、肌の色から、左側の参加B A.色=B.色
外側join論理的に評価と同じように内面の接合を除きる場合には、列、左からテーブル(左joinな参加と行かい右手からテーブルで保存され、結果と NULL
値は右の列.
選択A.色、肌の色から、左側の参加B A.色=B.色がB.色がNULLの場合
では、このメソッドは単純に制限前の結果のみを返し行の場 B.Colour IS NULL
.この特定のケースではこれらの行ったとして残っていなかった試合はテーブル、クエリを返します単一の赤列にマッチしない表 B
.これを防半ります。
選択が必要であると考えられた。列の IS NULL
試験ではなくなっているのではないでnullableは、参加条件による NULL
値は対象外となりますためには、このパターンで正常に動作を回避するかを列をなしてい NULL
値がカラムのほか、国連のマッチさい。
選択A.色、肌の色から右外部結合させ億A.色=B.色
右外側join法同左外側join以外のものの保存不一致列右からテーブルおよびnullの左列あります。
選択A.色、肌の色から外側JOIN B A.色=B.色
フル外側joinを組み合わせ動作の左右の参加および保全にマッチする行を左右す。
選択A.色、肌の色から外側JOIN B1=0
無行の参加に合わせ 1=0
述語.すべての行の両面から保存は通常の外の参加ルールにNULLを指定テーブルのカラムを開発しました。
選択合体(A.色、肌の色として色から外側JOIN B1=0
たとえ小さな訂正前のクエリにつきをシミュレーション UNION ALL
のです。
選択A.色、肌の色から、左側の参加B A.色=B.色がB.色='グリーン
ことに注意 WHERE
条項がある場合は論理的に行後の加入。共通のエラーを左外側joinを含WHERE句を条件として、右表に終了するまでを除くのマッチングされています。上記の終了までの外の参加...
...その"場"の項です。 NULL= 'Green'
な評価をtrueに行保有外側joinて、最終的に廃棄されるとともにデジタルカメラモデルへアクセス)の有効化になったのは内なる。
場合、意図したことなどの行だけからB地の色は緑とすべての行からのことにとらわれるのではなく、正しい構文です
選択A.色、肌の色から、左側の参加B A.色=B.色B.色='グリーン
SQL怒
これらの例は参照 ラブSQLFiddle.com.
入 の使用を組み合わせのデータからのテーブルの結果の新しい仮ます。接合基づいて行われたものという述語するかを指定する利用条件に行うために。の違い、内外の参加は、inner joinを返しみの行を実際に試合に参加であったが,.で考える従業員と地表
Inner Join:- 内側joinを新しく作成した結果テーブルを組み合わせカラム値のテーブル(従業員 や 所在地)に基づく参加-述語.クエリを比較し、各行の 従業員 各行の 所在地 すべてのペアの行を満たす参加-述語.の参加-述語は満足してマッチングにより非NULL値、列値の各マッチ対列 従業員 や 所在地 配合されているのは結果です。このSQLるinner joinのような感じになります:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
外側Join:- 外側の参加を必要としない各レコードの両テーブルにマッチします。参加しているテーブルを保持し、各記録していないと言われるものの、他にはないマッチング記録が存在します。外側join subdivideさらに、左側の結合にと右の外側joinによってはテーブルの行が保有す(左または右)。
Left Outer Join:- の結果left outer join(または単にleft join)のためのテーブル 従業員 や 所在地 常にすべての記録"左テーブル"(従業員)ある場合でも、join条件はなく一致するレコードに"右"テーブル(所在地).ここには何のためのSQLをleft outer joinのようになり、テーブル上:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
右外部結合させ:- 右外側join(right join)のように見えるが、left outer joinを除く)の治療に用いられます"プレミアムエコノミーに対応しています。■各行の右"テーブル(所在地 が表示され参加しているテーブルに行くことになったのです。ていない場合に一致する行の"左テーブル"(従業員 が存在する場合はNULLが表示されるカラムから 従業員 の方に記録のない試合 所在地.このSQL次のように記述されています。
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
利用テーブル上できるか、結果セットの右外部結合させようになる:
フル外側Join:- 全外の参加または全参加するのnonmatching情報を含むnonmatching行の結果、用意外。すべての行に対して、両方のテーブルかどうかにかかわらず、又はその他のテーブルが一致する値です。
Inner Join
を取得するマッチする行だけである A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Left Outer Join
を選択するすべての記録から最初のテーブルのレコードの テーブルに参加します。
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
全外の参加
を選択するすべての記録からのテーブルのレコードの テーブルに参加します。
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
参考文献
簡単な言葉:
An inner join 取得する場合には、列のみです。
は 外側join 取得する場合には、列からテーブルの全ての行その他のテーブル....の結果によるご利用:
左:一致列は右の表およびすべての行の左側のテーブル
右:一致列左の表では、すべての行の右側のテーブルや
フル:すべての行のすべてます。なる場合があり合せ
内参加しての行がある場合は一致するレコードの右側。
(左)外側joinを示す列の各記録の左側にあるものがない場合に一致する行の右側。がない場合に一致する行のカラムのその他の右側に示されNull.
内側の参加を必要とする記録するとともに関連するIDが存在し、参加します。
外側joinを返し記録のための左側でもない場合が存在するためのきょ変更する場合があります。
例えば、ご発注およびOrderDetailsます。に関して、"orderidトランザクション".
受注
- Orderidトランザクション
- CustomerName
OrderDetails
- OrderDetailID
- Orderidトランザクション
- ProductName
- 頂
- 価格
の請求
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
ま返却のみの受注そのものOrderDetailsます。
変更した場合で外LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
その後戻りまrecordsからの受注テーブルの場合でもそのOrderDetailsます。
利用することができる見を受けないOrderDetailsを示す可能性の孤児を順を追加するwhere句のように WHERE OrderDetails.OrderID IS NULL
.
簡単な言葉:
Inner join ->らゆる点で優れており、かなり共通データからの親と子のテーブルが主キーの親テーブルのマッチ対する外部キーカラム名の子。
Left join ->
擬似コード
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
右の参加 :正反対の左ます。入れ名前のテーブルはLEFT JOINと右側に参加でき、同じ出力としていると考えられます。
外側join :すべての記録の両方のテーブル No matter what
.場記録を左テーブルなマッチングを右の表に基づき、Forieignキーの使用の場合はNULL値としての結果ます。
例:
きいこのテーブル2
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
ここでは、従業員のテーブルがマスターテーブル、phone_numbers_employeesは、子テーブル(これを含む emp_id
として外部キーを接続する employee.id
その子の表に示す。)
内部に加わ
の記録の2つのテーブル る場合のみ主キーの従業員のテーブル(そのidマッチした外部キーの子テーブルphone_numbers_employees(emp_id).
で照会することはできない。
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
こちらゆる点で優れており、かなり一致列に主キー=外部キーとして説明します。この不一致列に主キー=外部キーはスキップとしての結果ます。
左参加 :
Left joinを保持するすべての行の左側のテーブルかどうかにかかわらず、通常は、屋内で行われるので、この試合で右表に示す。
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
外側join :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Diagramaticallyで次のように記述されています。
ご利用の INNER JOIN
に帰すべての列の両方からのテーブルがあります。すなわちのテーブルの行と列してい値です。
に OUTER JOIN
この結果、テーブルが空の列あります。外参加する可能性があ LEFT
または RIGHT
.
LEFT OUTER JOIN
すべての列から最初のテーブルでも、条件が満たすものがない場合は、次表に示す。
RIGHT OUTER JOIN
すべての年のデータからの行のテーブルでも、条件が満たすものがない場合は最初の表に示す。
INNER JOIN
が必要であれば、試合を比較する。例えば、テーブルとテーブルBすることを意味٨B(交差点B)。
LEFT OUTER JOIN
や LEFT JOIN
は同じです。では、すべてのデータマッチングの両方のテーブルの全ての可能性を左ます。
同様に、 RIGHT OUTER JOIN
や RIGHT JOIN
は同じです。では、すべてのデータマッチングの両方のテーブルの全ての可能性を右の表に示す。
FULL JOIN
の組み合わせ LEFT OUTER JOIN
や RIGHT OUTER JOIN
重複なく
その答えはそれぞれの意味からかもしれないけど、僕はます。
注意:
にSQLite
ありませんRIGHT OUTER JOIN
またはFULL OUTER JOIN
.
ともにMySQL
ありませんFULL OUTER JOIN
.
私の答えは上記 注意.
きいテーブルのようなことが、この
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
CROSS JOIN/OUTER JOIN:
きのすべては、これらのテーブルデータ CROSS JOIN
やっと ,
このように:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
INNER JOIN:
追加したい場合にフィルター上の結果に基づく関係のように table1.id = table2.id
利用できる INNER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
左[外装]加:
いたい場合、すべての列のテーブル上の結果は同じに関連して利用できる LEFT JOIN
:
( 右の参加 を変えるだけのテーブル)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
全外の参加:
きたいと思いましてすべての列のその他のテーブルの結果を利用でき FULL OUTER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
もに、必要なだれることとしてお客さまが求める;).
内。
結合を組み合わせ列からです。An inner join 試み合わせの二つのテーブルに基づく条件を指定するクエリーのみが返されます行います。だから最初のテーブルにマッチ二列のテーブル、そして二列で返却すること。があれば、最初のテーブルに一致しない連続しないで返されません;同様に、があれば、列のテーブルに一致しない行の最初ませんので返却されます。
外ります。
A left join しようとすると試合の行から最初のテーブルの行の第二の表に示す。合することはできなマイペースでは列から最初のテーブルのカラムからのテーブル空欄(null).
ないではないかの詳細と性能をオプティマイザはその他の応答となります。
たまには良いかを知ることのみを INNER JOIN
は連想というバージョンのオプティマイザのオプションを再生します。で並べ替えの参加のため、高速化の結果です。バージョンのオプティマイザを使用できるも参加す。
一般的に良い練習に利用するようにして INNER JOIN
ではなく、異なる種類のが仲間入り。(もちろん可能であれば検討の結果を設けさせていただきます。)
カップルの事例と解説についてはこちらまでこの不思議な連想挙動:
の精密なアルゴリズム INNER JOIN
, LEFT/RIGHT OUTER JOIN
は、以下のことが明らかとなった。
- 各行の最初のテーブル:
a
- すべての列からテーブルの横で
(a, b[i])
- の評価
ON ...
条項に対し各ペア:ON( a, b[i] ) = true/false?
- 時の状態評価
true
, 戻る行(a, b[i])
. - 時に達末の二つ目のテーブルな試合では、この
Outer Join
それを返す (仮想) ペアを使用Null
全てのカラムのその他のテーブル:(a, Null)
左外部結合させた(Null, b)
右の外ります。これはすべての列の最初のテーブルが存在する最終結果.
- 時の状態評価
注意: の指定された条件に ON
条項がるまで何でもいいのですが必須ではありません。利用 主キー (られないときには、いくつかの必要性を常に参照カラムの両方からのテーブル)!例えば:
... ON T1.title = T2.title AND T1.version < T2.version
(=>こんにちサンプルとして使用 のみを選択列の最大値がカラム)... ON T1.y IS NULL
... ON 1 = 0
もしサンプル)
注意: Left Join=Left Outer Join、右に入=右外ります。
INNER JOIN
最も典型的な参加により、アーテーブルです。このデータを返しま試合は両方のテーブルprimarykeyとforignkeyる。OUTER JOIN
と同じINNER JOIN
, も含NULL
データのResultSet.LEFT JOIN
=INNER JOIN
+比類のないデータの 左 テーブルNull
試合は右表に示す。RIGHT JOIN
=INNER JOIN
+比類のないデータの 右 テーブルNull
試合は左の表に示す。FULL JOIN
=INNER JOIN
+比類のないデータ 先して実行するとともに、 テーブルNull
いる。
- 自己の参加ではないキーワードSQLでは、テーブル参照データ自体を知します。を使用
INNER JOIN
やOUTER JOIN
しき自己の参加ます。
例えば:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
単純な定義
Inner Join:を返します マッチ記録 からです。
全外の参加:返合わせ 比類のない記録 両方のテーブルがnullのための比類のない記録から 両方のテーブル.
Left Outer Join:返品は一致した比類のない記録からのテーブル 左側.
右外部結合させ:返品は一致した比類のない記録からのテーブル 右側.
に短
合+左む+右Unmatched= 全外の参加
合+左Unmatched= Left Outer Join
合+右Unmatched= 右外部結合させ
合= Inner Join
簡単に言うと、
1.内側JOINの主な内容: を返しますresultsetに一致する条件ものです。
2.外参加: を返しますresultsetのすべての値の両方からのテーブルがあっても条件に一致する。
3.LEFT JOIN: を返しますresultsetのすべての値を左からテーブルのみの行に一致する状態で右表に示す。
4.右の参加: を返しますresultsetのすべての値から右のテーブルのみの行に一致する条件に左ます。
5.フル参加: フル参加や外部結合させます。
1.Inner Join: とも呼ばれています。で列を返しますが、両方のテーブル左右テーブルのみ がある場合せ.そうでない場合はゼロを返します。
例:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2.全外の参加: ものとして加入。を返します すべての行 両方の左の表では、右表に示す。
例:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3.Left Outer join: または単なるとしていると考えられます。を返します全ての行を現在の左側のテーブルマッチング列右からテーブルを含みます。
4.右外部結合させ: とも呼ばれてます。マッチする行を返します左からテーブル(もしあれば)すべての行を右の表に示す。
優位性の参加
- 実行が速くなります。
Inner join -する inner join のいずれかのと同等のクエリーの交差点の テーブル, (を行います。
Left outer join -A left outer join すべての行に、共通の行B.
全外の参加 -A 全外の参加 ま、A、B、すべての行のすべての行B.な場合において対応するデータBのB部分がnullの場合、副versay
left join on
(通称 left outer join on
)を返します inner join on
行 union all
比類のない左テーブル行を延長null.
right join (on
通称 right outer join on
)を返します inner join on
行 union all
比類のない右テーブル行を延長null.
full join on
(通称 full outer join on
)を返します inner join on
行union all
比類のない左テーブル行を延長null union all
比類のない右テーブル行を延長null.
SQL標準は2006年のSQL/財団7.7構文規則1、一般規則1b3c&d、5b.)
い outer join
までにシステムについての基 inner join
てることを計画しています。
を読むコメントがあり、多くの混乱に欠くことのできない答えなのです。
それを読んだコメントここの多くの混乱に欠くことのできない答えなのです。
の違いを内外の参加は、以下のとおりであり
- 内側joinは参加する組合せテーブルに基づくマッチングタプルは外側joinは参加を合わせることに基づいてテーブルの両方一致した比類のないプル(tuple)型です。
- Inner joinが合併合を行う二つのテーブルが抜群列を省略し、外側joinが合併列からテーブルと比類のない行くnull値とします。
- 内側joinのような交差点運営は外部結合させたいと考えているので組合動作します。
- Inner joinは二種類が外側joinています。
- Inner joinは遅くなり、外側joinはinner join.
考える以下の2つのテーブル:
電磁ポンプ
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
部署
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
Inner Join:
主にとっ 加 sqlクエリ.だけを返します、条件に一致したデータとします。
すべての従業員とその部署名:
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
については、上記 Jose
印字されないから 電磁ポンプ のとして出力でdept_id 6
ないマイペースに。同様に、 HR
や R&D
行印字されないから 部署 テーブルなくなった場合は、電磁ポンプ。
なので、内部の参加や参加したマッチングされています。
LEFT JOIN:
このすべての記録から左のテーブルのみ一致するレコードから右の表に示す。
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
ということで、観察し、上記の出力は、すべての記録から左のテーブル(Emp)を印刷しただけでマッチングの記録から右の表に示す。
HR
や R&D
行印字されないから 部署 テーブルなくなった場合は、電磁ポンプテーブルdept_id.
なので、LEFT JOINを返します全ての行を左からテーブルにのみマッチング列右から。
でもチェックデモ こちらの.