情報処理安全確保支援士試験 令和7年春期午前Ⅱ 相関副問合せ
出典:令和7年春期 午前Ⅱ 問21
分野:データベース / データ操作
"従業員"表に対して,SQL文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表し,表中のNULLは値が存在しないことを表す。
従業員
〔SQL文〕
SELECT 従業員コード FROM 従業員 X
WHERE NOT EXISTS
(SELECT * FROM 従業員 Y WHERE X.従業員コード = Y.上司)
従業員
|
上司 | 従業員名 |
| S001 | NULL | A |
| S002 | S001 | B |
| S003 | S001 | C |
| S004 | S003 | D |
| S005 | NULL | E |
| S006 | S005 | F |
| S007 | S006 | G |
- ア:
従業員コード
S001
S003
S005
S006 - イ:
従業員コード
S001
S005 - ウ:
従業員コード
S002
S004
S007 - エ:
従業員コード
S003
S006
TSUNAGARU-ADVICE
まず押さえたいこと
このSQLは、従業員表をXとYの二つの名前で参照し、Xの従業員コードを上司として持つ行が存在しない従業員を探しています。つまり、部下がいない従業員を抽出するSQLです。
迷ったときの判断軸
NOT EXISTSは、内側のSELECTで条件に合う行が1件もないときに真になります。今回なら、Y.上司に自分の従業員コードが出てこない人を選ぶと考えると判断しやすくなります。
科目Bにつなげるために
科目Bでは、相関副問合せを見たときに、外側の表と内側の表がどの列で対応付けられているかを読み取る力が問われます。EXISTSは「存在するか」、NOT EXISTSは「存在しないか」を調べるものとして、条件式の意味を日本語に置き換えて考えることが重要です。※DB関連試験向け
このSQLは、
SELECT 従業員コード
FROM 従業員 X
WHERE NOT EXISTS
(SELECT *
FROM 従業員 Y
WHERE X.従業員コード = Y.上司)
なので、意味としては、「自分の従業員コードが、誰かの「上司」列に存在しない従業員を抽出する」という処理です。
【上司として登場している従業員コード】
上司表の「上司」列を見ると、NULLを除いて次の値があります。
つまり、上司として登場しているのは次の4人です。
【上司として登場していない従業員コード】
全従業員は、
このうち、上司として登場していないのは、下記です。
したがって、実行結果は S002,S004,S007 です。