この記事ではSelect文の副問合せについてIT初心者にも分かりやすく解説します。
Select文
- 基本形:
Select 列名 From 表名 Where 条件
副問合せ
- 他の表にデータが存在する場合、データを抽出する:
Select 列名 From 表名1 Where Exists (Select 列名 From 表名2) - 他の表にデータが存在しない場合、データを抽出する:
Select 列名 From 表名1 Where Not Exists (Select 列名 From 表名2)
応用情報ではSelect文の副問合せに関する問題が出題されます。是非最後までご覧ください。
(復習)Select文の基本形
データを検索して読取るために使用されるのがSelect文です。
Select文では、「どの表から」「どの列を」「どんな条件で」で抽出するのかを指示します。これがSelect文の基本形です。
Select 列名 From 表名 Where 条件
例えば、社員表から人事部の人を検索して、氏名と役職を抽出するSelect文はこうなります。
Select 氏名,役職 From 社員表 Where 所属部署=’人事部’
ちなみに、条件を指定せずにSelect文を実行することもできます。
その場合は全てのデータを抽出します。
Select 氏名,役職 From 社員表
こちらの記事で、他にもSelect文の使い方について解説しています。
【応用情報】SQLを解説 – Select文の基本形
副問合せ
複数のSelect文を使わないと抽出できないデータを1つのSelect文で抽出したい場合に、
副問合せを使います。
例えば、在庫がある商品の単価を取得したい場合、副問合せを使わないとき、2つのSelect文を使います。
①在庫がある商品の商品番号を抽出するSelect文
②①で抽出した商品番号の単価を抽出するSelect文
①Select 商品番号 From 在庫表 Where 在庫数>0
⇒在庫がある商品番号(=’0001′,’0003′,’0004′)を抽出する
②Select 商品名,単価 From 商品表
Where 商品番号=’0001′ Or 商品番号=’0003′ Or 商品番号=’0004′
⇒商品番号が’0001′,’0003′,’0004’の単価を抽出する
では、副問合せを使い、1つのSelect文にまとめる場合、どのようなSelect文となるのでしょうか。
副問合せの基本形:Exists
他の表にデータが存在する場合に、そのデータを抽出するようなSelect文には「Exists」を使います。
他の表に存在するデータを抽出する
Select 列名 From 表名1 Where Exists (Select 列名 From 表名2)
他の表に存在しないデータを抽出する
Select 列名 From 表名1 Where Not Exists (Select 列名 From 表名2)
※赤字の部分が副問合せ
先程の例、在庫がある商品の単価を取得するSelect文を副問合せを使って書いてみます。
Select 商品名, 単価 From 商品表 Where Exists
(Select 商品番号 From 在庫表 Where 商品表.商品番号 = 在庫表.商品番号 And 在庫表.在庫数>0)
まずは、赤字の副問合せの部分を考えましょう。
商品表に存在する、かつ、在庫数>0の商品番号を取得しているので、
商品番号’0001′,’0003′,’0004’が抽出されます。
Select 商品名, 単価 From 商品表 Where Exists
(Select 商品番号 From 在庫表 Where 商品表.商品番号 = 在庫表.商品番号 And 在庫表.在庫数>0)
抽出した商品番号’0001′,’0003′,’0004’に対して、商品名と単価を取得するので、
このような抽出結果となります。
Not Existsを使うケース
Not Existsを使うと、副問合せで抽出できなかったデータを抽出します。
先程のSelect文を「Not Exists」にすると、副問合せで抽出できない
商品番号’0002′,’0005’の商品名と単価を取得します。
Select 商品名, 単価 From 商品表 Where NotExists
(Select 商品番号 From 在庫表 Where 商品表.商品番号 = 在庫表.商品番号 And 在庫表.在庫数>0)
応用情報技術者試験での出題例
令和5年度秋期問29
応用情報技術者
午前試験 令和5年度秋期問29
“製品”表と”在庫”表に対し,次のSQL文を実行した結果として得られる表の行数は幾つか。
ア 1 イ 2 ウ 3 エ 4
正解は”イ”
副問合せの部分を考えてみましょう。
Select 製品番号 From 在庫 Where 在庫数>30
And 製品.製品番号=在庫.製品番号
在庫数>30、かつ、”製品”表に存在する製品番号を抽出するので、
製品番号’CC5001′,’AB1805′,’ZZ9900’が抽出されます。
今回は”Not Exists”を使っているので、製品番号’CC5001′,’AB1805′,’ZZ9900’以外のデータが抽出されます。よって、行数は製品番号’MZ1000′,’XZ3000’の2つです。