13.サブクエリー

()内がサブクエリ

■WHEREで"=",">",を利用
SELECT * FROM [TableName1] WHERE [ColName1] = (SELECT [ColName2] FROM [TableName2] WHERE [ColName3] = 1);
SELECT * FROM [TableName1] WHERE [ColName1] = (SELECT MAX([ColName2]) FROM [TableName2];

※上記の場合、サブクエリは1件だけ結果を返すようにしなければならない。

■IN
SELECT * FROM [TableName1] WHERE [ColName1] IN (SELECT [ColName2] FROM [TableName2];

※上記の場合、サブクエリーから[ColName2]の値がが返され、[ColName1]に同じ値があれば該当レコードが表示される。


■EXISTS
SELECT * FROM [TableName1] WHERE NOT EXISTS (SELECT * FROM [TableName2] WHERE [ColName2]=[TableName1].[ColName1]);

※サブクエリーが1以上のレコードを返したとき真になる。
※上記の場合、NOTで反転してるので、[ColName2]=[TableName1].[ColName1]が成り立たないときレコードが表示される。

■FROM内でテーブルの代わりに利用
SELECT * FROM (SELECT * FROM [TableName1]) AS [TableName2];
※サブクエリの結果をALIASで仮想テーブル[TableName2]に割り当てる。

SELECT [TableName3].[ColName1],COUNT([TableName3].[ColName2]) FROM (SELECT * FROM [TableName1] UNION SELECT * FROM [TableName2]) AS [TableName3] GROUP BY [TableName3].[ColName1];
※[TableName1]と[TableNmae2]を結合し、ALIASとして仮想テーブル[TableName3]に割り当てる。
GROUP BYで[ColName1]をまとめられ、ターゲットの指定通りまとめた[ColName1]と[ColName1]でまとめられたレコードの個数が表示される。

■ターゲットリストで利用
SELECT (SELECT MAX([ColName2]) FROM [TableName2]),[ColName2] FROM [TableName1];
※[TableName2]のMAX値と[TableName1]の[ColName2]が表示される。
※上記の場合、サブクエリは1件だけ結果を返すようにしなければならない。


ALL(すべて)/ANY(どれか)

■ALL
SELECT * FROM [TableNmae1] WHERE [ColName1] > ALL (SELECT [ColName1] FROM [TableName2]);
※[TableNmae1]の[ColName1]のうち、[TableName2]の[ColName1]のどれよりも大きい値をもつレコードが抽出される。

■ANY
SELECT * FROM [TableNmae1] WHERE [ColName1] = ANY (SELECT [ColName1] FROM [TableName2]);
※[TableNmae1]の[ColName1]が[TableName2]の[ColName1]の値どれかに等しければ抽出される。



戻る | CGI'sトップへ戻る