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

推薦する

CSS3 マウスホバー遷移ズーム効果

以下は、純粋な CSS で記述された画像マウスホバーズーム効果です。実際、基本原理は非常に単純です。...

Dockerコンテナのネットワークポート設定プロセスの詳細な説明

ネットワークポートの公開実際、Docker にはネットワーク ポートの公開に関わる 2 つのパラメー...

MySQL データベース クエリ パフォーマンス最適化戦略

クエリを最適化するExplain ステートメントを使用してクエリ ステートメントを分析するExpla...

Linux seqコマンドの使い方

1. コマンドの紹介seq (シーケンス) コマンドは、指定されたステップ サイズに従って、開始番号...

Windows での MySQL 8.0.13 解凍バージョンのインストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.13のインストールグラフィックチュートリアルを紹介します...

MySQL 5.7.21 解凍版のインストールと設定方法のグラフィックチュートリアル (win10)

MySQL 5.7.21 解凍版のインストールと設定方法は参考までに。具体的な内容は以下のとおりで...

JavaScript 遅延読み込みの詳細な説明

目次遅延読み込みCSS スタイル: HTML部分:スクリプト部分:要約する遅延読み込み名前の通り、私...

Linux で毎日データベースの自動バックアップを設定する方法

この記事では、Centos7.6 システムと Oracle11g を例に挙げます。 1. まずデータ...

Windows 10 の仮想マシンに Mac システムをインストールするグラフィック チュートリアル

1. 仮想マシンバージョン15.5.1をダウンロードする公式サイトから直接最新バージョンをダウンロー...

Tomcat の 404 エラーの解決方法の詳細な説明

Tomcat テストで 404 問題が発生します。問題は次のとおりです。 HTTP ステータス 40...

MySQL 8.0.15 のインストールと設定のグラフィックチュートリアルと Linux でのパスワード変更

このブログは、MySQL8.0.15 を正常にインストールしたことを思い出すために書きました。以前は...

Docker での WSL の構成と変更の問題について

https://docs.microsoft.com/ja-jp/windows/wsl/wsl-...

CSS でのナビゲーション バーとドロップダウン メニューの実装

1. CSSナビゲーションバー(1)ナビゲーションバーの機能ナビゲーション バーを使いこなすことは、...

jsを使用してサーバーに写真をアップロードする

この記事の例では、参考のために画像をサーバーにアップロードするためのjsの具体的なコードを共有してい...

Windows で mysql-8.0.18-winx64 をインストールするチュートリアル (画像とテキスト付き)

1. インストールパッケージをダウンロードするインストール パッケージは次の場所にあります:参考:...