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をカプセル化する実際のプロセス

推薦する

WeChatアプレットは画像コントロールを選択します

この記事の例では、WeChatアプレットで画像コントロールを選択するための具体的なコードを参考までに...

パーソナライズされたクリエイティブなウェブサイトデザインの例 (30)

そこで、個性的なスタジオやフリーランスを表現する組み合わせを 30 個選びました。デザインを目立たせ...

CSSスプライト技術は複数の背景を1つのPNG画像に統合しますCSSポジショニング

アメリカのYAHOOがページ制作で使用している画像統合技術。これらのアイコン、列背景、画像ボタンを定...

年末ですが、MySQL パスワードは安全ですか?

序文:年末です。データベースを検査する時期ではないでしょうか?一般的に、検査では、パスワードの複雑さ...

CSS スタイルの優先順位はどれくらい複雑ですか?

昨晩、面接の質問を見ていたら、CSS スタイルの優先順位について特に明確に説明していない人が何人かい...

MySQL のインデックス障害の一般的なシナリオと回避方法

序文これまでにも、一部の SQL ステートメントを不適切に使用すると MySQL インデックスが失敗...

小さなページングデザイン

ユーザーが目的のものを探すために前進するか後退するかを選択できるようにします。たとえば、Taobao...

VMware 仮想マシンのインストール CentOS 8 (1905) システム チュートリアル ダイアグラム

世界的に有名な仮想マシン ソフトウェア VMware-workstation-full-15.5.0...

VMware に Centos8 をインストールする詳細なチュートリアル

CentOS公式サイトアドレスhttps://www.centos.org/まず必要なファイルをダウ...

MySQLの関連ロックについての簡単な理解

この記事は主にInnoDBのロックに関する知識を素早く理解してもらうことを目的としています。 Roc...

innodb_autoinc_lock_mode の表現と値の選択方法についての簡単な説明

前提条件: Percona 5.6 バージョン、トランザクション分離レベルは RR mysql>...

Vue ページ状態の永続化の詳細な説明

目次コード:補充:要約する要件: 左のツリーと右のテーブル。組織ツリーでノードを選択した後、詳細ペー...

CSS マージンの重複と解決策の探索の詳細な説明

最近、CSS 関連の知識ポイントをいくつか見直し、CSS における典型的なマージンの重なりの問題を整...

大規模な Vue.js プロジェクトの構築と維持のための 10 のベスト プラクティス

目次1. スロットを使用してコンポーネントを理解しやすくし、より強力にする2. Vuexストアを正し...