情報処理安全確保支援士試験 令和7年春期午前Ⅱ 相関副問合せ

出典:令和7年春期 午前Ⅱ 問21 分野:データベース / データ操作
"従業員"表に対して,SQL文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表し,表中のNULLは値が存在しないことを表す。

従業員
    従業員コード
上司 従業員名
S001 NULL A
S002 S001 B
S003 S001 C
S004 S003 D
S005 NULL E
S006 S005 F
S007 S006 G
〔SQL文〕 SELECT 従業員コード FROM 従業員 X  WHERE NOT EXISTS   (SELECT * FROM 従業員 Y WHERE X.従業員コード = Y.上司)
  • ア:
    従業員コード
    S001
    S003
    S005
    S006
  • イ:
    従業員コード
    S001
    S005
  • ウ:
    従業員コード
    S002
    S004
    S007
  • エ:
    従業員コード
    S003
    S006
解説

このSQLは、

SELECT 従業員コード
FROM 従業員 X
WHERE NOT EXISTS
(SELECT *
FROM 従業員 Y
WHERE X.従業員コード = Y.上司)

なので、意味としては、「自分の従業員コードが、誰かの「上司」列に存在しない従業員を抽出する」という処理です。

【上司として登場している従業員コード】
表の「上司」列を見ると、NULLを除いて次の値があります。

上司
  • S001
  • S001
  • S003
  • S005
  • S006

つまり、上司として登場しているのは次の4人です。

  • S001
  • S003
  • S005
  • S006

【上司として登場していない従業員コード】
全従業員は、

  • S001
  • S002
  • S003
  • S004
  • S005
  • S006
  • S007

このうち、上司として登場していないのは、下記です。

  • S002
  • S004
  • S007

したがって、実行結果は S002,S004,S007 です。

TSUNAGARU-ADVICE

まず押さえたいこと

このSQLは、従業員表をXとYの二つの名前で参照し、Xの従業員コードを上司として持つ行が存在しない従業員を探しています。つまり、部下がいない従業員を抽出するSQLです。

迷ったときの判断軸

NOT EXISTSは、内側のSELECTで条件に合う行が1件もないときに真になります。今回なら、Y.上司に自分の従業員コードが出てこない人を選ぶと考えると判断しやすくなります。

科目Bにつなげるために

科目Bでは、相関副問合せを見たときに、外側の表と内側の表がどの列で対応付けられているかを読み取る力が問われます。EXISTSは「存在するか」、NOT EXISTSは「存在しないか」を調べるものとして、条件式の意味を日本語に置き換えて考えることが重要です。※DB関連試験向け