MySQL データベースの詳細な説明 - 複数テーブル クエリ - 内部結合、外部結合、サブクエリ、相関サブクエリ

MySQL データベースの詳細な説明 - 複数テーブル クエリ - 内部結合、外部結合、サブクエリ、相関サブクエリ

複数テーブルクエリ

複数のテーブルから関連するクエリ結果を取得するには、単一の SELECT ステートメントを使用します。通常、複数テーブルの結合は、相互関係を持つ親子テーブルで確立されます。

1 クロスコネクト

最初のテーブルのすべての行と 2 番目のテーブルのすべての行を乗算した直積により、消費者と顧客のテーブルが作成されます。
コードは次のとおりです。

-- テーブル customers を作成します(
--id int 主キー auto_increment,
-- 名前 VARCHAR(20) が null ではない、
--address VARCHAR(20) NULLではない
--);
-- テーブルordersを作成する(
--order_namre VARCHAR(20) 主キー、
-- num char(20) がNULLではない、
--price int が null ではない、
-- 顧客ID int,
-- 制約 cus_ord_fk 外部キー(customers_id) 参照 customers(id)
-- )
自分でデータを挿入するだけです。
文法:

暗黙の構文 (キーワードを使用しない): select * from customers,orders;

結果は次のとおりです。

明示的な構文 (キーワードを使用): select * from customers c INNER JOIN orders o ON c.id=o.customer_id;

2 つの実行結果は同じですが、直交積が間違っています。次の方法を使用して修正できます。

2 内部結合

クロス結合によって取得された結果セットが間違っているためです。したがって、内部結合はクロス結合に基づいており、接続条件に一致する接続テーブル内のデータ行のみがリストされます。一致しないレコードはリストされません。

文法:

暗黙の構文:

customers.id=orders.customers_id の場合、customers、orders から * を選択します。

明示的な構文:

customers c から * を選択し、 INNER JOIN orders o ON c.id=o.customer_id;

結果は以下のとおりです

プログラムにエイリアスを付けることもできます:
コードは次のとおりです。

c.id=o.customers_id で、 customers から c,orders o として * を選択します。
SELECT * from customers as c inner join orders o on c.id=o.customers_id;

3 外部結合

内部接続には、製品を購入したすべてのユーザーの情報のみがリストされ、製品を購入していないユーザーはリストされません。
外部リンクは、1 つのテーブルをベース テーブルとして使用し、他のテーブルの情報をスプライスします。存在する場合はスプライスされます。存在しない場合は null が表示されます。外部リンクは、左外部結合と右下結合に分かれています。
左外部結合: キーワードの左側のテーブルをベーステーブルとして結合します

文法:

customers c から * を選択します。LEFT JOIN orders o ON c.id=o.customer_id; 

右外部結合: キーワードの右側のテーブルがベーステーブルです

文法:

orders o から * を選択します。RIGHT JOIN customers c ON c.id=o.customer_id; 

4 サブクエリ

クエリを実行する際に、別の選択ステートメントの結果が条件として必要な場合があります。このとき、サブクエリが使用されます。メインクエリ (外部クエリ) にデータを提供するために最初に実行されるクエリ (内部クエリ) をサブクエリと呼びます。サブクエリは、ネストされたサブクエリと相関サブクエリに分けられます。

ネストされたサブクエリ:

内部クエリの実行は外部クエリとは独立しています。内部クエリは 1 回だけ実行され、実行完了後にその結果が外部クエリの条件として使用されます (ネストされたサブクエリ内のサブクエリ ステートメントを取り出して個別に実行できます)。

文法と演習: ID 1 の教師が指導するすべての生徒を照会します。

id が 1 である students から * を選択します (teacher_student から s_id を選択し、 t_id=1 である teacher_student から s_id を選択します);

相関サブクエリ:

内部クエリの実行は外部クエリのデータに依存します。外部クエリが実行されるたびに、内部クエリも実行されます。毎回、最初に外部クエリが実行され、外部クエリ テーブル内のタプルが取り出され、現在のタプル内のデータが内部クエリに渡され、次に内部クエリが実行されます。内部クエリの実行結果に基づいて、現在のタプルが外部クエリの where 条件を満たしているかどうかを判断します。満たしている場合、現在のタプルは要件を満たすレコードであり、満たしていない場合は要件を満たしていません。その後、外部クエリは次のタプル データの取得を継続し、すべてのタプルが処理されるまで上記の操作を実行します。
3 つのテーブルを作成します。演習 1. ID 1 の教師が指導するすべての生徒を照会します。
– 教師用テーブルを作成する

テーブルteacher1を作成(
id int 主キー auto_increment,
名前char(20)がNULLではない、
件名char(20)がnullでない
); 

– 生徒テーブルを作成する

テーブルstudent1を作成(
id int 主キー auto_increment,
名前 char(20) 一意 null ではない、
年齢 int null
); 

– 3番目のテーブルを作成する

テーブル tea_stu を作成します(
id int 主キー、
名前 char(20)、
t_id 整数、
s_id 整数、
スコア int が null ではない、
制約teacher1_id_fk外部キー(t_id)はteacher1(id)を参照します。
制約 student_id_fk 外部キー(s_id) は student1(id) を参照します。
);

演習 1. ID 1 の教師が指導するすべての生徒を照会します。

方法 1: 別々の方法で書き出す:

t_id=1 の場合、tea_stu から s_id を選択します。
idが(2,3)であるstudent1から*を選択します。

方法2:

id が 1 である student1 から * を選択します (t_id=1 である tea_stu から s_id を選択)。 

相関サブクエリ:

内部クエリの実行は外部クエリのデータに依存します。外部クエリが実行されるたびに、内部クエリも実行されます。毎回、最初に外部クエリが実行され、外部クエリ テーブル内のタプルが取り出され、現在のタプル内のデータが内部クエリに渡され、次に内部クエリが実行されます。内部クエリの実行結果に基づいて、現在のタプルが外部クエリの where 条件を満たしているかどうかを判断します。満たしている場合、現在のタプルは要件を満たすレコードであり、満たしていない場合は要件を満たしていません。その後、外部クエリは次のタプル データの取得を継続し、すべてのタプルが処理されるまで上記の操作を実行します。
検索: 各科目のテストのスコアが平均スコアよりも高い生徒のスコア。

tea_stu から * を a として選択します。ここで、a.score>(tea_stu から avg(b.score) を b として選択します。ここで、a.s_id=b.s_id); 

上記は、編集者が紹介したMySQLマルチテーブルクエリの詳細な統合です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。編集者がすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • SqlクエリMySqlデータベーステーブル名と説明テーブルフィールド(列)情報
  • MySQL データベース SELECT クエリ式分析
  • MySQL データベースの高度なクエリとマルチテーブルクエリ
  • Mysql データベース テーブルのインデックスによってクエリ速度が向上しないのはなぜですか?
  • MySQL データベース クエリの高度なマルチテーブル クエリの詳細な説明
  • MySQL データベース テーブルにインデックスがあるにもかかわらず、クエリが遅いのはなぜですか?

<<:  Zabbix redis 自動ポート検出スクリプトは json 形式を返します

>>:  Vue3 における ref と reactive の詳細な説明と拡張

推薦する

ミニマルなウェブサイトデザインの例

Web アプリケーション クラス1. みんなのためにダウンまたは私だけのためにこのウェブサイトは、ウ...

MySQL で最大接続数を設定するためのヒントのまとめ

方法1: コマンドラインの変更次の図に示すように、MySQL コンソールを開いて「set GLOBA...

HTMLの基本構文は、HTMLを学び始めたばかりの人にとって便利です。

1.1 一般的なマーキング一般的なタグは開始タグと終了タグで構成されます。構文は次のとおりです: ...

mysql 簡単な操作例を表示

この記事では、例を挙げて mysql show 操作について説明します。ご参考までに、詳細は以下の通...

Linux (CentOS7) に Tomcat をインストールし、Tomcat をスタートアップ項目として設定します (tomcat8 を例に挙げます)

目次TomcatをインストールするTomcat 圧縮パッケージをダウンロードTomcatには3つの主...

Vue3 AST パーサー - ソースコード分析

目次1. AST抽象構文木を生成する2. ASTのルートノードを作成する3. 子ノードの解析4. テ...

MySQL データベースの show processlist コマンドの使用の分析

実際のプロジェクト開発では、多数のクエリや挿入、特にマルチスレッド挿入など、データベースに大きな負荷...

MySQL における主キーが 0 であることと主キーの自己選択制約の関係についての詳しい説明 (詳細)

序文この記事は主にMySQLの主キー0と主キー自己排除制約の関係を紹介し、皆さんの参考と学習のために...

この記事ではCSSの組み合わせセレクターの使い方を説明します

CSS 組み合わせセレクターには、単純なセレクターのさまざまな組み合わせが含まれます。 CSS3 に...

Power Shell に vim 実装コード例を追加する方法

1. Vimの公式ウェブサイトにアクセスして、オペレーティングシステムに適した実行ファイルをダウンロ...

Linux で ping は成功するがポートが利用できない問題を解決する方法

ping は成功したがポートにアクセスできない場合のポート可用性検出の説明ポート可用性検出ツールの紹...

CSS で縦書きテキスト配置を実装する方法 (概要)

HTML でのテキストのデフォルトの配置は水平ですが、特殊な場合にはテキストを垂直に配置する必要が...

MySQL の FIND_IN_SET() と IN の違いを簡単に分析します

以前、あるプロジェクトでMysql FIND_IN_SET関数を使用したことがありますが、非常に便利...

Mysql の使用法の概要

導入EXISTS は、サブクエリが少なくとも 1 行のデータを返すかどうかを確認するために使用されま...

親コンテナの CSS 均等分割 (完全三分の一) の実装

親コンテナの幅は固定されています。子要素が親の幅を均等に分割するには、どのような方法がありますか?コ...