MySQLサブクエリの詳細な例

MySQLサブクエリの詳細な例

サブクエリの分類

返された結果セットによる分類

サブクエリは、返される結果セットの違いに応じて、テーブル サブクエリ、行サブクエリ、列サブクエリ、およびスカラー サブクエリの 4 つのタイプに分類されます。 テーブル サブクエリ: 返される結果セットは、行、N 行、N 列 (N>=1) のセットです。テーブル サブクエリは、親クエリの FROM 句でよく使用されます。 行サブクエリ: 返される結果セットは列のセットであり、1 行に N 列 (N>=1) が含まれます。行サブクエリは、クエリの FROM 句と WHERE 句で使用できます。 列サブクエリ: 返される結果セットは、N 行と 1 列 (N>=1) の行セットです。 スカラー サブクエリ: 返される結果セットは、1 行と 1 列のスカラー セット、つまりスカラー値です。スカラー サブクエリは、スカラー式を指定できる場所であればどこでも使用できます。

定義により、すべてのスカラー サブクエリは行サブクエリおよび列サブクエリでもありますが、その逆は当てはまりません。また、すべての行サブクエリおよび列サブクエリはテーブル サブクエリでもありますが、その逆は当てはまりません。

結果を返す呼び出し方法に応じて

サブクエリは、結果セットを返す呼び出し方法に応じて、where 型サブクエリ、from 型サブクエリ、exists 型サブクエリに分類できます。

Where 型サブクエリ: (内部クエリの結果を外部クエリの比較条件として使用) 定義: Where 型サブクエリは、内部クエリの結果を外部クエリの条件として使用します。サブクエリから: (内部クエリの結果が外部クエリに再度使用されます) 定義: サブクエリからでは、サブクエリの結果 (メモリ内のテーブル) を一時テーブルとして扱い、処理します。 Exists サブクエリ: (外部クエリの結果を内部レイヤーに渡して、内部クエリが確立されているかどうかを確認します) 定義: Exists サブクエリは外部テーブルをループし、内部テーブルに対して内部クエリを実行します。 in() と似ていますが、いくつか違いがあります。主に 2 つのテーブルのサイズの違いによって決まります。サブクエリ テーブルが大きい場合は、 exists (内部インデックス) を使用します。サブクエリ テーブルが小さい場合は、 in (外部インデックス) を使用します。

サブクエリの原則の使用

1. サブクエリは括弧で囲む必要があります。

2. 読みやすさを向上させるために、サブクエリを比較条件の右側に配置します。サブクエリに ORDER BY 句が含まれていません。 SELECT ステートメントには ORDER BY 句を 1 つだけ使用できます。指定する場合は、メインの SELECT ステートメントの最後に配置する必要があります。

3. サブクエリでは、単一行演算子 (>、=、>=、<、<>、<=) と複数行演算子 (IN、ANY、ALL) の 2 種類の比較条件を使用できます。

分析例

テストテーブルを作成する

テーブルプレイヤーを作成する
  (PLAYERNO INTEGER NOT NULL、
  名前 CHAR(15) NULLではない、
  頭文字 CHAR(3) NOT NULL、
  生年月日 日付、
  性別 CHAR(1) NULLではない、
  結合されたSMALLINTはNULLではありません。
  ストリート VARCHAR(30) NOT NULL、
  ハウスノチャー(4)
  郵便番号 CHAR(6) ,
  タウン VARCHAR(30) NOT NULL、
  電話NO CHAR(13) ,
  リーグーノ・チャール(4)、
  主キー (PLAYERNO));
 
テーブルペナルティの作成
    (PAYMENTNO INTEGER NOT NULL、
     PLAYERNO INTEGER NOT NULL、
     PAYMENT_DATE 日付がNULLではありません。
     金額10進数(7,2) NULLではない、
     主キー (PAYMENTNO));

注: テーブル プレーヤーはプレーヤー情報の基本テーブルであり、テーブル ペナルティは罰金の記録があるプレーヤー情報のリストです。

テストデータを挿入

PLAYERS VALUES (2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road','43', '3575NH', 'Stratford', '070-237893', '2411') に挿入します。
プレーヤーの値に (6、'Parmenter'、'R'、'1964-06-25'、'M'、1977、'Haseltine Lane'、'80'、'1234KK'、'Stratford'、'070-476537'、'8467') を挿入します。
PLAYERS VALUES (7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way','39', '9758VB', 'Stratford', '070-347689', NULL) に挿入します。
PLAYERS VALUES (8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road','4', '6584WO', 'Inglewood', '070-458458', '2983') に挿入します。
プレーヤーの値に (27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive','804', '8457DK', 'Eltham', '079-234857', '2513') を挿入します。
PLAYERS VALUES (28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road','10', '1294QK', 'Midhurst', '010-659599', NULL) に挿入します。
プレーヤーの値に次の値を挿入します (39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square','78', '9629CD', 'Stratford', '070-393435', NULL);
プレーヤーの値に (44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street','23', '4444LJ', 'Inglewood', '070-368753', '1124') を挿入します。
プレーヤーの値に (57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way','16', '4377CB', 'Stratford', '070-473458', '6409') を挿入します。
プレーヤーの値に挿入します (83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road','16A', '1812UP', 'Stratford', '070-353548', '1608');
PLAYERS VALUES (95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street','33A', '5746OP', 'Douglas', '070-867564', NULL) に挿入します。
PLAYERS VALUES (100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane','80', '6494SG', 'Stratford', '070-494593', '6524') に挿入します。
プレーヤーの値に (104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street','65', '9437AO', 'Eltham', '079-987571', '7060') を挿入します。
プレーヤーの値に挿入します (112、'Bailey'、'IP'、'1963-10-01'、'F'、1984、'Vixen Road'、'8'、'6392LK'、'Plymouth'、'010-548745'、'1319')。
 
ペナルティ値に挿入 (1, 6, '1980-12-08',100);
ペナルティ値に挿入 (2, 44, '1981-05-05', 75);
ペナルティ値に挿入します (3, 27, '1983-09-10',100);
ペナルティ値に挿入 (4,104, '1984-12-08', 50);
ペナルティ値に挿入 (5, 44, '1980-12-08', 25);
ペナルティ値に挿入 (6, 8, '1980-12-08', 25);
ペナルティ値に挿入 (7, 44, '1982-12-30', 30);
ペナルティ値に挿入 (8, 27, '1984-11-12', 75);

テーブルサブクエリの例

例: 10未満の男性プレイヤーの数を取得します

mysql> (から playerno を選択
  プレイヤー番号、性別を選択 
  プレイヤーから 
  ただし、プレイヤー番号 < 10) 
性別が「M」の場合、プレイヤー10として

行サブクエリの例

例: 同じ性別で同じ都市に住んでいるプレイヤー番号 100 のプレイヤー番号を取得します。

mysql> プレイヤー番号を選択 
プレイヤーから 
ここで (性別, 市区町村) = (
  性別、都市を選択 
  プレイヤーから 
  ここで、playerno = 100 です);

説明: サブクエリの結果は、2 つの値 ('M'、'stratford') を持つ行です。この値は行式 (性別、町名) と比較されます。

スカラーサブクエリの例

スカラー式を指定できるほぼすべての場所で、スカラー サブクエリを使用できます。 例: 27番の選手と同じ年に生まれた選手の背番号を取得します。

mysql> プレイヤー番号を選択 
プレイヤーから 
ここで、年(生年月日) = 
  (年(生年月日)を選択) 
  プレイヤーから 
  ここで、プレイヤー番号は 27 です) 
そしてプレイヤー番号 <> 27;

上記のステートメントは以下と同等です:

mysql> year(birth_date) = 1964 かつ playerno <> 27 の場合、playerno を players から選択します。

サブクエリの例

列サブクエリによって返される結果セットは N 行の 1 つの列であるため、スカラー結果を比較する = > < >= <= <> などの演算子を直接使用することはできません。 IN、ANY (SOME)、および ALL 演算子は、列サブクエリで使用できます。IN: 指定された項目内。IN (項目 1、項目 2、...) と同じです。 ANY: 比較演算子と組み合わせて使用​​する場合は、ANY キーワードの後に​​比較演算子を続ける必要があります。これは、サブクエリによって返される値との比較が TRUE の場合に TRUE が返されることを示します。 SOME: ANY の別名ですが、あまり一般的には使用されません。 ALL: 比較演算子と組み合わせて使用​​する場合は、ALL キーワードを比較演算子の後に配置する必要があります。これは、サブクエリによって返されるすべての値が TRUE と比較された場合に TRUE が返されることを示します。

例 1 (in):性別が女性のすべてのプレーヤーのプレーヤー番号、名前、都市を取得します。

mysql> プレイヤー番号、名前、町を選択 
プレイヤーから 
プレイヤー番号が 
  (プレイヤー番号を選択 
  プレイヤーから 
  性別 = 'F');

例 2 (任意):同じ都市より少なくとも 1 人若いすべてのプレーヤーの番号、日付、居住都市を取得します。

mysql> プレイヤー番号、生年月日、町を選択 
プレイヤーからp1として 
生年月日 > 任意 
  (生年月日を選択 
  プレイヤーからP2として 
  ここで、p1.town = p2.town です);

例 3 (すべて):最年長のプレーヤーの番号、名前、誕生日を取得します。 (つまり、生年月日の値が他のすべてのプレイヤーより小さいか等しいプレイヤー)

mysql> プレイヤー番号、名前、生年月日を選択 
プレイヤーから 
生年月日 <= すべて 
  (生年月日を選択 
  プレイヤーから);

XISTS キーワードは存在を示します。 EXISTS キーワードを使用すると、内部クエリ ステートメントはクエリされたレコードを返さず、true または false の値を返します。内部クエリ ステートメントが条件を満たすレコードを見つけた場合、サブクエリが少なくとも 1 つの値を返す限り、EXISTS ステートメントの値は True になります。 true を返し、それ以外の場合は false を返します。返された値が true の場合、外部クエリ ステートメントはクエリを実行し、それ以外の場合はクエリを実行しません。 NOT EXISTS はその逆です。 exists の使い方は in() と似ていますが、それでも違いがあります。主に 2 つのテーブルのサイズの違いによって決まります。サブクエリ テーブルが大きい場合は、 exists (内部インデックス) を使用します。サブクエリ テーブルが小さい場合は、 in (外部インデックス) を使用します。

例 1 (存在):少なくとも 1 回の罰金を支払ったプレーヤーの名前とイニシャルを取得します。

mysql> 名前、イニシャルを選択 
プレイヤーから 
存在する場所 
  (罰則から*を選択) 
  ここで、playerno = players.playerno);

例 2 (存在しません):罰金を科せられたことがないプレーヤーの名前とイニシャルを取得します。

mysql> 名前、イニシャルを選択 
プレイヤーから 
存在しない 
  (罰則から*を選択) 
  ここで、playerno = players.playerno);

上記はMySQLサブクエリの詳細な例です。MySQLサブクエリの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Mysql マルチレイヤーサブクエリのサンプルコード (お気に入りの場合)
  • MySQLサブクエリの原理の詳細な分析
  • Mysql の複数行サブクエリと null 値の問題を解決する
  • MySQL チュートリアル: サブクエリの例の詳細な説明
  • mysql サブクエリと結合テーブルの詳細
  • MySQL の結合クエリとサブクエリの問題
  • MySQL でのサブクエリの基本的な使用法
  • MySQL サブクエリとグループ化されたクエリ
  • MySQL サブクエリの使用に関する詳細な分析

<<:  Centos7 MySQL データベースのインストールと設定のチュートリアル

>>:  プロジェクトにaxiosをカプセル化する実際のプロセス

推薦する

VueはElementUIのフォームサンプルコードを模倣する

実装要件ElementUI を模倣したフォームは、インデックス コンポーネント、Form フォーム ...

CSSでフレックス配置を表示する(レイアウトツール)

display: flex レイアウトに関しては、深く理解している人もいますし、私も他の人の作業か...

LinuxでのDockerのインストールチュートリアル

Docker パッケージは、デフォルトの CentOS-Extras リポジトリにすでに含まれていま...

MySQL で B+ ツリー インデックスを使用する利点は何ですか?

この問題を理解する前に、まず MySQL テーブルのストレージ構造を確認し、次にバイナリ ツリー、マ...

vue+elementUI で埋め込みテーブルを実装する方法の例

大学 4 年生のときのインターンシップ中に、表内のデータの番号をクリックすると、そのデータの下に新し...

シンプルな加算計算機の JavaScript 実装

この記事では、参考までに、加算計算機を実装するためのJavaScriptの具体的なコードを紹介します...

el-table ヘッダーでテキストを折り返す 3 つの方法の詳細な説明

目次問題の説明レンダリング3種類のコード要約する問題の説明通常、表のヘッダーは折り返されませんが、ビ...

Dockerコンテナのデータを復元する方法

プロジェクトのテスト環境データベースのデータが失われてしまったので、記録しておきたいと思います。当時...

MySQL カウントを向上させる方法のまとめ

多くのプログラマーは MySQL に精通していると思います。多くの人が count の使い方と、最適...

HTML テーブルタグチュートリアル (21): 行の境界線の色属性 BORDERCOLOR

テーブルを美しくするために、行ごとに異なる境界線の色を設定できます。基本的な構文<TR 境界線...

Vue の echarts ツールチップにクリック イベントを追加する詳細な説明

目次必要回避策1. ツールチップを設定する2. hookToolTip変数を定義する3. メソッド内...

CentOS で LibreOffice を使用してドキュメント形式を変換する方法

プロジェクト要件では、アップロードされたドキュメントの前処理が必要です。ユーザーが doc 形式でド...

Nodejs は JSON 文字列を JSON オブジェクトに変換するエラー解決法

JSON 文字列を JSON オブジェクトに変換するにはどうすればいいですか? JSON.parse...

MySQL トランザクション自動コミット自動コミット操作

MySQL のデフォルトの動作モードは自動コミット モードです。つまり、明示的にトランザクションを開...

Vue はボタンをクリックしてファイルをダウンロードする操作コードを実装します (バックエンド Java)

前回の記事では、ボタンをクリックしてファイルをダウンロードするVueの機能を紹介しました。今日は、ボ...