情報処理技術者試験(基本情報技術者試験、応用情報技術者試験、データベーススペシャリスト試験など)には、データベースのSQLの問題が出ます。
試験会場では頭で考えるしかないですが、勉強としては実際に動かして確かめたいところです。その方法を紹介します。
問題
例えば、この2023年秋の応用情報技術者試験の問題です。
相関副問合せが使われている難問です。
頭で考える
SQL文の意味を日本語で書けば、「“製品”表にある各製品番号のうち、“在庫”表の中で、在庫数が30個を超える倉庫が一つもない製品番号を挙げよ」です。
- 製品番号AB1805:倉庫コードWH101に、30個を超える在庫があるので、抽出されない
- 製品番号CC5001:倉庫コードWH100とWH103に、30個を超える在庫があるので、抽出されない
- 製品番号MZ1000:どの倉庫にも在庫がないので、抽出される
- 製品番号XZ3000:倉庫コードWH101とWH102に在庫があるが、どちらも30個を超えないので、抽出される
- 製品番号ZZ9900:倉庫コードWH100に、30個を超える在庫があるので、抽出されない
よって得られる表の行は、MZ1000とXZ3000の2つとなります。
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 製品.製品番号 = 在庫.製品番号);
出力として、確かに製品番号MZ1000とXZ3000が得られました。
INSERT文で挿入するデータを変えたり、在庫数 > 30
の部分の数字や不等号の向きを変えたり、いろいろ試してみるとよいでしょう。