PREPARATION
受験対策

Silverの例題解説
「S3.1 SQLコマンド(データ型)」

「S3 開発/SQL - S3.1 SQLコマンド(データ型)」からの出題です。

例題

3.181

以下のSQLを順次実行して、テーブルtestを作り、行を作成した。

create table test(id integer, r real, n numeric);
insert into test(id, r, n) values (1, 0.1, 0.1), (2, 1.0/3, 1.0/3);

以下の説明から適切なものをすべて選びなさい。


  1. select r*10 from test where id = 1 は必ず 1 を返す。

  2. select n*10 from test where id = 1 は必ず 1 を返す。

  3. select r*3 from test where id = 2 は必ず 1 を返す。

  4. select n*3 from test where id = 2 は必ず 1 を返す。

  5. select r - n from test; はどの行も0を返す。


※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2025年11月26日

解答と解説

PostgreSQLで小数点以下のデータを含む実数を表現するには、浮動小数点数のREAL(単精度)、DOUBLE PRECISION(倍精度)あるいは10進数のNUMERIC(またはDECIMAL)を利用することができます。
浮動小数点はデータをコンピュータの内部表現である2進数で扱っているため、高速な演算が可能ですが、0.1のような10進の小数を正確に表現することができず、例えば0.1を10倍してもそれがちょうど1になることが保証されません。
NUMERIC型は数値を10進数で表現するため、演算速度が遅くなりますが、演算の結果は正確になり、0.1の10倍はちょうど1になります。
一方で、1を3で割った結果(整数演算だとゼロになるため、例題では 1.0 / 3 としています)は0.3333.... となりますが、これは2進数でも10進数でも正確に表現することはできず、これを3倍してもちょうど1になることは保証されません。
0.1も1/3もREAL型とNUMERIC型でそれぞれ異なる値に表現されるため、r - n を計算したときに、これが0になることも保証されません。

したがって正解はBです。


1/10と1/3をそれぞれ10倍、3倍しても1になることが保証されない(誤差が含まれる)、というのはコンピュータで実数を扱う上での一般的な話ですが、データベースでは0.1など有限桁数の小数については、誤差なく正確に計算できる10進演算の仕組みがある、ということを理解しておいてください。

例題および解説は、ボランティアをはじめとした協力者によって作成されたものであり、実際の試験問題とは異なります。

ご質問やご意見、誤記等のご連絡は、こちらまでお願いします。
※実際の試験問題に関するお問い合わせについてはご回答いたしかねます。あからじめご了承ください。

企業の基幹システムや業務システム、AIなどの
新領域での「PostgreSQL」の採用が拡大している中、
昇格・昇給・就職・転職に必ず役立つ認定です

OSS-DBの受験対策

受験の学習をサポートする情報や対策に役立つ情報をご紹介

例題解説

例題のアーカイブを試験ごとにまとめています。OSS-DB技術者認定試験の学習にお役立てください

学習教材・教育機関ご紹介

OSS-DB認定教材や教育機関について詳しくご説明いたします。

無料技術解説セミナー

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

OSS-DB道場

OSS-DBやPostgreSQLの知識、技術を得るために役立つ情報の紹介やコラムを公開しています。