LoginSignup
3
3

情報処理技術者試験のSQL問題を動かして試す

Last updated at Posted at 2023-10-25

情報処理技術者試験(基本情報技術者試験、応用情報技術者試験、データベーススペシャリスト試験など)には、データベースのSQLの問題が出ます。
試験会場では頭で考えるしかないですが、勉強としては実際に動かして確かめたいところです。その方法を紹介します。

問題

例えば、この2023年秋の応用情報技術者試験の問題です。
相関副問合せが使われている難問です。
image.png

頭で考える

SQL文の意味を日本語で書けば、「“製品”表にある各製品番号のうち、“在庫”表の中で、在庫数が30個を超える倉庫が一つもない製品番号を挙げよ」です。

  • 製品番号AB1805:倉庫コードWH101に、30個を超える在庫があるので、抽出されない
  • 製品番号CC5001:倉庫コードWH100とWH103に、30個を超える在庫があるので、抽出されない
  • 製品番号MZ1000:どの倉庫にも在庫がないので、抽出される
  • 製品番号XZ3000:倉庫コードWH101とWH102に在庫があるが、どちらも30個を超えないので、抽出される
  • 製品番号ZZ9900:倉庫コードWH100に、30個を超える在庫があるので、抽出されない
    よって得られる表の行は、MZ1000XZ30002つとなります。

paiza.ioで実行する

https://paiza.io/ja/projects/new にアクセスし、左上の緑色の言語選択ボタンで「MySQL」を選んで、次のようにコードを入力します。

  • 表定義
    問題のとおりに、“製品”表と“在庫”表を定義するCREATE TABLE文を入力します。文字列型はVARCHAR(100)、数値型はINTとします。
CREATE TABLE 製品(製品番号 VARCHAR(100), 製品名 VARCHAR(100), 単価 INT);
CREATE TABLE 在庫(倉庫コード VARCHAR(100), 製品番号 VARCHAR(100), 在庫数 INT);
  • 行挿入
    “製品”表に行を挿入するINSERT文を入力します。
INSERT INTO 製品 VALUES
('AB1805', 'CD-ROMドライブ', 15000),
('CC5001', 'デジタルカメラ', 65000),
('MZ1000', 'プリンタA', 54000),
('XZ3000', 'プリンタB', 78000),
('ZZ9900', 'イメージスキャナ', 98000);

“在庫”表に行を挿入するINSERT文を入力します。

INSERT INTO 在庫 VALUES
('WH100', 'AB1805',  20), ('WH100', 'CC5001', 200),
('WH100', 'ZZ9900', 130), ('WH101', 'AB1805', 150),
('WH101', 'XZ3000',  30), ('WH102', 'XZ3000',  20),
('WH102', 'ZZ9900',  10), ('WH103', 'CC5001',  40);
  • SELECT文
    問題文のSELECT文を入力します。
SELECT DISTINCT 製品番号 FROM 製品
 WHERE NOT EXISTS (SELECT 製品番号 FROM 在庫
   WHERE 在庫数 > 30 AND 製品.製品番号 = 在庫.製品番号);
  • ここまで入力したら、実行ボタンを押します。
    image.png

出力として、確かに製品番号MZ1000XZ3000が得られました。
INSERT文で挿入するデータを変えたり、在庫数 > 30の部分の数字や不等号の向きを変えたり、いろいろ試してみるとよいでしょう。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3