全ての種類の結合を知っていると思っていたところに、別の結合が登場しました。おそらく、あなたは、ネストされた結合やネストされたループのクエリプランについて聞いたことがあり、それらが何であるか疑問に思ったことがあるでしょう。もう疑問に思う必要はありません。今日のブログで謎が一気に解決します!
用語の事例
リレーショナルデータベースの世界では、同じものに対して様々な名前が付けられることがあります。結合もこのルールの例外ではありません。実際、ネストされた結合に関しては、データベースの専門家の意見は異なります。そんなことはないと言う人もいます。他の人はより実用的で、それらが複数テーブル結合の単なる代替用語であることを認めています。
おそらく、この用語は、ネストされたループクエリプランを参照する時に発生しました。これらは、結合に応答するクエリエンジンによってよく使用されます。最も粗雑な形式では、ネストされたループは、次のようになります。
for all the rows in outer table for all the rows in the inner table if outer_row and inner row satisfy the join condition emit the rows next inner next outer
これは最も単純ですが、ネストされたループの最も遅いタイプでもあります。一方、複数テーブルのネストされたループ結合は、関連する全てのテーブルの行数の積が大きくなるにつれて、恐ろしくスケールアウトするため、パフォーマンスがさらに低下します。
ネストされたループのより効率的な形式は、nested-loop-over-indexです。
for all the rows that pass the filter from the outer table use join qualifier from outer table row on index on inner table if row found using index lookup emit the rows next outer
ネストされた結合の構文
「ネストされた結合」という用語が単に3つ以上のテーブル間の結合を指すことを確認したので、その構文を簡単に見てみましょう。
通常、複数のテーブルやビューを結合する必要がある場合は、次の一般的な形式を使用して、それらを1つずつリストします。
FROM Table1 [ join type ] JOIN Table2 ON condition2 [ join type ] JOIN Table3 ON condition3
しかし、これが唯一の方法ではありません。SQLの公式のANSI構文標準では、上記の結合を記述する別の有効な方法を提案しています。
FROM Table1 [ join type ] JOIN Table2 [ join type ] JOIN Table3 ON condition3 ON condition2
上記の結合スタイルを人間がより読みやすいものにするために、括弧とインデントを追加して意味をより明確にすることができます。
FROM Table1 [ join type ] JOIN ( Table2 [ join type ] JOIN Table3 ON condition3 ) ON condition2
Table1に結合する前に、Table2とTable3の間の結合が最初に指定され、最初に実行する必要があることが簡単にわかります。このクエリスタイルでは、Table2とTable3の間の結合もネストされているように配置されます。実際、Table2とTable3の間の結合はネストされていると考えることができます。
以下は、両方のスタイルで記述されたNavicat Premiumの同じクエリです。
結論
今日のブログでは、「ネストされた結合」と「ネストされたループのクエリプラン」という用語に光を当てました。そのため、あなたが次にそれらを耳にする時には、どの構文が使用されているかに関係なく、単に複数のテーブルまたはビューの結合について言及しているだけであることがわかるでしょう。