私はSQLを初めて使用しますが、これら2つのJOIN
タイプの違いを知りたいですか?
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
いつどちらを使用すればよいですか?
私はSQLを初めて使用しますが、これら2つのJOIN
タイプの違いを知りたいですか?
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
いつどちらを使用すればよいですか?
回答:
最初の例では、ユーザーの電話レコードが少なくとも1つ存在する場合にのみ、ユーザーと電話番号のリストを返します。
2番目の例では、すべてのユーザーのリストと、利用可能な場合は電話レコードを返します(利用できない場合はNULL
、電話の値を取得します)。
誰かがこの質問をするたびに、答えがあります:http : //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
それがあなたの理解に役立つことを願っています、
インナーには参加基準への参加に基づいて合成することができ返す行を。外部結合 ...戻りこれらおよびすべての行の
ための第一のテーブルから... ジョイン、左
のための第二のテーブルから... 右ジョイン
...のために、両方のテーブルから完全ジョイン
どちらを使用するかを選択することは、必要なデータを決定することです。たとえば、電話のuser_idがuserのidと一致するレコードのみが必要な場合は、内部結合を使用します。一致する電話エントリがないユーザーの行も含める場合は、左結合が適切です。
詳細については、StackOverflowに関するこの質問を参照してください。
以下のような2つのテーブルがある場合:
Table1 : A1 B1 Table2 : B2 C2
- - - -
1 2 1 1
2 4 2 4
3 5 5 2
Inner Joinを使用すると、以下が得られます。
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
Full Outer Joinを使用すると、以下が得られます。
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
2 4 NULL NULL
NULL NULL 1 1
左外部結合を使用すると、以下が得られます。
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
2 4 NULL NULL
外部結合は、結果にヌルを生成するように明示的に設計されているため、一般的には避ける必要があります。関係的に言えば、それは一種のショットガン結婚です。問題のテーブルが組合の通常の要件に適合していなくても、テーブルを強制的に組合に入れます。これは、実際には、ユニオンを実行する前に1つまたは両方のテーブルにNULLをパディングすることにより、最終的にそれらを通常の要件に適合させます。ただし、次の例のように、nullではなく適切な値を使用してパディングを行うべきではない理由はありません。
SELECT SNO , PNO
FROM SP
UNION
SELECT SNO , 'nil' AS PNO
FROM S
WHERE SNO NOT IN ( SELECT SNO FROM SP )
または、次のように、SQLの外部結合演算子とを組み合わせて使用すると、同じ結果が得られCOALESCE
ます。
SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP
内部結合は、表示される結果がキーが両方のテーブルにある結果のみである結合です。外部結合は、1つのテーブルのすべてのキーの結果を表示します。左結合は最初のテーブルから、右結合は2番目のテーブルから表示されます。例えば:
table1に次の主キーとデータのペアがあるとします:(1、a)、(2、b)、(3、c)
また、table2には次の主キーとデータのペアがあるとしましょう:(1、fun)、(3、can)、(4、happen)
したがって、主キーでtable1をtable2に内部結合すると、次の結果のトリプレットが得られます(共通主キーが最初、最初のテーブルの2番目のアイテムが2番目、2番目のテーブルの2番目のアイテムが3番目):(1、a、fun)、( 3、c、缶)
主キーでtable1をtable2に左外部結合すると、次の結果のトリプレットが生成されます(上記と同じ形式):(1、a、fun)、(2、b、NULL)、(3、c、can)
主キーでtable1をtable2に右外部結合すると、次の結果のトリプレットが生成されます(上記と同じ形式):(1、a、fun)、(3、c、can)、(4、NULL、happen)
これがコンセプトをきちんと説明することを願っています。
何をいつ使用するかを尋ねたので、クエリのシナリオを以下に示します-要件に応じて使用するものを選択します。
データ:
テーブルユーザーには10個のレコードがあります。テーブルPhonenoには6つのレコードがあります(1対1の関係。つまり、PhoneNoのエントリはUsersのエントリを1つだけ参照し、PhoneNoのエントリはUsersの特定のエントリのみを参照できます)。
要件1:すべてのユーザーに電話番号を表示します。電話番号のないユーザーを無視します。
クエリ:
SELECT u.uid, u.name, p.phonno
FROM user u
INNER JOIN phones p ON p.uid = u.uid
結果:電話番号を持つ6人のユーザーを表示します
要件2:すべてのユーザーに電話番号を表示します。ユーザーに電話ディスプレイ「N / A」がない場合(利用不可)
クエリ:
SELECT u.uid, u.name, ifnull(p.phonno,'N/A')
FROM user u
LEFT OUTER JOIN phones p ON p.uid = u.uid
結果:
10件すべてのレコードを表示します
注:ifnullは、null値を変換するMySql構文です。この関数を使用して、phonnoがヌルのときにdbエンジンに「N / A」を表示させました。他のDBMSを使用している場合は、適切な機能を探してください。SQL Serverでは、CASE
ステートメントを使用する必要があります。
これがお役に立てば幸いです。