SQLite 結合:ナチュラルレフトアウター、インナー、クロスウィズテーブル

⚡ スマートサマリー

SQLite JOIN句は、INNER JOIN、JOIN USING、NATURAL JOIN、LEFT OUTER JOIN、CROSS JOINを使用して2つ以上のテーブルの行を結合し、共有列に基づいて関連するレコードを照合したり、正規化されたデータベース全体でデータを読み取ったりすることを可能にします。

  • 🔗 結合条項: JOIN句は、ONまたはUSING条件で定義された共有列に基づいて、2つ以上のテーブルまたはサブクエリをリンクします。
  • 🎯 内部結合: INNER JOINは、両方のテーブルで結合条件が一致する行のみを返し、一致しない行は破棄します。
  • 🧩 使用と自然: JOIN USINGは共有する列を1つ指定しますが、NATURAL JOINは同じ名前の列を自動的にすべて照合します。
  • ↩️ 左外部結合: LEFT OUTER JOIN は、左テーブルのすべての行を保持し、右テーブルの一致しない列を NULL 値で埋めます。
  • ✖️ クロス結合: CROSS JOINは、左テーブルのすべての行と右テーブルのすべての行をペアにしたデカルト積を返します。
  • 🤖 AI 支援: AIテキストtoSQLツールとGitHub Copilotが生成する SQLite 平易な英語のプロンプトからJOINクエリを実行します。

SQLite 加入団体

SQLite さまざまなタイプのをサポートします SQL INNER JOIN、LEFT OUTER JOIN、CROSS JOIN などの結合。 このチュートリアルで説明するように、JOIN の各タイプは異なる状況に使用されます。

はじめに SQLite JOIN句

複数のテーブルを含むデータベースで作業している場合、多くの場合、これらの複数のテーブルからデータを取得する必要があります。

JOIN 句を使用すると、XNUMX つ以上のテーブルまたはサブクエリを結合してリンクできます。 また、どの列をどの条件でリンクする必要があるかを定義できます。

JOIN 句は次の構文でなければなりません。

SQLite JOIN 句の構文

各結合句には次のものが含まれます。

  • 左側のテーブルであるテーブルまたはサブクエリ。 join 句の前 (左側) のテーブルまたはサブクエリ。
  • JOIN 演算子 - 結合タイプ (INNER JOIN、LEFT OUTER JOIN、または CROSS JOIN のいずれか) を指定します。
  • JOIN 制約 – 結合するテーブルまたはサブクエリを指定した後、結合制約を指定する必要があります。結合制約は、結合タイプに応じて、その条件に一致する一致行が選択される条件となります。

以下のすべてについて、 SQLite JOIN テーブルの例では、sqlite3.exe を実行し、サンプル データベースへの接続を次のように開く必要があります。

ステップ1) この手順では、「マイコンピュータ」を開き、「C:\sqlite」ディレクトリに移動して、「sqlite3.exe」を開きます。

sqliteディレクトリからsqlite3.exeを開きます。

ステップ2) 以下のコマンドを使用して、「TutorialsSampleDB.db」データベースを開きます。

TutorialsSampleDBデータベースを開きます。

これで、データベースに対してあらゆる種類のクエリを実行する準備が整いました。

SQLite INNER JOINは

SQLite 内部結合ベン図

INNER JOINは、結合条件に一致する行のみを返し、結合条件に一致しない他のすべての行を削除します。

例:

次の例では、「Students」テーブルと「Departments」テーブルをDepartmentIdで結合し、各学生の所属部署名を取得します。手順は以下のとおりです。

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

コードの説明

INNER JOIN は次のように動作します。

  • Select 句では、XNUMX つの参照テーブルから選択したい列を選択できます。
  • INNER JOIN 句は、From 句で参照される最初のテーブルの後に記述されます。
  • 次に結合条件をONで指定します。
  • 参照されるテーブルには別名を指定できます。
  • INNER ワードはオプションで、単に JOIN と書くことができます。

出力

INNER JOINは、学生テーブルと学科テーブルの両方から、「Students.DepartmentId = Departments.DepartmentId」という条件に一致するレコードを生成します。一致しない行は無視され、結果には含まれません。

SQLite 内部結合の例の結果

そのため、IT、数学、物理学の各学科に所属する10名の学生のうち、このクエリでは8名のみが返されました。一方、「Jena」と「George」は、学科IDがnullであり、学科テーブルのdepartmentId列と一致しないため、含まれませんでした。以下に詳細を示します。

SQLite 一致する行を内部結合します

SQLite 参加…使用

INNER JOIN は、冗長性を避けるために「USING」句を使用して記述することができるため、「ON Students.DepartmentId =Departments.DepartmentId」と記述する代わりに、単に「USING(DepartmentID)」と記述することができます。

結合条件で比較する列が同じ名前である場合は常に、「JOIN .. USING」を使用できます。このような場合、on 条件を使用して繰り返す必要はなく、列名と列名を記述するだけで済みます。 SQLite それを検出します。

INNER JOIN と JOIN の違い...使用方法:

「JOIN … USING」では、結合条件を記述する必要はなく、結合する 2 つのテーブルに共通する結合列を記述するだけです。例えば、table1 “INNER JOIN table2 ON table1.cola = table2.cola” と記述する代わりに、table1 JOIN table2 USING(cola) と記述します。

例:

次の例では、「Students」テーブルと「Departments」テーブルをDepartmentIdで結合し、各学生の所属部署名を取得します。手順は以下のとおりです。

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments USING(DepartmentId);

説明

  • 前の例とは異なり、「ON Students.DepartmentId = Departments.DepartmentId」とは書きませんでした。単に「USING(DepartmentId)」と書きました。
  • SQLite 結合条件を自動的に推測し、両方のテーブル (Students と Departments) の DepartmentId を比較します。
  • この構文は、比較する XNUMX つの列が同じ名前である場合にはいつでも使用できます。

出力

これにより、前の例とまったく同じ結果が得られます。

SQLite JOIN USINGの例の結果

SQLite 自然結合

NATURAL JOIN は JOIN…USING に似ていますが、両方のテーブルに存在するすべての列の値が等しいかどうかを自動的にテストする点が異なります。

INNER JOIN と NATURAL JOIN の違い:

  • INNER JOINでは、2つのテーブルを結合するために使用する結合条件を指定する必要があります。一方、Natural JOINでは、結合条件を記述する必要はありません。条件を指定せずに2つのテーブル名を記述するだけです。すると、Natural JOINは両方のテーブルに存在するすべての列の値の等価性を自動的にテストします。Natural JOINは結合条件を自動的に推測します。
  • NATURAL JOIN では、両方のテーブルの同じ名前を持つすべての列が相互に照合されます。 たとえば、共通の XNUMX つの列名を持つ XNUMX つのテーブルがある場合 (XNUMX つのテーブルに同じ名前の XNUMX つの列が存在します)、自然結合では、一方の列の値だけでなく、両方の列の値を比較することによって XNUMX つのテーブルが結合されます。カラム。

例:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
Natural JOIN Departments;

説明

  • (INNER JOIN のように)列名を含む結合条件を記述する必要はありません。(JOIN USING のように)列名を一度も記述する必要すらありません。
  • 自然結合では、XNUMX つのテーブルの両方の列がスキャンされます。 この条件は、Students とDepartment という XNUMX つのテーブルの両方からのDepartmentId を比較することで構成されている必要があることが検出されます。

出力

NATURAL JOIN は、INNER JOIN および JOIN USING の例で得られた出力とまったく同じ出力を返します。これは、この例では 3 つのクエリがすべて同等であるためです。ただし、場合によっては、INNER JOIN と Natural JOIN の出力が異なる場合があります。たとえば、同じ名前のテーブルが複数ある場合、Natural JOIN はすべての列を相互に照合します。一方、INNER JOIN は結合条件内の列のみを照合します。

SQLite 自然結合の例の結果

SQLite 左外部結合

SQL標準では、外部結合にはLEFT、RIGHT、FULLの3種類が定義されていますが、 SQLite 自然な LEFT OUTER JOIN のみをサポートします。

LEFT OUTER JOINでは、左側のテーブルから選択した列のすべての値がクエリの結果に含まれるため、値が結合条件に一致するかどうかに関係なく、結果に含まれます。

左側のテーブルに「n」行ある場合、クエリの結果にも「n」行が含まれます。ただし、右側のテーブルから取得される列の値のうち、結合条件に一致しない値がある場合は、「null」値が含まれます。

したがって、左結合の行数と同じ行数が得られます。 これにより、両方のテーブルから一致する行 (INNER JOIN の結果など) と、左側のテーブルから一致しない行が取得されます。

例:

次の例では、「LEFT JOIN」を使用して 2 つのテーブル「Students」と「Departments」を結合してみます。

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students             -- this is the left table
LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

説明

  • SQLite LEFT JOIN 構文は INNER JOIN と同じです。 2 つのテーブル間に LEFT JOIN を記述すると、結合条件が ON 句の後に来ます。
  • from 句の後の最初のテーブルが左側のテーブルです。 一方、自然な LEFT JOIN の後に指定された XNUMX 番目のテーブルが右側のテーブルになります。
  • OUTER 句はオプションです。 LEFT の自然な OUTER JOIN は LEFT JOIN と同じです。

出力

ご覧のとおり、学生テーブルのすべての行(合計10名)が含まれています。4番目と最後の学生であるジェナとジョージの部署IDは、部署テーブルには存在しませんが、それでも含まれています。

そしてこれらの場合、部門テーブルに彼らの部門ID値に一致する部門名が存在しないため、ジェナとジョージの両方の部門名の値は「null」になります。

SQLite LEFT OUTER JOIN の例の結果

左結合を使用した前述のクエリについて、ベン図を用いてより詳細な説明をしてみましょう。

SQLite 左外側結合ベン図

LEFT JOIN では、学生の部署 ID が departments テーブルに存在しない場合でも、students テーブルからすべての学生名が取得されます。そのため、このクエリは INNER JOIN のように一致する行だけを返すのではなく、左側のテーブル(students テーブル)から一致しない行を含む余分な部分も返します。

一致する学部がない学生名は、学部名に「null」値を持つことに注意してください。これは、それに一致する値がなく、それらの値が一致しない行の値であるためです。

SQLite クロスジョイン

CROSS JOIN は、最初のテーブルのすべての値を XNUMX 番目のテーブルのすべての値と照合することにより、結合された XNUMX つのテーブルの選択された列のデカルト積を求めます。

したがって、最初のテーブルのすべての値について、XNUMX 番目のテーブルから「n」個の一致が得られます。ここで、n は XNUMX 番目のテーブルの行数です。

INNER JOINやLEFT OUTER JOINとは異なり、CROSS JOINでは結合条件を指定する必要はありません。 SQLite CROSS JOINには必要ありません。

その SQLite これは、最初のテーブルのすべての値と2番目のテーブルのすべての値を組み合わせることにより、論理的な結果セットを生成します。

例えば、最初のテーブルから列 (colA) を選択し、2番目のテーブルから別の列 (colB) を選択した場合を考えてみましょう。colA には 2 つの値 (1,2) が含まれており、colB にも 2 つの値 (3,4) が含まれています。

CROSS JOIN の結果は XNUMX 行になります。

  • ColA の最初の値 1 と、colB (3,4) の 1,3 つの値 (1,4)、(XNUMX) を組み合わせて XNUMX 行にします。
  • 同様に、colA の 2 番目の値 3,4 と colB (2,3) の 2,4 つの値 (XNUMX)、(XNUMX) を組み合わせて XNUMX つの行を作成します。

例:

次のクエリでは、Students テーブルと Departments テーブル間の CROSS JOIN を試みます。

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
CROSS JOIN Departments;

説明

  • SQLite 複数のテーブルから選択する場合は、students テーブルから「studentname」という 2 つの列を選択し、Departments テーブルから「DepartmentName」という 2 つの列を選択しただけです。
  • クロス結合の場合、結合条件は指定せず、2つのテーブルを中央でCROSS JOINを使って結合しました。

出力

ご覧のとおり、結果は 40 行で、学生テーブルの 10 個の値が部門テーブルの 4 つの部門と一致しています。次のようになります。

  • 学部テーブルの XNUMX つの学部の XNUMX つの値が、最初の学生のミシェルと一致しました。
  • 部門表の4つの部門の4つの値が、2番目の学生であるジョンと一致した。
  • 学科表の4つの学科の4つの値が3番目の学生ジャックと一致しました…以下同様です。

SQLite クロスジョインの例の結果

よくあるご質問

SQLite 2022年にリリースされたバージョン3.39.0で、RIGHT JOINとFULL OUTER JOINのサポートが追加されました。それ以前のビルドでは、スワップによってRIGHT JOINをエミュレートしていました。ping テーブルをLEFT JOINで結合し、2つのLEFT JOINをUNIONで結合してFULL OUTER JOINを作成します。

自己結合は、テーブルエイリアスを使用してテーブルを自身と結合します。つまり、一方のコピーが左側のテーブルとして、もう一方のコピーが右側のテーブルとして機能します。これは、従業員とマネージャーを照合するなど、同じテーブル内の行を比較する場合に役立ちます。

はい。複数の JOIN 句を単一の SELECT に連結し、それぞれに独自の ON または USING 条件を指定します。たとえば、FROM A JOIN B ON … JOIN C ON … のように記述します。 SQLite 左から右へテーブルを結合し、1つの結合結果セットを作成します。

JOIN だけを書くことは INNER JOIN と同じです SQLiteどちらも、ON条件またはUSING条件を満たす行のみを保持するため、一致しない行は削除されます。INNERキーワードは省略可能なので、JOINとINNER JOINは互換性があります。

結合条件で使用される列にインデックスを作成すると、 SQLite テーブル全体をスキャンせずに各行を照合することで、大規模データセットにおける結合処理の速度が向上します。外部キー列にインデックスを作成し、ANALYZEを実行して統計情報を更新することで、結合クエリのパフォーマンスがさらに向上します。

INNER JOINは、両方のテーブルで一致する行のみを返します。LEFT OUTER JOINは、左側のテーブルのすべての行に加えて、右側のテーブルで一致する行を返し、一致しない右側の列にはNULLを挿入します。したがって、LEFT JOINでは左側のテーブルの行が削除されることはありません。

はい。AIテキストtoSQLアシスタントは、平易な英語のリクエストを SQLite INNER JOIN、LEFT JOIN、NATURAL JOIN、および CROSS JOIN ステートメント。テーブル名、列名、およびリレーションシップを指定することで精度が向上します。生成されたすべての結合は、実際のデータで実行する前に確認およびテストする必要があります。

GitHubコパイロット 提案する SQLite 次のようなエディタでインラインJOINクエリ VS CodeINNER JOIN、LEFT JOIN、ON句またはUSING句の補完を行います。近くのスキーマとコメントを読み取るため、提案には実際のテーブル名と列名が再利用されます。