問16:SQLにおいて、ある条件に基づいて出力を分岐させる(プログラミングのif-then-elseのような制御を行う)ために、SELECT句の中で用いられる標準的な構文(式)として、最も適切なものはどれか。
- A:IF…THEN…ELSE構文
- B:SWITCH…CASE構文
- C:CASE WHEN…THEN…ELSE…END式
- D:DECODE演算子
- E:BRANCH句
【第16問:正解と解説】
正解:C
【解説】
・A:不適切:IF文は一部のストアドプロシージャ(PL/SQLなど)の内部で使われますが、標準SQLのSELECT句の内部でインラインで値を分岐させる式ではありません。
・B:不適切:SWITCH…CASEはC言語やJavaなどのプログラミング言語の構文であり、標準SQLには存在しません。
・C:適切:標準SQLにおいて、条件に応じて「1000以上ならA、500以上ならB、それ以外はC」といった条件分岐を出力列として作り出すには、CASE式(CASE WHEN 条件 THEN 値 ELSE 値 END)を使用します。
・D:不適切:DECODEはOracle固有の関数であり、標準SQLの構文ではありません。標準SQLではCASE式を使用します。
・E:不適切:BRANCH句は標準SQLに存在しない架空の構文名です。
問17:相関副問い合わせ(相関サブクエリ)でよく使用され、副問い合わせの条件に合致するレコードが「1件でも存在するかどうか」のみを判定し、存在すれば真(True)を返すための演算子として、最も適切なものはどれか。
- A:LIKE
- B:ANY
- C:BETWEEN
- D:EXISTS
- E:ALL
【第17問:正解と解説】
正解:D
【解説】
・A:不適切:LIKEは文字列のパターンマッチング(あいまい検索)を行う演算子です。
・B:不適切:ANY演算子は、サブクエリが返す値のいずれか1つと比較条件が一致すれば真を返すものです。EXISTSのように「存在するかどうか」のみを判定するわけではありません。
・C:不適切:BETWEENは、ある値が指定した範囲(下限値以上かつ上限値以下)に含まれるかを判定する演算子です。レコードの存在確認には使用しません。
・D:適切:EXISTS演算子は、サブクエリがデータを「1件以上返したか(存在したか)」をチェックします。1件でも見つかった時点でTrueが確定するため、IN句などに比べて内部的なスキャン処理が高速に行われるケースが多く、高度な絞り込みで多用されます。
・E:不適切:ALL演算子は、サブクエリが返す全ての値に対して比較条件が成立する場合に真を返します。存在の有無を判定するEXISTSとは異なります。
問18:次のSQL文を実行した際、検索結果として表示される「列」の構成として、最も適切なものはどれか。なお、このSQLでは「自己結合(Self Join)」が行われている。 SELECT A.社員名 AS 社員, B.社員名 AS 上司 FROM 社員テーブル A JOIN 社員テーブル B ON A.上司社員番号 = B.社員番号;
- A:社員テーブルから、全社員の「社員名」と「上司社員番号の数値」の2つの列が表示される。
- B:システムエラーとなり何も出力されない(同じテーブル名を1つのSQL文の中に2回記述することは文法違反である)。
- C:社員テーブルのデータが、上司のいない一般社員の行だけを除外して、元のテーブルのすべての列がそのまま横に2倍に広がって表示される。
- D:上司と部下の関係にある2人の社員データを、縦方向にガッチャンコして統合した1つの「社員名」列のみが表示される。
- E:同じテーブルを2つの役割(AとB)に分けて結合しており、画面には「社員」と「上司」という名前の2つの列(どちらも氏名の文字列)が表示される。
【第18問:正解と解説】
正解:E
【解説】
・A:不適切:B.社員名を取得しているため、数値の番号ではなく、上司の「氏名(文字列)」が出力されます。
・B:不適切:同一テーブルに対して異なるエイリアス(別名)を付けて結合する「自己結合(Self Join)」はSQL標準の有効な技法であり、文法違反ではありません。
・C:不適切:SELECT句で指定しているのは「A.社員名」と「B.社員名」の2列だけであり、元テーブルの全列が横に2倍になるわけではありません。また、上司のいない社員(上司社員番号がNULLの行)はINNER JOINにより除外される点も誤りです。
・D:不適切:UNION等で縦に統合することは行っておらず、2つの氏名列を横に並べて出力するのがこのSQL文の結果です。
・E:適切:自己結合の典型的な例です。1つの「社員テーブル」に対し、部下としての役割のエイリアス(別名)「A」と、上司としての役割のエイリアス「B」を与えて結合しています。SELECT句でASを使って名前を指定しているため、結果の画面には「社員(部下の名前)」と「上司(その人の上司の名前)」という2列の文字列データが出力されます。
問19:トランザクション処理の信頼性を保証する「ACID特性」のうち、一連の処理が「すべて成功して確定(コミット)するか、あるいは全く実行されなかった状態(ロールバック)にするか」のどちらかしか認めない(中途半端な状態の維持を許さない)という性質として、最も適切なものはどれか。
- A:原始性(Atomicity / 不可分性)
- B:一貫性(Consistency / 整合性)
- C:隔離性(Isolation / 孤立性)
- D:永続性(Durability / 持続性)
- E:可用性(Availability)
【第19問:正解と解説】
正解:A
【解説】
・A:適切:ACID特性の「A」にあたる原始性(Atomicity:アトミシティ)の定義です。「All or Nothing(すべてかゼロか)」とも表現され、処理が途中でストップした場合に中途半端なデータを残さず、完全に巻き戻すことを保証します。
・B:不適切:一貫性(Consistency)は、トランザクションの前後でデータベースに定義された整合性制約(外部キー、一意制約など)が常に満たされた正しい状態が維持されるという性質です。
・C:不適切:隔離性(Isolation)は、複数のトランザクションが同時実行された場合でも、互いの処理が干渉せず、あたかも1つずつ順番に実行されたかのように見える性質です。
・D:不適切:永続性(Durability)は、一度コミットされたデータは、その後システム障害やクラッシュが発生しても失われることなく永続的に保持されるという性質です。
・E:不適切:可用性(Availability)はACID特性の一要素ではなく、CAP定理やシステム設計における「システムが常に利用可能な状態であること」を指す概念です。
問20:データベースにおいて、複数のユーザーが同時に同じデータを更新しようとした際に、データの矛盾を防ぐ「排他制御(ロック)」の仕組みのうち、「悲観的(ペシミスティック)ロック」の特徴として、最も適切なものはどれか。
- A:データベース全体のアクセス権を一時的に読み取り専用(リードオンリー)に固定することで、すべての更新処理を翌営業日まで遅延させる制御手法である。
- B:データの更新時には一切ロックをかけず、最後の確定(コミット)の瞬間に他者が更新していないかをチェックし、もし衝突していたら自分の処理全体を破棄してエラーにする。
- C:データの読み込み(参照)を行った時点で対象行を直ちにロックし、自分が更新を終えて確定(コミット)するまで、他のユーザーによるその行の変更をブロックする。
- D:データの更新履歴をブロックチェーン上にすべて記録し、過去の任意の時点へのタイムトラベル(巻き戻し)を可能にする物理的な仕組みである。
- E:悲観的ロックを実行すると、デッドロック(互いのロック解除待ちによるフリーズ)が100%確実に防止されるため、設計上のケアが不要になる。
【第20問:正解と解説】
正解:C
【解説】
・A:不適切:データベース全体を読み取り専用に固定するような制御は、一般的な排他制御(ロック)の仕組みではありません。
・B:不適切:更新時にロックをかけず、コミット直前に衝突を検知して処理を破棄するのは「楽観的(オプティミスティック)ロック」の説明です。
・C:適切:悲観的ロック(Pessimistic Locking)の説明です。「データは他者から高確率で同時に書き換えられるだろう」と悲観的に想定し、データを取得した瞬間に他者の更新をブロックする強いロック(SELECT FOR UPDATEなど)をかけます。確実性は高いですが、待ち時間が増えパフォーマンスが低下する傾向があります。
・D:不適切:ブロックチェーンへの記録はデータベースの排他制御の仕組みとは全く関係ありません。
・E:不適切:悲観的ロックはデッドロックを100%防止するものではありません。むしろ、複数トランザクションが互いのロック解除を待ち続ける「デッドロック」が発生するリスクがあるため、タイムアウト設定やロック取得順序の統一などの設計上の配慮が必要です。

コメント