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 の詳細な説明と拡張

推薦する

nginx を使用して wgcloud へのアクセスを構成する方法

nginx の設定は次のとおりです。 http://172.17.188.27/wgcloud など...

無効と読み取り専用で入力を読み取り専用に設定する

読み取り専用入力を実現するには、無効と読み取り専用の 2 つの方法があります。当然、どちらの結果も読...

html+css3で実装されたログインインターフェース

成果を達成するまずHTMLを使って基本的なフレームワークを構築します <本文> <...

MySQL ステートメントロックの実装の分析

概要: 2 つの MySQL SQL ステートメント ロックの分析次のSQL文にどのようなロックが追...

TomcatはXMLを解析し、リフレクションを通じてオブジェクトを作成します。

次のサンプル コードでは、Tomcat が XML を解析し、リフレクションを通じてオブジェクトを作...

Centos7 での nginx のインストールと設定に関する詳細なチュートリアル

注: ソフトウェアのインストールの基本ディレクトリ パスは /usr/local です。ソフトウェア...

入力ボックスのプレースホルダーアニメーションと入力検証を実現する純粋なCSS

さらに興味深いコンテンツについては、https://github.com/abc-club/free...

Linux に Python クローラー スクリプトを展開し、スケジュールされたタスクを設定する方法

昨年、プロジェクトの必要性により、Python でクローラーを作成しました。クロールされたデータは、...

Docker デプロイメント Springboot プロジェクト例の分析

この記事は主に、docker デプロイメント springboot プロジェクトのサンプル分析を紹介...

JavaScript で配列の変更を監視する方法

序文以前、defineProperty を紹介したとき、オブジェクトの変更のみを監視でき、配列の変更...

Vue3 Vue CLI マルチ環境設定

目次1. はじめに2. 切り替え1. 開発および本番環境の設定ファイルを追加する2. 複数の環境をサ...

MySQL SQL ステートメントのパフォーマンス チューニングの簡単な例

MySQL SQL ステートメントのパフォーマンス チューニングの簡単な例サーバー開発を行う際には、...

nginx 設定チュートリアルにおける add_header の落とし穴の詳細な説明

序文add_header は、headers モジュールで定義されたディレクティブです。名前が示すよ...

MySQLをインストールして設定し、ルートパスワードを変更する方法

1. インストールapt-get install mysql-server にはアカウントとパスワー...

Vueにおけるキーの役割と原理の詳細な説明

目次1. 結論から始めましょう2. キーの役割2.1 例2.2 上記の例を修正する2.3 例を再度修...