OracleLevel 3

難易度は Level 1(やさしめ)〜Level 5(難関) の5段階です。

ORACLE MASTER Silver SQL 26aiのサンプル問題(本番形式・解説付き)

ORACLE MASTER Silver SQL 26ai(Oracle・ORACLE MASTER Silver SQL Oracle AI Database 26ai(1Z0-171-JPN))の出題形式を、実際の問題で確かめられます。ここに掲載する5問は、無料の会員登録で解ける模試 第1回(60問)の冒頭から抜粋したオリジナル問題です。当サイトは全240問を本番CBT準拠の形式で収録しており、この5問はそのごく一部にあたります。

設問1

入荷データを在庫表に反映します。在庫表 inventory には (product_id, qty) が (1, 10)・(2, 5) の 2 行、入荷表 incoming には (2, 3)・(3, 7) の 2 行があります。 ```sql MERGE INTO inventory i USING incoming n ON (i.product_id = n.product_id) WHEN MATCHED THEN UPDATE SET i.qty = i.qty + n.qty WHEN NOT MATCHED THEN INSERT (product_id, qty) VALUES (n.product_id, n.qty); ``` 実行後の inventory の内容として正しいものはどれですか。

  • (1, 10)・(2, 8)・(3, 7) の 3 行(正解)
  • (2, 8)・(3, 7) の 2 行
  • (1, 10)・(2, 8) の 2 行
  • (1, 10)・(2, 5)・(3, 7) の 3 行

解説

MERGE は ON 条件で一致した行を UPDATE し、一致しない入荷の行を INSERT します。product_id 2 は在庫が 8 になり、product_id 3 が新しく追加され、入荷表に無い 1 は変更されません。

他の選択肢が誤りである理由

  • 「(2, 8)・(3, 7) の 2 行」入荷表に無い product_id 1 の行も、MERGE では削除されず、そのまま残ります。
  • 「(1, 10)・(2, 8) の 2 行」一致しない product_id 3 の行は、WHEN NOT MATCHED の INSERT で追加されます。
  • 「(1, 10)・(2, 5)・(3, 7) の 3 行」一致した product_id 2 の行は UPDATE で在庫が 5 + 3 の 8 になります。

設問2

次の SELECT 文を実行します。commission_pct は 0.10 が 1 人、0.20 が 1 人、NULL が 7 人です。 SELECT last_name FROM employees WHERE commission_pct <> 0.10; 返される行数はどれですか。

  • 8 行
  • 7 行
  • 1 行(正解)
  • 0 行

解説

<> 0.10 が真になるのは 0.20 の 1 行だけです。NULL との比較は不明になり、NULL の行は含まれません。 「8 行」:NULL の行は <> の比較が不明になり、条件が真にならないので、8 行にはなりません。 「7 行」:7 行は NULL の行の数で、NULL の行は返されません。 「0 行」:0.20 の行は <> 0.10 が真になるので、0 行にはなりません。

他の選択肢が誤りである理由

  • 「8 行」NULL の行は <> の比較が不明になり、条件が真にならないので、8 行にはなりません。
  • 「7 行」7 行は NULL の行の数で、NULL の行は返されません。
  • 「0 行」0.20 の行は <> 0.10 が真になるので、0 行にはなりません。

設問3

どちらか一方の月にしか購入のない顧客 ID だけを抽出したい。 売上表は月ごとに分かれており、customer_id(NUMBER)の 1 列だけを持ちます。 ・sales_jan:1、2、2、3、NULL(5 行) ・sales_feb:2、3、3、4、NULL(5 行) ・sales_mar:3、5(2 行) このデータでは 1 と 4 の 2 行が得られるべきです。その結果を返す問合せはどれですか。

  • SELECT customer_id FROM sales_jan UNION ALL SELECT customer_id FROM sales_feb MINUS SELECT customer_id FROM sales_mar
  • SELECT customer_id FROM sales_jan UNION SELECT customer_id FROM sales_feb MINUS SELECT customer_id FROM sales_jan INTERSECT SELECT customer_id FROM sales_feb
  • (SELECT customer_id FROM sales_jan MINUS SELECT customer_id FROM sales_feb) UNION ALL (SELECT customer_id FROM sales_feb MINUS SELECT customer_id FROM sales_jan)(正解)
  • (SELECT customer_id FROM sales_jan INTERSECT SELECT customer_id FROM sales_feb) UNION ALL (SELECT customer_id FROM sales_jan MINUS SELECT customer_id FROM sales_feb)

解説

集合演算子は左から順に評価されるので、2 つの差を別々に求めて結合するには括弧が必要です。(jan MINUS feb) が 1、(feb MINUS jan) が 4 で、UNION ALL で結ぶと 1 と 4 の 2 行になります。 「SELECT customer_id…」:左から順に評価され、4 だけが返ります。括弧がないため意図した組合せにならず、1 が落ちます。 「(SELECT customer_i…」:共通する 2、3、NULL に 1 を加えた 4 行が返り、求める 1 と 4 になりません。

他の選択肢が誤りである理由

  • 「SELECT customer_id FROM sales_jan UNION ALL SELECT customer_id FROM sales_feb MINUS SELECT customer_id FROM sales_mar」sales_mar にある 3 が除かれるだけで、1、2、4、NULL の 4 行が返ります。月ごとの差は求められません。
  • 「SELECT customer_id FROM sales_jan UNION SELECT customer_id FROM sales_feb MINUS SELECT customer_id FROM sales_jan INTERSECT SELECT customer_id FROM sales_feb」左から順に評価され、4 だけが返ります。括弧がないため意図した組合せにならず、1 が落ちます。
  • 「(SELECT customer_id FROM sales_jan INTERSECT SELECT customer_id FROM sales_feb) UNION ALL (SELECT customer_id FROM sales_jan MINUS SELECT customer_id FROM sales_feb)」共通する 2、3、NULL に 1 を加えた 4 行が返り、求める 1 と 4 になりません。

設問4

社員表(EMPLOYEES)の MANAGER_ID 列には、同じ表の EMPLOYEE_ID 列の値が入っています。この設計について正しい記述はどれですか。

  • 同じ表の主キーを参照する外部キーで、社員とその上司を同じ表の中で結び付ける(正解)
  • 上司がいない社員の行は、外部キーの制約違反となるため登録できない
  • 主キーと同じ値が入るため、MANAGER_ID 列にも主キー制約を付けなければならない
  • 別の表へのリレーションシップを表すため、必ず別表の主キーを参照している

解説

MANAGER_ID は同じ表の主キー EMPLOYEE_ID を参照する自己参照の外部キーです。NULL を許すので上司のいない社員も登録できます。 「上司がいない社員の行は、外部キーの制…」:外部キーの列は NULL を許せば、社長のように上司がいない行も登録できます。 「主キーと同じ値が入るため、MANAG…」:MANAGER_ID の値は複数の部下で重複するので、主キー制約は付けられません。 「別の表へのリレーションシップを表すた…」:外部キーの参照先は同じ表でもよく、このような関係を再帰的な関係や自己参照と呼びます。

他の選択肢が誤りである理由

  • 「上司がいない社員の行は、外部キーの制約違反となるため登録できない」外部キーの列は NULL を許せば、社長のように上司がいない行も登録できます。
  • 「主キーと同じ値が入るため、MANAGER_ID 列にも主キー制約を付けなければならない」MANAGER_ID の値は複数の部下で重複するので、主キー制約は付けられません。
  • 「別の表へのリレーションシップを表すため、必ず別表の主キーを参照している」外部キーの参照先は同じ表でもよく、このような関係を再帰的な関係や自己参照と呼びます。

設問5

社員表 emp102(id、name、salary)の給与列 salary だけを更新できるように、ユーザー d102 に権限を付与します。ほかの列は更新させません。 正しい GRANT 文はどれですか。

  • GRANT UPDATE (salary) ON emp102 TO d102(正解)
  • GRANT UPDATE ON emp102 TO d102
  • GRANT UPDATE ON emp102 TO d102 FOR COLUMN salary
  • GRANT COLUMN UPDATE (salary) ON emp102 TO d102

解説

列単位のオブジェクト権限は、GRANT 権限名 (列名) ON 表名 TO ユーザー の形で付与します。この権限では、指定した列だけを更新でき、ほかの列の UPDATE は権限不足になります。 「…UPDATE ON emp102 T…」:FOR COLUMN という句はありません。列は権限名の後ろの括弧で指定します。 「…COLUMN UPDATE (sal…」:COLUMN というキーワードは使いません。列単位の権限は、権限名の後ろに列名を括弧で書きます。

他の選択肢が誤りである理由

  • 「GRANT UPDATE ON emp102 TO d102」列を指定しないと表全体の UPDATE 権限になり、salary 以外の列も更新できてしまいます。
  • 「GRANT UPDATE ON emp102 TO d102 FOR COLUMN salary」FOR COLUMN という句はありません。列は権限名の後ろの括弧で指定します。
  • 「GRANT COLUMN UPDATE (salary) ON emp102 TO d102」COLUMN というキーワードは使いません。列単位の権限は、権限名の後ろに列名を括弧で書きます。

続きは、会員登録なしでそのまま50問解けます。採点と解説つきで、上と同じ本物の問題です。

登録なしで50問解く