難易度は 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問解く