内部結合と左結合、つまり質問。今日は、これら2つの結合タイプの両方がどのように使用されるか、およびその違いについて簡単に説明します。後でモデルを拡張して、はるかに複雑なクエリを記述できるようになるときに、このトピックについてもう一度説明します。
データの変更
INNERJOINと比較する前にLEFT JOIN、私たちが現在知っていることを見てみましょう。これまでのところ、このシリーズでは、データベースとテーブルの作成方法、テーブルにデータを入力する方法、簡単なクエリを使用してテーブルに格納されているものを確認する方法など、データベースの基本について説明してきました。前回の記事では、2つのテーブルを結合しました。これで、次のステップの準備が整いました。
ただし、次に進む前に、に小さな変更を1つだけ加えましょう。私たちのデータ。次のINSERTINTOコマンドを使用して、countryテーブルに2行を追加します。
次に、両方のテーブルの内容を確認します。
テーブルの国に2つの新しい行があり、1つはスペイン用、もう1つはロシア用であることが簡単にわかります。それらのIDは6と7です。また、cityテーブルには、値6または7のcountry_idがないことに注意してください。これは、データベースにロシアまたはスペインの都市がないことを意味します。この事実は後で使用します。
内部結合
次の2つのクエリについて説明します。
返される結果は、次の図に示されています。
両方のクエリはまったく同じ結果を返します。これは偶然ではなく、2つの異なる方法で記述された同じクエリであるという事実の結果です。どちらの方法も正しく、どちらでも使用できます。
最初のクエリでは、クエリのFROM部分(FROMの国、都市)で使用するすべてのテーブルを一覧表示してから、結合しました。クエリのWHERE部分の条件(WHERE city.country_id = country.id)。この結合条件を書き留めるのを忘れた場合、両方のテーブルの直積が得られます。
2番目のクエリでは、クエリのFROM部分(FROM国)にテーブルが1つだけあります。次に、クエリのJOIN部分に2番目のテーブルとJOIN条件があります(INNER JOIN city ON city.country_id = country.id)。
どちらのクエリも適切に記述されていますが、次のことをお勧めします。テーブルを一覧表示してクエリのWHERE部分で結合する代わりに、常にINNERJOINを使用します。これにはいくつかの理由があります。
- 使用されるテーブルと関連するJOIN条件が同じであるため、読みやすさが大幅に向上します。ライン。 JOIN条件を省略したかどうかを簡単に確認できます
- 後で他のJOIN(LEFTまたはRIGHT)を使用する場合は、以前にINNER JOINを使用したことがない限り、(簡単に)それを行うことはできません。
次に、実際に返されたクエリについてコメントしましょう。
- (外部キーを介して)関連する国と都市のすべてのペア
- 都市テーブルに関連する都市がないため、リストに2つの国(スペインとロシア)はありません。
左結合
これを繰り返します–「都市テーブルに関連する都市がないため、リストに2つの国(スペインとロシア)はありません」。これは、INNERJOINとLEFTJOINを比較するときに重要であることがわかります。
場合によっては、これらのレコードも結果に含めたいことがあります。たとえば、これらの国の別のテーブルに関連するレコードがないことを結果で確認したいだけです。これは、何らかの制御の一部である場合もあれば、単にケースを数える場合などもあります。その欲求の背後にある動機が何であれ、技術的にそれを行うことができるはずです。そして、私たちはそうです。データベースでは、LEFTJOINはまさにそれを実行します。
LEFT JOINの結果は、INNER JOINの結果と同じになります+「左」テーブルの行があり、ペアはありません。 「右」の表。同じINNERJOINクエリを使用し、INNERという単語をLEFTに置き換えます。結果は次のとおりです。
INNERの結果と比較して、行が2つ多いことが簡単にわかります。 JOINクエリ。これらはロシアとスペインの行です。どちらにも関連する都市がないため、これら2つの行のすべての都市属性にはNULL値があります(定義されていません)。これが、内部結合と左結合を比較する場合の最大の違いです。
右結合
少なくとも右結合については耳にします。 LEFT JOINと同じ結果を返すため、ほとんど使用されません。一方、LEFT JOINを使用するクエリは、テーブルを次々に一覧表示するだけなので、はるかに読みやすくなります。
これは、RIGHTJOINを使用する前のクエリと同等です。
戻り値が同じであることがわかります。この場合のみ、cityテーブルの値が最初の5列にあり、country-関連する値はそれらの後にあります。
INNER JOIN vs LEFT JOIN
INNER JOIN vs LEFT JOIN?実際、それはまったく問題ではありません。両側にペアがあるレコードのみを返す場合はINNERJOINを使用し、「右」テーブルにペアがあるかどうかに関係なく、「左」テーブルのすべてのレコードが必要な場合はLEFTJOINを使用します。か否か。ペアがあるかどうかに関係なく、両方のテーブルのすべてのレコードが必要な場合は、CROSS JOINを使用する(またはLEFT JOINとUNIONを使用してシミュレートする)必要があります。これについては、今後の記事で詳しく説明します。
目次
SQLの学習:CREATE DATABASE & CREATETABLE操作
SQLの学習:テーブルへの挿入
SQLの学習:プライマリキー
SQLの学習:外部キー
SQLの学習:SELECTステートメント
SQLの学習:INNERJOINとLEFTJOIN
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インジェクション
- 作成者
- 最近の投稿
彼の過去と現在の取り組みは、データベースの設計とコーディングから、データベースに関する教育、コンサルティング、執筆までさまざまです。また、BI、アルゴリズムの作成、チェス、慈悲深い、犬2匹、猫2匹、妻1匹、赤ちゃん1匹…
LinkedInで彼を見つけることができます
EmilDrkusicによる投稿をすべて表示
- SQLの学習:SQLインジェクション-2020年11月2日
- SQLの学習:SQLServerでの非等価結合-2020年9月29日
- SQLの学習: SQL関連のジョブ-2020年9月1日