問題
問6
次の「商品」表がある。仕入先IDが’M001’または’M003’の商品をすべて取得するSQL文として、適切なものはどれか。
表:商品
| 商品ID | 商品名称 | 仕入先ID | 単価 |
|---|---|---|---|
| P001 | ノートPC | M001 | 120000 |
| P002 | スマートフォン | M002 | 80000 |
| P003 | タブレット | M001 | 60000 |
| P004 | デジタルカメラ | M003 | 50000 |
| P005 | プリンタ | M003 | 30000 |
- SELECT * FROM 商品 WHERE 仕入先ID = ‘M001’ AND ‘M003’
- SELECT * FROM 商品 WHERE 仕入先ID IN (‘M001’, ‘M003’)
- SELECT * FROM 商品 WHERE 仕入先ID = ‘M001’ AND 仕入先ID = ‘M003’
- SELECT * FROM 商品 WHERE 仕入先ID LIKE ‘M001’ AND ‘M003’
正解
正解は「イ」です。
解説
この問題の正解は「イ」の `SELECT * FROM 商品 WHERE 仕入先ID IN (‘M001’, ‘M003’)` です。このSQL文は、`IN` 演算子を使って、指定したリスト(この場合は ‘M001’ と ‘M003’)のいずれかの値に一致するデータを抽出します。問題の要件である「仕入先IDが’M001’または’M003’の商品」という条件を、簡潔かつ正確に表現しています。
`SELECT * FROM 商品` は、「商品」という名前の表からすべての列(`*`は全列を意味します)のデータを取得するという意味です。 `WHERE 仕入先ID IN (‘M001’, ‘M003’)` は、取得するデータの条件を指定しており、「仕入先ID列の値が ‘M001’ または ‘M003’ のどちらかである」という条件に合致する行だけを抽出します。 このSQL文を実行すると、商品IDがP001, P003, P004, P005の4つの商品データが取得されます。
ア(SELECT * FROM…):
`’M001′ AND ‘M003’` という書き方はSQLの正しい文法ではありません。ANDで条件をつなぐなら `仕入先ID = ‘M001’ AND 仕入先ID = ‘M003’` と書きますが、これでは両方を満たすデータは存在しないため、結果は0件になります。
ウ(SELECT * FROM…):
1つの列に同時に’M001’と’M003’が入ることはないため、結果は常に0件となり誤りです。
エ(SELECT * FROM…):
`LIKE` は文字列の部分一致を検索する際に使い、`AND` と組み合わせるこの文法は正しくありません。
解法のポイント
この問題を解くには、SQLの基本的な構文、特に `WHERE` 句での条件指定方法を理解していることが重要です。複数の候補の中からいずれかに一致するデータを探す「OR条件」を表現する方法として、`OR` 演算子を直接使う方法と、`IN` 演算子を使う方法の2つを知っているかが問われています。`IN` 演算子は `()` 内にカンマ区切りで複数の値を指定できる便利な機能です。この使い方を覚えておけば、同様の問題に迅速に対応できます。`AND` と `OR` の違いや、`LIKE` の用途も合わせて復習しておくと万全です。
用語補足
SQL (Structured Query Language):
リレーショナルデータベースを操作するための言語です。データの検索、追加、更新、削除などを行います。
SELECT文:
データベースからデータを検索し、取り出すためのSQL命令です。「SELECT 列 FROM 表 WHERE 条件」が基本的な形です。
IN演算子:
`WHERE` 句で使われ、指定した値のリストのいずれかに一致するデータを検索します。`列 IN (値1, 値2, …)` のように使用します。
OR演算子:
複数の条件のうち、いずれか一つでも満たしていれば真(True)となる論理演算子です。「AまたはB」を意味します。


