副問い合わせとは、SQL文の中でSQL文を実行する処理です。
メインの処理を主問い合わせ、サブとなるのを副問い合わせと言います。
副問い合わせには、INとEXISTSがあります。
(1)IN
たとえば、過去問(H22春FE午前問31)を参考にすると、以下です。
これは、「主問い合わせ(副問い合わせ)」の流れになっています。この例では、副問い合わせの結果を踏まえて主問い合わせが行われます。
具体的には、副問い合わせで、在庫がある商品番号が出されます。そして、そこにある商品番号を表示しています。
ということは、在庫がある商品番号を表示しているのですね。
はい、そうです。
(2)EXISTS
さきのINで表現したSQL文をEXSITSを使うと以下のようになります。比較のため、INの場合と両方を記載します。
①INの場合
②EXISTSの場合
select 商品番号 FROM 在庫
EXISTSの場合は、INと違い、True かFalseしか返しません。
また、INの場合、副問い合わせの検索結果をもとに主問い合わせを実行します。EXISTSの場合は、副問い合わせをしながら(1行ずつ)、主問い合わせを1行ずつ実行します(おそらく)。このあたりが、INとEXSITSの違いです。
http://sqlfiddle.com/などを使って試してみたい方は、以下を活用してください。
商品テーブルをX、在庫テーブルをYとしています。
----ここから
では実際の問題をみてみましょう。
-----------
問31 "商品"表,“在庫"表に対する次のSQL文と,同じ結果が得られるSQL文はどれか。ここで,下線部は主キーを表す。
SELECT 商品番号 FROM 商品
WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 在庫)
商品(商品番号,商品名,単価)
在庫(在庫番号,商品番号,在庫数)
ア SELECT 商品番号 FROM 在庫
WHERE EXISTS (SELECT 商品番号 FROM 商品)
イ SELECT 商品番号 FROM 在庫
WHERE NOT EXISTS (SELECT 商品番号 FROM 商品)
ウ SELECT 商品番号 FROM 商品
WHERE EXISTS (SELECT 商品番号 FROM 在庫
WHERE商品.商品番号=在庫.商品番号)
エ SELECT 商品番号 FROM 商品
WHERE NOT EXISTS (SELECT 商品番号 FROM 在庫
WHERE商品.商品番号=在庫.商品番号)
-----------
正解はエです。
以下、少し難しい問題です。
H20秋SW午前問66
問66 "社員"表から,男女それぞれの最年長社員を除くすべての社員を取り出すSQL文とするためにaに入る副問合せはどれか。ここで,“社員"表は次の構造とし,下線部は主キーを表す。
社員(社員番号,社員名,性別,生年月日) ※主キーは社員番号
SELECT 社員番号,社員名 FROM 社員 AS S1 WHERE 生年月日 > ( a )
ア SELECT MIN(生年月日) FROM 社員 AS S2 GROUP BY S2.性別
イ SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.生年月日 > S2.生年月日 OR S1.性別=S2.性別
ウ SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別
工 SELECT MIN(生年月日) FROM 社員 GROUP BY S2.性別
→正解はウ
メインの処理を主問い合わせ、サブとなるのを副問い合わせと言います。
副問い合わせには、INとEXISTSがあります。
(1)IN
たとえば、過去問(H22春FE午前問31)を参考にすると、以下です。
select 商品番号 FROM 商品
where 商品番号 IN (SELECT 商品番号 FROM 在庫);
これは、「主問い合わせ(副問い合わせ)」の流れになっています。この例では、副問い合わせの結果を踏まえて主問い合わせが行われます。
具体的には、副問い合わせで、在庫がある商品番号が出されます。そして、そこにある商品番号を表示しています。

ということは、在庫がある商品番号を表示しているのですね。
はい、そうです。
(2)EXISTS
さきのINで表現したSQL文をEXSITSを使うと以下のようになります。比較のため、INの場合と両方を記載します。
①INの場合
select 商品番号 FROM 在庫
where 商品番号 IN (SELECT 商品番号 FROM 商品);
②EXISTSの場合
select 商品番号 FROM 在庫
where EXISTS (SELECT 商品番号 FROM 在庫 WHERE 商品.商品番号=在庫.商品番号);
EXISTSの場合は、INと違い、True かFalseしか返しません。
また、INの場合、副問い合わせの検索結果をもとに主問い合わせを実行します。EXISTSの場合は、副問い合わせをしながら(1行ずつ)、主問い合わせを1行ずつ実行します(おそらく)。このあたりが、INとEXSITSの違いです。
http://sqlfiddle.com/などを使って試してみたい方は、以下を活用してください。
商品テーブルをX、在庫テーブルをYとしています。
----ここから
/* テーブルXの作成 */
CREATE TABLE X
(`商品番号` int, `商品名` varchar(8), `単価` int)
;
INSERT INTO X
(`商品番号`, `商品名`, `単価`)
VALUES
('1', 'エアコン', '50000'),
('2', 'ミシン', '30000'),
('3', 'テレビ', '100000'),
('4', '冷蔵庫', '140000'),
('5', 'ドライヤー', '12000'),
('6', '掃除機', '24000')
;
CREATE TABLE Y
(`倉庫番号` varchar(3), `商品番号` int, `在庫数` int)
;
INSERT INTO Y
(`倉庫番号`, `商品番号`, `在庫数`)
VALUES
('A', '1', '100'),
('B', '2', '200'),
('C', '3', '100');
ーーーここまで
ーーーここまで
では実際の問題をみてみましょう。
-----------
問31 "商品"表,“在庫"表に対する次のSQL文と,同じ結果が得られるSQL文はどれか。ここで,下線部は主キーを表す。
SELECT 商品番号 FROM 商品
WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 在庫)
商品(商品番号,商品名,単価)
在庫(在庫番号,商品番号,在庫数)
ア SELECT 商品番号 FROM 在庫
WHERE EXISTS (SELECT 商品番号 FROM 商品)
イ SELECT 商品番号 FROM 在庫
WHERE NOT EXISTS (SELECT 商品番号 FROM 商品)
ウ SELECT 商品番号 FROM 商品
WHERE EXISTS (SELECT 商品番号 FROM 在庫
WHERE商品.商品番号=在庫.商品番号)
エ SELECT 商品番号 FROM 商品
WHERE NOT EXISTS (SELECT 商品番号 FROM 在庫
WHERE商品.商品番号=在庫.商品番号)
-----------
正解はエです。
以下、少し難しい問題です。
H20秋SW午前問66
問66 "社員"表から,男女それぞれの最年長社員を除くすべての社員を取り出すSQL文とするためにaに入る副問合せはどれか。ここで,“社員"表は次の構造とし,下線部は主キーを表す。
社員(社員番号,社員名,性別,生年月日) ※主キーは社員番号
SELECT 社員番号,社員名 FROM 社員 AS S1 WHERE 生年月日 > ( a )
ア SELECT MIN(生年月日) FROM 社員 AS S2 GROUP BY S2.性別
イ SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.生年月日 > S2.生年月日 OR S1.性別=S2.性別
ウ SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別
工 SELECT MIN(生年月日) FROM 社員 GROUP BY S2.性別
→正解はウ
コメント