問題6
次の中から実行時にエラーにならないSQL文を選びなさい。

a:
SELECT ename,MAX(sal) FROM emp GROUP BY deptno;
b:
SELECT deptno,AVG(sal) FROM emp HAVING deptno >= 20 GROUP BY deptno;
c:
SELECT deptno,MAX(sal) FROM emp WHERE MAX(sal) >= 2000 GROUP BY deptno;

 正解はbです。

 GROUP BY句やグループ関数が選択肢に出てきたら,次の2つのポイントを思い出しましょう(第4回参照)。

(1)SELECT句,HAVING句,ORDER BY句には,グループ関数またはGROUP BY句で指定した列を使用しなければいけない。
(2)WHERE句には,グループ関数を使用した比較条件は記述できない。

 これを思い出すことができれば,選択肢aは,SELECT句にGROUP BY句では指定していない「ename」列を使用していますので文法エラーになり,実行時にエラーになることがわかります。選択肢cは,WHERE句にグループ関数を使用しているため,やはり実行時にエラーになります。

 この2つのポイントを思い出さないと,「選択肢aは,各部門ごとに最も金額の大きい給料(sal)をもらっている社員の名前(ename)を求めているSQLみたいだから,きっとエラーにはならないだろう」と思ってしまい,正解を見つけることが困難になることでしょう。

問題7
dept表には,deptno,dname,locの3列があります。deptno列には,PRIMARY KEY制約が宣言されていますが,他の列は制約ならびにデフォルト値の定義はしていません。次の中から,loc列にnullを挿入しているSQL文を選びなさい。

a:
INSERT INTO emp VALUES(10,’Education’);
b:
INSERT INTO emp VALUES(10,’Education’,’null’);
c:
INSERT INTO emp (dname,deptno ) VALUES(’Education’,10);

 正解はcです。

 設問では,deptno列にPRIMARY KEY制約が宣言されているだけで,他の列は制約ならびにデフォルト値の定義はしていないと言っているので,loc列にnullを挿入するためには,明示的にnullと指定するか,あるいは挿入時に挿入する値を省略します。挿入する値を省略すれば,自動的にnullが挿入されます。

 選択肢aは,VALUES句内に値が2つしかないので,挿入する値を省略していることがわかります。挿入する値を省略する場合は,選択肢cのように,値を挿入する列名を明示的に指定しなければいけません。しかし,選択肢aは列名を指定していないため,実行時にエラーになります。なお,列名を指定するとき,列の順序とVALUES句の値の順序が対応していなければいけません。

 選択肢bは,VALUES句で明示的にnullを指定しているように見えますが,指定の仕方が間違っています。明示的にnullを挿入する場合,nullを単一引用符「’」で囲んではいけません。単一引用符で囲むと,null値ではなく「null」という文字列を挿入することになります。明示的にnullを挿入する場合は,「INSERT INTO emp VALUES(10,’Education’,null)」とします。「INSERT」を含むDML文について復習したい人は,第8回をご覧ください。

問題8
次の中から正しい説明をすべて選びなさい。

a:ALTER SEQUENCE文を使用して,開始値(START WITH)を変更することができる。
b: ALTER VIEW文を使用して,ビューの元となる問合せを変更することができる。
c:ALTER TABLE文を使用して,2列目と3列目の間に,新しい列を追加することができる。
d:CREATE INDEX文を使用して,PRIMARY KEYまたはUNIQUE制約を宣言していない列にも索引を定義することができる。
e:DROP TABLE文を使用して表を削除すると,その表に定義されているすべての索引,その表を元にして作成されたすべてのビュー,その表で使用されていたすべての順序も一緒に削除することができる。

 正解はdです。この問題には,これまでに学習していない内容が含まれていますが,この機会に覚えておきましょう。

選択肢a:ALTER SEQUENCE文を使用して既存の順序を変更することができますが,開始値(START WITH)は変更できません。

選択肢b:「ALTER VIEW」というSQL文はありません。ビューの変更を行う場合は,DROPして再度CREATEするか,CREATE OR REPLACE文を使用します。

選択肢c:ALTER TABLE文を使用して列の追加はできますが,追加される列は既存の列の最後に追加されます。既存の列の間に追加することはできません。

選択肢d:DROP TABLE文を使用して表を削除すると,その表に定義されているすべての索引が一緒に削除されますが,その表を元にして作成されたビュー,およびその表で使用されていた順序は削除されません。

 表,ビュー,順序,索引などのデータベースオブジェクトについて復習したい人は,第9回をご覧ください。

 いかがでしたか?技術的な内容だけでなく,どのように問題を解いていくかというヒントも申し上げたつもりです。「過去に解いたことのない設問が出てきたから正解できなかった」という話を時々耳にしますが,問題の本質を見抜くことができれば,どういう表現の設問が出題されようが,正解は導けるはずです。今回の8問を難しいと感じた方は,もう一度,第1回から復習してみてください。皆さんの合格を心から祈っています。

 「Bronze SQL基礎I」に合格したら,次は「Bronze DBA」の学習を始めましょう。次回からBronze DBA編を,9回(腕試しテストを含む)にわたって開設する予定です。

林 優子
システム・テクノロジー・アイ 取締役副社長。日本オラクルの教育ビジネスのスタートアップを全面的に支援し,Oracle歴十数年のベテラン講師として知る人も多い。著作は「オラクルマスター教科書」(翔泳社)など多数。2005年,日本オラクルよりBest Instructor of the Year賞を受賞。また2006年には,日本オラクルが主催するOracle Award 2006において,オラクル研修ビジネスに最も貢献したパートナーに贈られるOracle University Partner of the yearをシステム・テクノロジー・アイが受賞した。

この先は会員の登録が必要です。有料会員(月額プラン)は申し込み初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら