実例詳しくはmysql子が調べます。


サブクエリーのカテゴリ
戻り結果セットで分類します。
サブクエリは、戻り結果セットの違いによって4種類に分けられます。テーブルサブクエリー、行サブクエリ、列サブクエリ、およびスケール量子クエリ。テーブルサブクエリ:戻りの結果セットは、行の集合であり、N列(N>=1)である。表サブクエリは、父の照会によく使われるFROMサブフレーズです。行サブクエリ:戻りの結果セットは、一列のN列(N>=1)です。行子クエリは、福引クエリのために使用されるFROM子文とWHERE子文である。列のサブクエリ:戻りの結果セットは、行の集合であり、N行の一列(N>=1)である。標準量子クエリ:リターンの結果セットはスカラーセット、一列一列、すなわちスカラー値です。スカラー表現の場所を指定できます。標準量子クエリを使用できます。
定義的には、各スケールの量子クエリも1行のサブクエリであり、1列のサブクエリであり、逆はそうではない。各行のサブクエリと列のサブクエリも同じテーブルのサブクエリです。逆も違います。
返却結果の呼び出し方法に従って
サブクエリは、戻り結果セットの呼び出し方法によって、where型サブクエリ、from型サブクエリおよびexists型サブクエリに分けることができます。
where型のサブクエリ:(内部クエリの結果を外層クエリの比較条件とする)定義:where型のサブクエリは、内層クエリの結果を外層クエリの条件とすることです。from型のサブクエリ:(内部層の照会結果を外部層に再照会する)定義:fromサブクエリとは、サブクエリの結果(メモリ内の一枚のテーブル)を仮テーブルとして、それを処理することである。existsタイプのサブクエリ:(外部の照会結果を内部層に持って、内部層のクエリが成立するかどうかを確認する)定義:existsサブクエリは、対外層テーブルを循環し、内部テーブルを内部層に照会することです。in()と同じですが、違いがあります。主に二つの表の大きさの差を見ます。サブクエリーテーブルが大きい場合はexists(内部インデックス)、サブクエリーテーブルが小さい場合はin(外部インデックス)を使います。
サブクエリの原則を使う
1.サブクエリーは、必ず丸括弧に入れてください。
2.サブクエリを比較条件の右側に置いて、読み取り可能性を高める。サブクエリには、ORDER BYサブフレーズが含まれていません。一つのSELECT文にはORDER BY子文しか使えません。指定されたら、必ず主SELECT文の最後に置いてください。
3.サブクエリーでは、2つの比較条件が使用できます。単行演算子(>==>、<>、<=)と複数行演算子(IN,ANY,ALL)です。
実例分析
試験表の作成

CREATE TABLE PLAYERS
  (PLAYERNO   INTEGER   NOT NULL,
  NAME      CHAR(15)   NOT NULL,
  INITIALS    CHAR(3)   NOT NULL,
  BIRTH_DATE   DATE         ,
  SEX      CHAR(1)   NOT NULL,
  JOINED     SMALLINT   NOT NULL,
  STREET     VARCHAR(30) NOT NULL,
  HOUSENO    CHAR(4)       ,
  POSTCODE    CHAR(6)       ,
  TOWN      VARCHAR(30) NOT NULL,
  PHONENO    CHAR(13)       ,
  LEAGUENO    CHAR(4)       ,
  PRIMARY KEY  (PLAYERNO));
 
CREATE  TABLE PENALTIES
    (PAYMENTNO   INTEGER   NOT NULL,
     PLAYERNO    INTEGER   NOT NULL,
     PAYMENT_DATE  DATE     NOT NULL,
     AMOUNT     DECIMAL(7,2) NOT NULL,
     PRIMARY KEY  (PAYMENTNO));
注:表playrsは選手情報基本表で、表penaltiesは罰金記録がある選手情報リストです。
試験データの挿入

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

mysql> select playerno from (
  select playerno, sex 
  from players 
  where playerno < 10) 
as players10 where sex='M';
行のサブクエリの例
例えば、100番の選手と性別が同じで、同じ都市に住む選手の番号を取得します。

mysql> select playerno 
from players 
where (sex, town) = (
  select sex, town 
  from players 
  where playerno = 100);
説明:サブクエリの結果は、2つの値を持つ行です。この値を行式(sex,town)と比較します。
スケール量子クエリの例
スカラー表現の任意の場所を指定できます。ほとんどの場所で一つのスケール量子クエリが使用できます。27番の選手と同じ年に生まれた選手の番号を取得します。

mysql> select playerno 
from players 
where year(birth_date) = 
  (select year(birth_date) 
  from players 
  where playerno = 27) 
and playerno <> 27;
上記の語句は以下と同じです。

mysql> select playerno from players where year(birth_date) = 1964 and playerno <> 27;
列のクエリーの例
列のサブクエリーが返される結果セットはN行の一列であるため、直接に=><>=>><>といった比較スカラー結果のオペレータを使用することはできません。列のサブクエリでは、IN、ANY(SOME)とALLオペレータ:IN:指定項目内で、同じIN(項1、項2、…)が使用されます。ANY:比較演算子と連携して使用すると、ANYキーワードは比較演算子の後に接続されなければならず、サブクエリから返ってくるどの値と比較してTRUEであるかを表すと、TRUEに戻ります。SOME:ANYの別名は、使用が少ないです。ALL:比較演算子と連携して使用すると、ALLキーワードは比較演算子の後に接続されなければなりません。サブクエリから返ってきたすべての値との比較がTRUEであることを表すと、TRUEに戻ります。
実例1(in):選手の性別が女性であるすべての選手の選手番号を取得し、名前と所在都市。

mysql> select playerno, name, town 
from players 
where playerno in 
  (select playerno 
  from players 
  where sex = 'F');
例2(any):少なくとも同じ都市の別の選手より若い選手の番号、日付、居住都市を取得します。

mysql> select playerno, birth_date, town 
from players as p1 
where birth_date > any 
  (select birth_date 
  from players as p2 
  where p1.town = p2.town);
実例3(all):一番古い選手の番号と名前と誕生日を取得します。つまり、生年月日の数値が他のすべての選手に等しいです。

mysql> select playerno, name, birth_date 
from players 
where birth_date <= all 
  (select birth_date 
  from players);
XISTSキーワードは存在を表します。EXISTSキーワードを使用する場合、内部層クエリ文はクエリの記録に戻らず、真贋値を返します。もし内部層クエリ文が条件を満たす記録に問い合わせれば、サブクエリのうち少なくとも1つの値を返したら、EXISTS文の値はTrueです。trueに戻ります。そうしないとfalseに戻ります。返した値がtrueである場合、外層クエリ文はクエリされます。そうでなければ、クエリーは行われません。NOT EXISTSとは正反対です。existsの使い方はin()と同じですが、違いがあります。主に二つの表の大きさの差を見ます。サブクエリーテーブルが大きい場合はexists(内部インデックス)、サブクエリーテーブルが小さい場合はin(外部インデックス)を使います。
例1(exists):少なくとも一回の罰金を支払った選手の名前とイニシャルを取得します。

mysql> select name, initials 
from players 
where exists 
  (select * from penalties 
  where playerno = players.playerno);
インスタンス2(not exists):選手の名前と頭文字を取得します。

mysql> select name, initials 
from players 
where not exists 
  (select * from penalties 
  where playerno = players.playerno);
以上は実例です。mysqlの検索の詳しい内容を詳しく説明します。mysqlに関する資料は他の関連記事に注目してください。