基本情報技術者試験の公開問題を解こう!(令和7年度・科目A)(6)「SQL文」

ITの基礎

基本情報技術者試験の令和7年度の公開問題(科目A)を解こう。

今回のテーマは、「SQL文」である。

正解:ウ

それでは、各肢を検討していこう。

元の SQL 文の意味

SELECT * FROM 商品 WHERE 仕入先ID IN ('M002', 'M004')

意味
「商品」表から、仕入先ID が M002 または M004 の行をすべて取得する。

表から該当する行

  • M002:S002(食器洗い機)
  • M004:S005(コーヒーメーカー)、S006(ホットプレート)

ア 誤り。

SELECT * FROM 商品 
WHERE 仕入先ID = 'M002' AND 仕入先ID = 'M004'

1つの行が同時にM002 かつ M004になることは不可能。

イ 誤り。

SELECT * FROM 商品 WHERE 仕入先ID = 'M002'
INTERSECT
SELECT * FROM 商品 WHERE 仕入先ID = 'M004'
  • INTERSECT は「両方に共通する行」を返す。
  • M002 と M004 に同時に属する商品は存在しない。

ウ 正しい。

SELECT * FROM 商品 
WHERE 仕入先ID = 'M002' OR 仕入先ID = 'M004'
  • 「M002 または M004」
  • IN ('M002','M004')完全に同じ意味

エ 誤り。

SELECT * FROM 商品 
WHERE 仕入先ID BETWEEN 'M002' AND 'M004'
  • BETWEEN は **文字コード順(辞書順)**で判定する。
  • 'M002' ~ 'M004' の範囲にはM003 も含まれてしまう
  • 仕入先ID = M003 の商品(S003, S004)も取得されるため、
    元の結果と一致しない

MySQLで検証

この問題をMySQLを使って検証してみよう。

検証環境は、GitHubのcodespacesである。

環境構築は、以下のブログ記事を参考にしてください。

本記事では、MySQLのインストールからご紹介する。

sudo apt update
sudo apt upgrade -y
sudo apt-get install mysql-server -y
sudo service mysql start

MySQLに接続しよう。

mysql -h db -u root -ppassword

learning_dbデータベースを作成

-- データベースを作成
CREATE DATABASE learning_db;

-- 作成されたか確認
SHOW DATABASES;

**表示例:**
+--------------------+
| Database           |
+--------------------+
| company_db         |
| information_schema |
| learning_db        | ← 作成された
| mysql              |
| performance_schema |
| sys                |
+--------------------+

learning_dbを使用

-- learning_dbに切り替え
USE learning_db;

-- 現在のデータベースを確認
SELECT DATABASE();

**表示例:**
+--------------+
| DATABASE()   |
+--------------+
| learning_db  |
+--------------+

商品テーブルを作成

-- 商品テーブルを作成
 CREATE TABLE 商品 (
    商品ID VARCHAR(10) PRIMARY KEY,
    商品名称 VARCHAR(100) NOT NULL,
    仕入先ID VARCHAR(10) NOT NULL,
    単価 INT NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- テーブルが作成されたか確認
 SHOW TABLES;

**表示例:**
+----------------------+
| Tables_in_learning_db|
+----------------------+
| 商品                 |
+----------------------+

データを投入

INSERT INTO 商品 (商品ID, 商品名称, 仕入先ID, 単価) VALUES
    ('S001', '冷蔵庫', 'M001', 155000),
    ('S002', '全自動洗い機', 'M002', 85000),
    ('S003', '電子レンジ', 'M003', 78000),
    ('S004', '炊飯器', 'M003', 32000),
    ('S005', 'コーヒーメーカー', 'M004', 15000),
    ('S006', 'ホットプレート', 'M004', 12000);

-- データが投入されたか確認
SELECT * FROM 商品;

**表示例:**
+----------+--------------------------+-------------+--------+
| 商品ID   | 商品名称                 | 仕入先ID    | 単価   |
+----------+--------------------------+-------------+--------+
| S001     | 冷蔵庫                   | M001        | 155000 |
| S002     | 全自動洗い機             | M002        |  85000 |
| S003     | 電子レンジ               | M003        |  78000 |
| S004     | 炊飯器                   | M003        |  32000 |
| S005     | コーヒーメーカー         | M004        |  15000 |
| S006     | ホットプレート           | M004        |  12000 |
+----------+--------------------------+-------------+--------+

問題6を検証

元のクエリ(IN句)

SELECT * FROM 商品 WHERE 仕入先ID IN ('M002', 'M004');

**表示例:**
+----------+--------------------------+-------------+--------+
| 商品ID   | 商品名称                 | 仕入先ID    | 単価   |
+----------+--------------------------+-------------+--------+
| S002     | 全自動洗い機             | M002        |  85000 |
| S005     | コーヒーメーカー         | M004        |  15000 |
| S006     | ホットプレート           | M004        |  12000 |
+----------+--------------------------+-------------+--------+

ア: ANDで結合

SELECT * FROM 商品 WHERE 仕入先ID = 'M002' AND 仕入先ID = 'M004';

**表示例:**
Empty set (0.00 sec)

1つの商品が同時に2つの仕入先を持つことは不可能

イ: INTERSECT

SELECT * FROM 商品 WHERE 仕入先ID = 'M002'
INTERSECT
SELECT * FROM 商品 WHERE 仕入先ID = 'M004';

**表示例:**
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTERSECTSELECT * FROM 商品 WHERE 仕入先ID = 'M004'' at line 1

エラーまたは0件(MySQLではINTERSECTがサポートされていない場合がある)

ウ: ORで結合 ✅ 正解

SELECT * FROM 商品 WHERE 仕入先ID = 'M002' OR 仕入先ID = 'M004';

**表示例:**
+----------+--------------------------+-------------+--------+
| 商品ID   | 商品名称                 | 仕入先ID    | 単価   |
+----------+--------------------------+-------------+--------+
| S002     | 全自動洗い機             | M002        |  85000 |
| S005     | コーヒーメーカー         | M004        |  15000 |
| S006     | ホットプレート           | M004        |  12000 |
+----------+--------------------------+-------------+--------+

エ: BETWEEN

SELECT * FROM 商品 WHERE 仕入先ID BETWEEN 'M002' AND 'M004';

+----------+--------------------------+-------------+--------+
| 商品ID   | 商品名称                 | 仕入先ID    | 単価   |
+----------+--------------------------+-------------+--------+
| S002     | 全自動洗い機             | M002        |  85000 |
| S003     | 電子レンジ               | M003        |  78000 |
| S004     | 炊飯器                   | M003        |  32000 |
| S005     | コーヒーメーカー         | M004        |  15000 |
| S006     | ホットプレート           | M004        |  12000 |
+----------+--------------------------+-------------+--------+

件数が多いうえに内容が異なる

コメント

タイトルとURLをコピーしました