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

推薦する

Uniappの小規模プログラム開発経験

1. 新しいUIプロジェクトを作成するまず、私たちの UI は ColorUI に基づいています。C...

自動検索提案機能のスタイルファイルを入力します: suggestion.css

コードをコピーコードは次のとおりです。 .sugLayerDiv{位置:相対; overflow:h...

Vue を使用して 2 つのデータ セットの違いを比較する視覚化コンポーネントの詳細な説明

目次必要:要点:これまでの要点に従って、コンポーネントのプロパティを確立できます。コンポーネントの基...

Linux での MySQL 5.7.18 yum のアンインストールからインストールまでのプロセスの図

いろいろ苦労しましたが、やっと yum インストールの手順がわかりました。以前、バイナリ パッケージ...

VPSサーバーでよく使われるパフォーマンステストスクリプトの概要

これは、VPS サーバー用の一般的なワンクリック パフォーマンス テスト スクリプトです。マシンの構...

vue+django でファイルをダウンロードする例

目次1. 概要2. Django プロジェクト3. Vueプロジェクト1. 概要プロジェクトで、ダウ...

TCP 3 回目のハンドシェイク データ転送プロセス図

RFC793 ドキュメントの SYN フラグを持つプロセス パケットはデータを伝送できません。つま...

WeChatアプレットの手動および自動追跡の実装の詳細説明(Taro)

どの企業もユーザーベースを拡大したいのであれば、ユーザーの操作データを収集・分析する必要があり、その...

フレームセットを使用してワイドスクリーンを中央に配置するためのヒントを共有する

コードをコピーコードは次のとおりです。 <フレームセット cols="*,1280,...

type="file" の入力ボックスのスタイル変更の概要

入力タイプ「file」とは何ですか?これが何なのかは説明する必要はないと思います。誰もが知っているこ...

CSS3 グラデーション背景の互換性の問題

グラデーションの背景色を作成するときは、 linear-gradient() 関数を使用して線形グラ...

Ubuntu 20.04 Firefox でビデオを再生できない (Flash プラグインがない) 場合の解決策

1. Flashプラグインパッケージのダウンロードアドレス: https://get.adobe.c...

Dockerコンテナにvimコマンドがない問題を解決する方法

問題を見つける今日、Docker コンテナ内のファイルを変更しようとしたところ、コンテナ内に vim...

Nginx ドメイン名の書き換えとワイルドカードドメイン名の解決を設定する方法

この記事では、ドメイン名の書き換えとワイルドカードドメイン名の解決を行うための Nginx の設定方...