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

推薦する

Vueはechartsを使用して組織図を描画します

昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...

MySQLはテーブル内のフィールドを別のテーブル内のフィールドの値と等しくなるように更新します

以下のように表示されます。 table1 を z として更新し、table2 を zb として結合し...

JavaScriptのアロー関数の特徴と通常の関数との違い

目次1. 矢印関数の使用1. 通常関数から矢印関数へ2. 中括弧を省略してリターンする3. 括弧を省...

CSS 画像アニメーション効果のサンプルコード(フォトフレーム)

この記事では、CSS 画像アニメーション効果(フォトフレーム)のサンプルコードを紹介し、皆さんと共有...

Office ファイルのオンライン プレビュー用の Vue サンプル コード

最近、電子アーカイブに取り組んでおり、バックエンドではファイルの Huawei Cloud OSS ...

MySQL query_cache_type パラメータと使用方法の詳細

MySQL クエリ キャッシュを設定する目的は次のとおりです。クエリ結果をキャッシュしておくと、次回...

初心者のためのWebページ作成: HTMLのハイパーリンクAタグの使い方を学ぶ

ハイパーリンク a タグはリンク ポイントを表し、英語の単語「anchor」の略語です。その機能は、...

Vue で計算プロパティを使用する際の知識ポイントのまとめ

計算されたプロパティ場合によっては、テンプレートにロジックを詰め込みすぎると、テンプレートが重くなり...

VUE ユニアプリカスタムコンポーネントについての簡単な説明

1. 親コンポーネントはpropsを通じて子コンポーネントにデータを渡すことができる2. 子コンポー...

Dockerコンテナに入る方法と出る方法

1 Dockerサービスを開始するまず、docker サービスを開始する方法を知っておく必要がありま...

MySQL データベースのマスター・スレーブ レプリケーションと読み取り/書き込み分離

目次1. マスタースレーブレプリケーションマスタースレーブレプリケーション3スレッドマスタースレーブ...

CentOSにDockerをインストールする方法

ここでは比較的簡単なインストール方法のみを紹介します。 1. yumを使用してインストールするyum...

Nginx+Keepalived でデュアルマシン マスターとバックアップを実装する方法

序文まず、高性能サーバーの高可用性またはホットスタンバイソリューションである Keepalived ...

Linuxオペレーティングシステムは、タスクマネージャーの視覚化機能を実装するためにPythonを使用しています。

1. Pythonのインストール1. フォルダーを作成します。 mkdir python フォルダ...