SQLShack (日本語)

データから何か意味のあるものを取得したい場合、ほとんどの場合、複数のテーブルを結合する必要があります。この記事では、さまざまなタイプの結合を使用してこれを行う方法を示します。これを実現するために、INNERJOINとLEFTJOINを組み合わせます。それでは、始めましょう。

モデル

下の図では、既存のモデルを確認できます。これは6つのテーブルで構成されており、以前の記事で多かれ少なかれ説明しました。

それでも、説明しなくても、データベースが適切にモデル化および表示されている場合(命名規則を使用して名前を賢く選択し、モデル全体で同じルールに従い、スキーマの行/関係が必要以上に重複しない)、次のことができるはずです。必要なデータがどこにあるかを結論付けます。複数のテーブルを結合する前に、最初にこれらのテーブルを識別する必要があるため、これは非常に重要です。

命名規則と、SQLクエリを作成するときの考え方に関するアドバイスについては後で説明します。シリーズ。これまでのところ、このモデルは非常に単純で、かなり簡単に実行できるという事実を踏まえてみましょう。

これまでに何を知っていますか?

このシリーズでは、対象:

  • SQL SELECTステートメントに関連する基本事項、および
  • INNERJOINとLEFTJOINの比較

知識を使用しますこれらの両方の記事から、これらを組み合わせて、複数のテーブルを結合するより複雑なSELECTステートメントを記述します。

INNERJOINを使用して複数のテーブルを結合します

分析する最初の例は、取得する方法です。内部結合のみを使用する複数のテーブルからのデータ。例ごとに、解決する必要のある問題の定義と、その仕事を実行するクエリについて説明します。それでは、最初の問題から始めましょう。

#1すべての通話を開始時刻と終了時刻とともに一覧表示する必要があります。呼び出しごとに、結果と、その呼び出しを行った従業員の名前と名前を表示します。開始時刻の昇順で呼び出しを並べ替えます。

クエリを作成する前に、使用する必要のあるテーブルを特定します。そのためには、必要なデータが含まれているテーブルを特定し、それらを含める必要があります。また、これらのテーブル間の途中にすべてのテーブルを含める必要があります。必要なデータは含まれていませんが、含まれているテーブル間の関係として機能するテーブルです(ここではそうではありません)。

ジョブを実行するクエリを以下に示します。

クエリの結果を以下に示します。

ここで指摘したいことがいくつかあります:

  • データが含まれているため、結合したテーブルはここにあります必要なのはこれらの3つのテーブルにあります
  • テーブルの属性について言及するたびに、table_name.attribute_nameの形式(employee.first_nameなど)を使用しています。これは必須ではありませんが、同じクエリ内の2つ以上のテーブルが同じ属性名を使用し、エラーが発生する場合があるため、これは良い習慣です。
  • INNERJOINを順番に2回使用しました。 3つのテーブルを結合します。これにより、別のテーブルにペアを持つ行のみが返されます。
  • INNER JOINのみを使用して複数のテーブルを結合する場合、結合におけるこれらのテーブルの順序は重要ではありません。唯一重要なことは、「オン」の後に適切な結合条件を使用することです(外部キーを使用して結合します)

すべての呼び出しには関連する従業員と呼び出しの結果があるため、次の場合に同じ結果が得られます。 INNERJOINの代わりにLEFTJOINを使用しました。

LEFTJOINを使用して複数のテーブルを結合する

LEFT JOINを使用するクエリの記述は、を使用するクエリの記述と比べて大きな違いはありません。内部結合。もちろん、結果は異なります(少なくとも、一部のレコードに他のテーブルにペアがない場合)。

これが解決したい問題です。

#2これらの国に関連するすべての郡と顧客を一覧表示します。国ごとに名前を英語で表示し、都市の顧客の名前とその顧客の名前を表示します。関連する都市のない国でも返送し、

必要なデータを含むテーブルを次の図に示します。

まず、続きをすばやく確認するこれら3つのテーブルのエントリ。

2つの重要な点に気付くことができます。

  • 各都市には関連する国がありますが、すべての国に関連する都市があるわけではありません(スペイン&ロシアには関連する都市がありません)
  • 同じことが顧客を表します。各顧客にはcity_id値が定義されていますが、使用されているのは3つの都市のみです(ベルリン、ザグレブ&ニューヨーク)

最初にINNER JOINを使用したクエリ:

クエリ結果を次の図に示します。

次のようになります。データベースには7つの郡と6つの都市がありますが、クエリは4行しか返しません。これは、データベースに4人の顧客しかないという事実の結果です。これら4つのそれぞれはその都市に関連しており、都市は国に関連しています。したがって、INNER JOINは、顧客のいないこれらすべての国と都市を排除しました。しかし、これらも結果に含めるにはどうすればよいですか?

そのために、LEFTJOINを使用します。すべての「INNER」を「LEFT」に置き換えるだけなので、クエリは次のようになります。

結果を次の図に示します。

関連する都市がない国(ロシア&スペイン)も含め、すべての国が存在することに簡単に気付くでしょう。都市、顧客のいない都市(ワルシャワ、ベオグラード&ロサンゼルス)。残りの4行は、INNERJOINを使用したクエリと同じです。

LEFT JOIN –テーブルの順序が重要です

INNER JOINのJOINの順序は重要ではありませんが、同じです。 LEFTJOINの略ではありません。複数のテーブルを結合するためにLEFTJOINを使用する場合、この結合にはJOINの左側にあるテーブルのすべての行が含まれることに注意してください。前のクエリを並べ替えてみましょう。

最初は、このクエリと前のクエリは同じであると簡単に言うことができます(これは、INNER JOINを使用する場合に当てはまります)。同じテーブル、LEFT JOIN、および同じ結合条件を使用しました。最初に出力を見てみましょう:

では、ここで何が起こったのでしょうか。なぜ4行あるのですか(INNER JOINを使用したときと同じ4行)?

答えは簡単で、LEFTJOINの動作に関連しています。最初のテーブル(顧客)を取得し、そのすべての行(4つ)を次のテーブル(都市)に結合します。顧客は1つの都市にしか所属できないため、この結果は4行になります。次に、これらの4行を次のテーブル(国)に結合します。都市は1つの国にしか属さないため、ここでも4行になります。

この3つのテーブルを結合しない理由方法は例2のテキストで示されています。クエリは、4行を返すように記述されているため、次の答えが返されます。すべての顧客の名前と、それらが存在する都市と国を返します。関連する都市と国がない顧客も返します。

  • 注:LEFT JOINを使用している場合、そのステートメント内のテーブルの順序は重要であり、この順序を変更すると、クエリは異なる結果を返します。順序は、実際には結果として返すものによって異なります。

両方を使用して複数のテーブルを結合します– INNER JOIN & LEFT JOIN

これも可能です。もう一度例を見てみましょう。

#3ペアを持つすべての国と都市のリストを返します(どの都市からも参照されていない国を除く)。そのようなペアのためにすべての顧客を返します。顧客が1人もいないペアも返します。

ジョブを実行するクエリは次のとおりです。

クエリの結果を次の図に示します。

関連する都市がない国がないことに簡単に気付くでしょう(これらはスペイン&ロシア)。 INNER JOINは、これらの行を削除しました。それでも、顧客のいない引用はあります(ベオグラード、ロサンゼルス&ワルシャワ)。これは、テーブルcityとcustomerの間でLEFTJOINを使用した結果です。

結論

複数のテーブルを結合する必要がある場合は、INNER LEFT JOINを自由に使用できます(RIGHT JOINはめったに使用されず、LEFT JOINに簡単に置き換えることができます)。どの結合を使用するかは、解決する必要のあるタスクに直接依存し、途中で感覚をつかむことができます。今後の記事では、より複雑なクエリを作成する必要がある場合に、自分で考えて整理する方法について説明します。

目次

SQLの学習:CREATE DATABASE & CREATETABLE操作

SQLの学習:INSERT INTO TABLE

SQLの学習:プライマリキー

SQLの学習:外部キー

SQLの学習:SELECTステートメント

SQLの学習:内部結合と左結合

SQLの学習:SQLスクリプト

SQLの学習:関係の種類

SQLの学習:複数のテーブルの結合

SQLの学習:関数の集約

SQLの学習:複雑なSELECTの記述方法クエリ

SQLの学習:INFORMATION_SCHEMAデータベース

SQLの学習:SQLデータタイプ

SQLの学習:理論の設定

SQLの学習:ユーザー定義関数

SQLの学習:ユーザー定義のストアドプロシージャ

SQLの学習:SQLビュー

SQLの学習:SQLトリガー

SQLの学習:SQLクエリの練習

SQLの学習:SQLクエリの例

SQLの学習:SQLクエリを使用して手動でレポートを作成します

SQLの学習: SQLServerの日付と時刻の関数

SQLの学習:日付と時刻の関数を使用してSQLServerレポートを作成する

SQLの学習:SQLServerピボットテーブル

SQLの学習:SQLServerのExcelへのエクスポート

SQLの学習:SQLServerループの概要

SQLの学習:SQLServerカーソル

SQLの学習:データを削除および更新するためのSQLのベストプラクティス

SQLの学習:命名規則

SQLの学習:SQL関連のジョブ

SQLの学習:SQLServerでの非等価結合

SQLの学習:SQLインジェクション

  • 作成者
  • 最近の投稿
Emilは、データベースに関連するすべての分野で10年以上の経験を持つデータベースプロフェッショナルです。 。何年もの間、彼はITおよび金融業界で働き、現在はフリーランサーとして働いています。
彼の過去と現在の取り組みは、データベースの設計とコーディングから、データベースに関する教育、コンサルティング、執筆までさまざまです。また、BI、アルゴリズムの作成、チェス、フィラテリー、犬2匹、猫2匹、妻1匹、赤ちゃん1匹…
LinkedInで彼を見つけることができます
EmilDrkusicによる投稿をすべて表示

Emil Drkusicによる最新の投稿(すべて表示)
  • SQLの学習:SQLインジェクション-2020年11月2日
  • SQLの学習:SQLServerでの非等価結合-2020年9月29日
  • SQLの学習: SQL関連のジョブ-2020年9月1日

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です