データベースマルチテーブル接続クエリの実装方法の詳細説明

データベースマルチテーブル接続クエリの実装方法の詳細説明

データベースマルチテーブル接続クエリの実装方法の詳細説明

結合演算子を使用して複数のテーブルクエリを実装できます。接続はリレーショナル データベース モデルの主な機能であり、他の種類のデータベース管理システムと区別する特徴でもあります。

リレーショナル データベース管理システムでは、テーブルの作成時にデータ間の関係を決定する必要はなく、エンティティのすべての情報が 1 つのテーブルに格納されることがよくあります。データを取得する場合、複数のテーブルに格納されているさまざまなエンティティに関する情報が結合操作を通じて照会されます。結合操作により、ユーザーは大きな柔軟性を得ることができ、いつでも新しいデータ型を追加できます。異なるエンティティに対して新しいテーブルを作成し、後で結合を通じてクエリを実行します。

結合は、SELECT ステートメントの FROM 句または WHERE 句のいずれかで確立できます。結合操作を WHERE 句の検索条件と区別するために、FROM 句で結合を指定すると便利です。したがって、Transact-SQL ではこの方法が推奨されます。

SQL-92 標準で定義されている FROM 句の結合構文は次のとおりです。

join_table から join_type join_table 

[ON (結合条件)] 

join_table は、結合操作に関係するテーブルの名前を示します。結合は同じテーブルまたは複数のテーブルで実行できます。同じテーブルでの結合は、自己結合とも呼ばれます。

join_type は結合タイプを示し、内部結合、外部結合、クロス結合の 3 つのタイプに分けられます。 INNER JOIN は比較演算子を使用してテーブル間の特定のデータ列を比較し、接続条件に一致するこれらのテーブル内のデータ行を一覧表示します。使用される比較方法に応じて、内部結合は、等結合、自然結合、不等結合の 3 つのタイプに分けられます。

外部結合には、左外部結合 (LEFT OUTER JOIN または LEFT JOIN)、右外部結合 (RIGHT OUTER JOIN または RIGHT JOIN)、完全外部結合 (FULL OUTER JOIN または FULL JOIN) の 3 種類があります。内部結合とは異なり、外部結合では結合条件に一致する行がリストされるだけでなく、左側のテーブル (左外部結合)、右側のテーブル (右外部結合)、または両方のテーブル (完全外部結合) 内の検索条件を満たすすべてのデータ行もリストされます。

クロス結合 (CROSS JOIN) には WHERE 句がありません。結合されたテーブルのすべての行の直積を返します。結果セットの行数は、クエリ条件を満たす最初のテーブルの行数と、クエリ条件を満たす 2 番目のテーブルの行数を掛け合わせた数に等しくなります。

結合操作の ON (join_condition) 句は、結合されたテーブル内の列と比較演算子、論理演算子などで構成される結合条件を示します。
どのような接続であっても、text、ntext、image データ型の列に直接接続することはできませんが、これら 3 つの列を間接的に接続することはできます。

(I) 内部結合

内部結合クエリ操作では、結合条件に一致するデータ行がリストされ、比較演算子を使用して結合された列の列値を比較します。内部結合には 3 つの種類があります。

1. 等価結合: 結合条件で等号 (=) 演算子を使用して、結合された列の列値を比較します。クエリ結果には、重複する列を含む、結合されたテーブル内のすべての列がリストされます。

2. 不等結合:結合条件で等価演算子以外の比較演算子を使用して、結合する列の列値を比較します。これらの演算子には、>、>=、<=、<、!>、!<、<> が含まれます。

3. 自然接続: 接続条件では等号 (=) 演算子を使用して接続された列の列値を比較しますが、選択リストを使用してクエリ結果セットに含まれる列を示し、接続されたテーブル内の重複する列を削除します。

たとえば、次の例では、等価結合を使用して、authors テーブルとpublishers テーブルに同じ都市の著者と出版社をリストします。

選択* 

著者から内部結合出版社からp 

ON a.city=p.city 

もう 1 つの例として、自然結合を使用して、選択リストの authors テーブルとpublishers テーブルから重複する列 (city と state) を削除します。

a.*、p.pub_id、p.pub_name、p.countryを選択します。 

著者から内部結合出版社からp 

ON a.city=p.city

(ii)外部接続

内部結合の場合、クエリ条件 (WHERE 検索条件または HAVING 条件) と接続条件を満たす行のみがクエリ結果セットに返されます。外部結合を使用すると、返されるクエリ結果セットには、結合条件を満たす行だけでなく、左側のテーブル (左外部結合)、右側のテーブル (右外部結合)、または 2 つのエッジ テーブル (完全外部結合) のすべてのデータ行も含まれます。

外部結合は、左外部結合、右外部結合、または完全外部結合のいずれかになります。

FROM 句で外部結合を指定する場合、次のキーワード セットのいずれかで指定できます: LEFT JOIN または LEFT OUTER JOIN、RIGHT JOIN または RIGHT OUTER JOIN、FULL JOIN または FULL OUTER JOIN。

(1)左外部結合:左外部結合の結果セットには、結合列が一致する行だけでなく、LEFT OUTER句で指定された左側のテーブルのすべての行が含まれます。左側の表の行が右側の表に一致する行を持たない場合、右側の表のすべての選択リスト列には、関連付けられた結果セット行の NULL 値が設定されます。

(2)右外部結合:右外部結合は左外部結合の逆結合です。右側のテーブルのすべての行を返します。右側のテーブルの行が左側のテーブルに一致する行を持たない場合、左側のテーブルには null 値が返されます。

(3)完全外部結合:完全外部結合は、左側のテーブルと右側のテーブルの両方からすべての行を返します。行が他のテーブルに一致する行を持たない場合、他のテーブルの選択リストの列には NULL 値が含まれます。テーブル間に一致する行がある場合、結果セットの行全体には基本テーブルのデータ値が含まれます。

内部結合では、両方のテーブルの少なくとも 1 つの行が結合条件を満たす場合にのみ行が返されます。内部結合では、他のテーブルのどの行とも一致しない行が除外されます。外部結合は、FROM 句で指定されたテーブルまたはビューの少なくとも 1 つから、WHERE または HAVING 検索条件のいずれかを満たすすべての行を返します。左外部結合によって参照される左側のテーブルのすべての行と、右外部結合によって参照される右側のテーブルのすべての行が取得されます。完全外部結合の両方のテーブルのすべての行が返されます。

以下に示すように、左外部結合を使用してフォーラムのコンテンツと作成者情報を接続します。

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 

ON a.ユーザー名=b.ユーザー名 

次の例では、完全外部結合を使用して、city テーブル内のすべての著者と、user テーブル内のすべての著者およびその都市を結合します。

a.*、b.*を選択します。 

FULL OUTER JOIN として city からユーザー b へ 

ON a.ユーザー名=b.ユーザー名

(III)クロスコネクション

WHERE 句のないクロス結合では、結合される 2 つのテーブルのすべての行の直積が返されます。結果セットで返される行数は、クエリ条件を満たす最初のテーブルの行数と、クエリ条件を満たす 2 番目のテーブルの行数を掛け合わせた数に等しくなります。

たとえば、titles テーブルには 6 つの書籍カテゴリがあり、publishers テーブルには 8 つの出版社があります。次のクロス結合によって取得されるレコードの数は、6 * 8 = 48 行になります。

SELECTタイプ、pub_name 

タイトルからCROSS JOIN出版社 

ORDER BY タイプ


ご質問がございましたら、メッセージを残すか、コミュニティで議論してください。この記事がお役に立てば幸いです。ご協力ありがとうございます!

以下もご興味があるかもしれません:
  • asp.net で実装された MVC クロスデータベース マルチテーブル ジョイント動的条件クエリ関数の例
  • 異なるデータベース サーバー上の SQL Server マルチ テーブル クエリ テーブル

<<:  React Fiber構造の作成手順

>>:  英語の単語の出現頻度を数えるtrコマンドの魔法

推薦する

MySQL 文字列分割の例 (区切り文字なしの文字列抽出)

区切り文字なしの文字列抽出質問の要件データベース内のフィールド値:実装効果: 1行のデータを複数行に...

MySQL のソートとページング (order by と limit) と既存の落とし穴

並べ替えクエリ (order by)電子商取引の場合: 今日完了したすべての注文を表示し、取引金額に...

MySQL ページングの制限パラメータの簡単な例

Mysqlページングの2つのパラメータ ユーザー制限 1,2 から * を選択 1 は検索する最初の...

HTTPS の有効化に関する経験の共有

国内のネットワーク環境が悪化し続ける中、さまざまな改ざんや乗っ取りが後を絶たず、サイト全体をHTTP...

WangEditor リッチ テキスト コンポーネントを Angular でカプセル化する方法

リッチ テキスト コンポーネントは、Web プログラムで、特にブログやフォーラムなどの Web サイ...

PCとモバイルの適応の問題に対する迅速な解決策

Web ページを作成する場合、通常、コンピューターの画面サイズと携帯電話の画面サイズの違いなどの問題...

Webデザインチュートリアル(7):Webデザインの効率化

<br />前の記事:Webデザインチュートリアル(6):デザインへの情熱を持ち続けまし...

IDEA2021 tomcat10 サーブレットの新しいバージョンの落とし穴

私が学習していたときに使用していたバージョンは比較的新しいものであり、インターネット上のチュートリア...

JSベースの手持ち連射機能+テキスト揺れ特殊効果コードの簡単実装

少し前にTikTokで揺れる連打が流行っていたので真似してみることにしました。さっそく効果をみてみま...

hasLayout によって発生する CSS バグの一覧

IE には長い間問題がありました。誰もがテストを受けたとき、誰もが笑顔でしたが、それはただのニヤニヤ...

CSS チュートリアル: CSS 属性メディア タイプ

スタイルシートの最も重要な機能の 1 つは、ページ、画面、電子シンセサイザーなどの複数のメディアに適...

フレックスレイアウトの改行スペースでの align-content の使用

1. この記事で実装した効果図は以下のとおりです。レイアウトの右側に Flex レイアウトを使用し、...

MySQL 検査スクリプト (必読)

以下のように表示されます。 #!/usr/bin/env python3.5 psutilをインポー...

Baota LinuxパネルにFTP接続できない問題の解決方法の詳細な説明

Alibaba Cloud Server を使用している場合は、セキュリティ グループ設定でポート ...

MySQL で誕生日から年齢を計算する複数の方法

以前はMySQLをあまり使用していなかったため、MySQLの機能にあまり詳しくありませんでした。この...