SQLでのCROSS JOINとINNER JOINの比較


150

違いは何であるCROSS JOINとはINNER JOIN

CROSS JOIN:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status], 
FROM   
    Customers 
CROSS JOIN 
    Movies

内部結合:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status]
FROM   
    Customers 
INNER JOIN 
    Movies ON Customers.CustomerID = Movies.CustomerID

どちらが良いですか、なぜどちらを使用するのですか?


15
CROSS JOINテーブルのすべての可能な組み合わせになります。たとえば、100行のTable1と100行のTable2は、10000レコードになります。
bummi 2013

x CROSS JOIN yisx INNER JOIN y ON 1=1
philipxy

回答:


119

クロスジョインは行を結合しません。1対1の一致で各テーブルに100行がある場合、結果は10.000になり、Innerjoinは同じ状況で100行のみを返します。

これらの2つの例は同じ結果を返します。

クロスジョイン

select * from table1 cross join table2 where table1.id = table2.fk_id

内部結合

select * from table1 join table2 on table1.id = table2.fk_id

最後の方法を使用する


7
そして、私はあなたが書くことができると信じselect * from table1 cross join table2 where table1.id = table2.fk_idselect * from table1, table2 where table1.id = table2.fk_id(置き換えcross join,
modulitos

5
@Lucasは結合の古い構文ですが、機能します。ただし、はるかに読みやすい、clausenのバージョンをお勧めします。
iliketocode 2016

1
1対1の一致とはどういう意味ですか?「同じ状況」とはどういう意味ですか
Jwan622

1
@iliketocodeの「結合の古い構文」は明確ではありません。SQL-89とSQL-92の標準について話した方がいいでしょう
Ivanzinho

INNER JOIN "100"は、まだ説明していない特別なケースであり、一般的なケースを説明していません。
philipxy 2018年

186

以下は、クロス結合と内部結合の最良の例です。

次の表を検討してください

テーブル : Teacher

x------------------------x
| TchrId   | TeacherName | 
x----------|-------------x
|    T1    |    Mary     |
|    T2    |    Jim      |
x------------------------x

テーブル : Student

x--------------------------------------x
|  StudId  |    TchrId   | StudentName | 
x----------|-------------|-------------x            
|    S1    |     T1      |    Vineeth  |
|    S2    |     T1      |    Unni     |
x--------------------------------------x

1.内部結合

内部結合は、両方のテーブルを満たす行を選択します

クラスの教師である教師とそれに対応する生徒を見つける必要があると考えてください。その状態で、私たちは、適用する必要があるJOININNER JOINとなります

ここに画像の説明を入力してください

クエリ

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId

結果

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

2. CROSS JOIN

クロスジョインは、最初のテーブルのすべての行と2番目のテーブルのすべての行を選択し、デカルト積として表示します。つまり、すべての可能性

があります。クラスの教師に関係なく、学校のすべての教師と生徒を見つける必要があると考えますCROSS JOIN

ここに画像の説明を入力してください

クエリ

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
CROSS JOIN #Student S 

結果

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T2    |     Jim     |    Vineeth  |
|    T2    |     Jim     |    Unni     |
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

1
図2のキーは複雑です。CROSSJOINの引数の(色とは無関係)要素を囲み、数値(値とは無関係)はその行であり、線(色とは無関係)は結果行です。バッグとしてのテーブルの場合はベン図ではありません。値としての行の場合は間違っています。要素としての行の場合、それら共有できません。セットとしてのテーブルの場合、ベン図は必要ありません。図1は、JOINを説明するための一般的なひどい試みです。そのキーも複雑です。それは、セットとしてのテーブルのみであり、等価結合のみであり、値は1つだけです。また、出力とは異なる方法で入力を表します。書くことは、一般的に参加するために。
philipxy 2015年

図1は、交差する円ベン図の4つのカラーリングの最初の色として有用であり、正しいものです。(内側)結合vs左、右&完全(外側)結合です vsクロス結合ではありません。交差する行はJOINにあり、左/右の行はLEFT / RIGHT JOINの余分な(ヌル拡張)行です。それは含まクロス(INNER)の特殊な場合として参加の非交差部に行がない場合JOIN。
philipxy 2015年

1
あなたの提案をありがとう。とにかく、OPはこれら2つの結合の違いを求めています。私はこの質問に初心者が簡単にそれらの違いを理解できるような方法で答えました。あなたが言ったように、私はプロダクション環境のようにキーを与えていません。わかりやすくするためのほんの一例です。そしてのためにCross JoinWhere句が与えられない限り、それはすべての行を返さないと思いますか?あなたのコメントから、初心者が混乱する可能性がもっとあります!!! @philipxy
Sarath Avanavu 2015年

1
私のコメントは、図は1は、彼らが言いたいのかを知っている場合でも、解釈が困難であることを指摘し、このトピックには不適切です。(図2または1の)「キー」とは、「図の各部分の意味の説明」を意味しました。「書く」とは、図の各部分の意味を非常に明確に書いてみることを意味します。ダイアグラムが複雑で、クロス結合と内部結合を示していないことがわかります!つまり、彼らはあなたの答えに属していません。PS Tableリレーショナルキーは、JOINが何をするかを説明する役割を果たしません。PPS結合の唯一の違いは、INNER JOINにONがあることです。
philipxy 2015年

W3Schools w3schools.com/sql/sql_join_inner.aspを見てください。これらは、INNER JOINについて同様のタイプの図を提供しています。コメントをする前に、自分が正しいことを確認してください@philipxy
Sarath Avanavu

69

CROSS JOIN =(INNER)JOIN =コンマ( "、")

TL; DR SQL CROSS JOIN、(INNER)JOINとコンマ( "、")の唯一の違いは、評価順序のコンマの優先順位が低いことですが、(INNER)JOINはONですが、CROSS JOINとコンマにはありません。


中間製品の再

3つすべてが、各テーブルからの行のすべての可能な組み合わせの中間概念SQLスタイルのリレーショナル「デカルト」積、別名クロス結合を生成します。ONやWHEREで行数を減らします。SQLフィドル

SQL標準では、 <comma>を製品(7.5 1.b.ii)で定義し、<cross join>を<comma>(7.7 1.a)で定義し、JOIN ON <検索条件>を<comma>とWHERE(7.7 1.b)で定義しています。)。

ウィキペディアが言うように:

クロスジョイン

CROSS JOINは、結合のテーブルから行のデカルト積を返します。つまり、最初のテーブルの各行と2番目のテーブルの各行を組み合わせた行が生成されます。

内部結合

[...]結合の結果は、テーブル内のすべてのレコードのデカルト積(またはクロス結合)を最初に取り(テーブルA内のすべてのレコードをテーブルB内のすべてのレコードと組み合わせて)返した結果として定義できます。結合述部を満たすすべてのレコード。

「暗黙的な結合表記」は、SELECTステートメントのFROM句で、カンマを使用して結合するテーブルをリストするだけです。したがって、クロス結合を指定します

OUTERが加わり、それらに見WHERE対ON使用して、JOIN INNER対LEFTの条件は(外部結合)に参加します

なぜテーブル間で列を比較するのですか?

重複する行がない場合:

すべてのテーブルには、特定のfill-in-the- [named-] blanksステートメントテンプレートからの真のステートメントを作成する行が保持されます。(それは本当作る命題フロム・満足し --a一定(特性)述語を。)

  • ベーステーブルには、DBAから与えられたステートメントテンプレートからの真のステートメントを作成する行が保持されます。

    /* rows where
    customer C.CustomerID has age C.Age and ...
    */
    FROM Customers C
  • 結合の中間積は、そのオペランドのテンプレートのANDから真のステートメントを作成する行を保持します。

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    */
    FROM Customers C CROSS JOIN Movies M
  • ON&WHERE条件はANDで結合され、さらにテンプレートが作成されます。値は、そのテンプレートを満たす行です。

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    AND C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    AND C.Age = 18
    */
    FROM Customers C INNER JOIN Movies M
    ON C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    WHERE C.Age = 18

特に、テーブル間で(SQL)が等しいかどうかの列を比較すると、テンプレートの結合されたテーブルの部分の製品から保持された行の列の値が(NULL以外の)同じになります。多くの行は通常、テーブル間の等価比較によって削除されるのは偶然の一致です。必要な行は、必要な行を特徴付けるために十分です。

必要な行のテンプレートにSQLを書くだけです!

クエリ(およびテーブルと条件)の意味については、「
内部結合とユニオンの2つの異なる列について、別のSQLテーブルから一致するデータを取得する方法」を参照してください
人間が読める記述からSQLクエリを構築するための経験則はありますか?

「クロス結合」のオーバーロード

残念ながら、「クロスジョイン」という用語は次の目的で使用されます。

  • 中間製品。
  • CROSS JOIN。
  • (INNER)1つのテーブルの列を別のテーブルの列と比較しないONまたはWHEREを使用したJOIN。(それは中間製品の行の多くを返す傾向があるので。)

これらのさまざまな意味が混乱します。(例:他の回答やコメントはこちら)

CROSS JOIN vs(INNER)JOIN vsコンマの使用

一般的な規則は次のとおりです。

  • テーブル間で列を比較しない場合にのみ、CROSS JOINを使用します。それは、比較の欠如が意図的なものであったことを示すためです。
  • テーブル間で列を比較する場合にのみ、(INNER)JOINをONで使用します。(さらに、おそらく他の条件。)
  • コンマは使用しないでください。

通常、テーブルのペアにない条件もWHEREに対して保持されます。ただし、RIGHT、LEFT、またはFULL(OUTER)JOINへの引数に適切な行を取得するには、それらをa(n INNER)JOIN ONに入れる必要がある場合があります。

カンマを使用しない」についてカンマの優先順位が低いため、カンマと明示的なJOINを混在させると誤解を招く可能性があります。しかし、CROSS JOIN、(INNER)JOIN、およびカンマの意味での中間製品の役割を考えると、それをまったく使用しないという上記の規則の引数は不安定です。CROSS JOINまたはコンマは、TRUE条件にある(INNER)JOINと同じです。中間積であるONとWHEREはすべて、対応する述語にANDを導入します。ただし、それ以外の場合、INNER JOIN ONは考えられます。たとえば、ON条件を満たす入力行のペアが見つかった場合にのみ出力行を生成しますが、それでも条件を満たす条件を満たすクロス結合行を返します。ON SQLでカンマを補足する必要があった唯一の理由は、OUTERを記述することでした。JOIN。もちろん、式はその意味を明確にする必要があります。しかし、何が明確かは、物事が何を意味するのかによって異なります。

Re Vennダイアグラム 2つの交差する円があるVennダイアグラムは、同じ入力のINNER、LEFT、RIGHT、およびFULL JOINの出力行の違いを示すことができます。また、ONが無条件にTRUEの場合、INNER JOINの結果はCROSS JOINと同じになります。また、INTERSECT、UNION、およびEXCEPT の入力行と出力行を示すこともできます。また、両方の入力に同じ列がある場合、INTERSECTの結果は標準SQL NATURAL JOINの場合と同じであり、EXCEPTの結果はLEFT&RIGHT JOINを含む特定のイディオムの場合と同じです。ただし、(INNER)JOINが一般的にどのように機能するか示していませ一見それはもっともらしいようです。入力および/または出力の一部を識別できますON、PK(主キー)、FK(外部キー)、SELECTの特別なケース。これを確認するために必要なのは、円で表されるセットの要素を正確に特定することです。(どの混同されたプレゼンテーションも明確になることはありません。)(一般に、結合の場合、出力行の見出しは入力行とは異なります。SQLテーブルは、NULLのある行のセットではなく、バッグです。)


6
+1私はこの回答が一番好きです-他の人は結果が異なることを示唆しているようですが、 "ON"句を "WHERE"に置き換えた場合、結果は同じです
ロニー

4
+1 INNER JOINでON句を省略するとCROSS JOINを使用した場合とまったく同じ結果が得られることを明確にしていただきありがとうございます
Cerno

「中間概念SQLスタイルのデカルト外積」-それは別の言い方ですが、「それは実際には順序付けられたペアのセットではありませんが、「デカルト積」と言うことは避けられません」?:)私自身、非数学者として、「デカルト積」という用語に出会った唯一の状況は、誰かがSQLを説明しているときCROSS JOINです。誰かがデカルト積にすでに慣れているが理解できないSQLにどれくらいの頻度でアクセスするのでしょうかCROSS JOIN
18:54

1
@onedaywhen演算子デカルト積は、いくつかのセットを指定すると、順序付けられたタプルのセットを返します。結果は直積。リレーショナルおよびSQLカルチャは、「デカルト積」を呼び起こすデカルト積ではない演算子に対して「カルテシアン積」を誤用/過負荷にしている。例えばウィキペディア!私はそれに反対します-それは単に誤解/混乱を招きます。しかし、ここでは残念ながら、SQLクロスジョインが自分の言葉でどのように機能するかをあいまいに説明し、ウィキペディアに委ねています。結果に「中間概念SQLスタイルのデカルト外積」というラベル付けます。はい、「デカルト」はそれを使用する/期待する悲しいことにすでに腐敗している人々のためのものです。
philipxy

1
これは、より高い評価の回答とは異なり、正しい回答です。SQLの典型的な例は、言語の基礎さえ理解または定義できていないにもかかわらず、写真による表面的で合理的なサウンドの適切な形式の説明が教育コンテンツを支配していることです。
Charles

23

内部結合

結合された両方のテーブルで一致する行のみを表示する結合​​は、内部結合と呼ばれます。これは、クエリおよびビューデザイナのデフォルトの結合です。

内部結合の構文

SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name

クロスジョイン

結合に関与したテーブルのデカルト積を生成するクロス結合。デカルト積のサイズは、最初のテーブルの行数に2番目のテーブルの行数を掛けたものです。

クロス結合の構文

SELECT * FROM table_name1
CROSS JOIN table_name2

または別の方法で書くこともできます

SELECT * FROM table_name1,table_name2

次のクエリでクロス結合を確認してください

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

または

SELECT * FROM UserDetails, OrderDetails


8

CROSS JOIN

この記事で説明したように、CROSS JOINはデカルト積を生成するためのものです。

デカルト積は、2つのセットAとBを取り、2つの与えられたデータセットからペアレコードの可能なすべての順列を生成します。

たとえば、次のデータベーステーブルがあるranksとしsuitsます。

ランクとスーツの表

そして、ranks次の行があります:

| name  | symbol | rank_value |
|-------|--------|------------|
| Ace   | A      | 14         |
| King  | K      | 13         |
| Queen | Q      | 12         |
| Jack  | J      | 11         |
| Ten   | 10     | 10         |
| Nine  | 9      |  9         |

一方でsuitsテーブルには、次のレコードが含まれています。

| name    | symbol |
|---------|--------|
| Club    |       |
| Diamond |       |
| Heart   |       |
| Spade   |       |

次のようなCROSS JOINクエリとして:

SELECT
   r.symbol AS card_rank,
   s.symbol AS card_suit
FROM
   ranks r
CROSS JOIN
   suits s

rankssuitesペアのすべての可能な順列を生成します:

| card_rank | card_suit |
|-----------|-----------|
| A         |          |
| A         |          |
| A         |          |
| A         |          |
| K         |          |
| K         |          |
| K         |          |
| K         |          |
| Q         |          |
| Q         |          |
| Q         |          |
| Q         |          |
| J         |          |
| J         |          |
| J         |          |
| J         |          |
| 10        |          |
| 10        |          |
| 10        |          |
| 10        |          |
| 9         |          |
| 9         |          |
| 9         |          |
| 9         |          |

内部結合

一方、INNER JOINは、2つの結合データセットのデカルト積を返しません。

代わりに、INNER JOINは左側のテーブルからすべての要素を取得し、右側のテーブルのレコードと照合して、次のようにします。

  • 右側のテーブルで一致するレコードがない場合、左側の行は結果セットから除外されます
  • 右側のテーブルの一致するレコードの場合、左側の行は、そのレコードと右側のテーブルの関連するすべての子レコードの間にデカルト積があったかのように繰り返されます。

たとえば、次のような親テーブルと子テーブルの間に1対多のテーブル関係があると仮定します。postpost_comment

1対多のテーブル関係

ここで、postテーブルに次のレコードがあるとします。

| id | title     |
|----|-----------|
| 1  | Java      |
| 2  | Hibernate |
| 3  | JPA       |

そしてpost_comments表には、これらの行があります。

| id | review    | post_id |
|----|-----------|---------|
| 1  | Good      | 1       |
| 2  | Excellent | 1       |
| 3  | Awesome   | 2       |

次のようなINNER JOINクエリ:

SELECT
   p.id AS post_id,
   p.title AS post_title,
   pc.review  AS review
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id

post関連するすべてのレコードとともにすべてのレコードを含めますpost_comments

| post_id | post_title | review    |
|---------|------------|-----------|
| 1       | Java       | Good      |
| 1       | Java       | Excellent |
| 2       | Hibernate  | Awesome   |

基本的に、INNER JOINは、一致するレコードのみが最終結果セットに保持されるフィルター済みCROSS JOINと考えることができます。

INNER JOINの仕組みの詳細については、こちらの記事もご覧ください。


"INNER JOINは、2つの結合データセットのデカルト積を返さない"とは、x INNER JOIN y on 1 = 1が返す場合、少し多くなります。したがって、あなたが言い続けようとすることが実際に(もちろん)1 = 1の条件でそれを返す場合、「代わりに」です。箇条書きの言語が内部結合の結果を明確に説明していないことを除いて。それを説明しているのは、条件を満たさない行が少ないクロス結合であるということです。同様に、「組み合わせ」を使用したクロスジョイン言語も明確ではありません。
philipxy

7

SQL Serverは、以下のより簡単な表記も受け入れます。

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

この単純な表記を使用すると、内部結合とクロス結合の違いを気にする必要はありません。2つの「ON」句の代わりに、1つの「WHERE」句がその役割を果たします。どの "JOIN" "ON"句がどこに行くのかわからない場合は、 "JOIN"表記を放棄し、上記のより簡単な表記を使用してください。

不正行為ではありません。


2

内部結合を使用してクエリを記述しているときに、両方のテーブルで条件が満たされた場合、つまり両方のテーブルの共通列が完全に一致する場合、レコードは両方のテーブルからフェッチされます。

クロス結合を使用してクエリを記述している間、結果は両方のテーブルのレコード数のデカルト積のようになります。たとえば、table1に2つのレコードが含まれ、table2に3つのレコードが含まれている場合、クエリの結果は2 * 3 = 6レコードになります。

したがって、必要になるまでクロスジョインを行わないでください。


2
WHERE句がない場合のみ!
epitka 14

2

クロス結合と内部結合は同じですが、唯一の違いは、内部結合でデカルト積の結果の一部をブール値でフィルタリングすることです。

table1
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    option1  |
|    A     |      B1     |    option2  |
x--------------------------------------x

table2
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    optionB1 |
|    A1    |      B1     |    optionB2 |
x--------------------------------------x

 cross join
  A,B,option1,A,B,optionB1
  A,B,option1,A1,B1,optionB2
  A,B1,option2,A,B,optionB1
  A,B1,option2,A1,B1,optionB2

 inner join on field1 (only with the value is the same in both tables)
  A,B,option1,A,B,optionB1
  A,B1,option2,A,B,optionB1

 inner join on field1
  A,B,option1,A,B,optionB1

結合に使用しているフィールドのケースが1つだけであると判断するのは、データの設計です。両方のテーブルのクロスジョインのみを結合し、特別なブール式を実行する行のみを取得します。

結合を実行しているフィールドが両方のテーブルでnullになる場合は、フィルターを通過することに注意してください。nullを回避または許可するためのルールを追加するかどうかは、弊社またはデータベースの製造元に委ねられています。基本に従っているのは、クロス結合とそれに続くフィルターだけです。


0

内部結合は2つのテーブル間の一致したレコードの結果を提供しますが、クロス結合は2つのテーブル間の可能な組み合わせを提供します。


0

A = {1,5,3,4,6,7,9,8} B = {2,8,5,4,3,6,9}

cross join デカルト積Aとして機能します✖B = {1,2}、{1,8} ...、{5,2}、{5,8}、{5,5} ..... {3,3} ...、{6,6} .... {8,9}この長い結果セットを返しました。

inner join完了したデカルト積を処理するときに、一致するペアを選択します。この順序付けされたペアを2つのテーブルの主キーと考え、A = Bのオン句検索の場合inner join、{5,5}、{4,4}、{6,6}を選択します。 、{9,9}およびこれらのIDに関連する選択句の質問列を返しました。

cross joina = bの場合、結果はと同じ結果セットになりinner joinます。その場合も使用しますinner join


-1

それはあなたが期待する出力に依存します。

クロス結合は、あるテーブルのすべての行を別のテーブルのすべての行と照合します。内部結合は1つまたは複数のフィールドで一致します。10行のテーブルと10行のテーブルがある場合、2つの結合の動作は異なります。

クロス結合では100行が返され、それらは関連付けられません。いわゆるデカルト積です。内部結合は、レコードを互いに一致させます。一方に主キーがあり、もう一方に外部キーがあるとすると、10行が返されます。

クロス結合には一般的な有用性は限られていますが、完全を期すために存在し、クエリにリレーションを追加せずにテーブルを結合した結果を示します。クロス結合を使用して、単語の組み合わせまたは類似のリストを作成できます。一方、内部結合は最も一般的な結合です。


誰もが混乱しないように。答えを短くしてみました。これが最良の短い回答です。
Shrikant Jadhav
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.