dokoQLOSS-DBプログラム

OSS-DB Silver 暗記 C-1-2

開発/SQL(32%):::SQL:データ型【重要度:13】dokoQL可

PostgreSQL 11.5文書:データ型

 

  • dokoQL で実習が可能です

 

数値データ型

整数型

  • smallint:2バイト -32,768~+32,767
  • integer(int):4バイト -21億~21億
  • bigint:8バイト -922京~+922京

 

  暗記  

  • 256, 65536, 42億, 1,800京

 

    • 256(ニゴロ), 65536(ロクゴーゴーサンロク)
    • 42億(MLB最高年俸:2020年)[~46億年:太陽系年齢]
    • 1,800京(≒40億×40億=1,600京)

 

  暗記  

  • 2バイトsmallint, 4バイトint, 8バイトbigint
  • 百×百は万、万×万は億、億×億は京

 

    • 1 バイト(28=256)は256なので、
    • 2 バイトは 256×256≒200×300=60,000 → 65,536
    • 4 バイトは 65,536×65,536≒6万×7万=42億(億=万×万)
    • 8 バイトは 42億×42億≒40億×40億=1,600京(京=億×億)

 

 

浮動小数点型

  • real:4バイト
    • 精度:6桁、例:1.23456
    • 範囲:1E-37~1E+37
  • double precision:8バイト
    • 精度:15桁、例:1.23456789012345
    • 範囲:1E-308~1E+308

 

任意の精度を持つ数

  • numeric( precision, scale ) / decimal
    • 精度(precision):147,455(131,072+16,383)まで
    • 位取り(scale):16,383まで
    • 副作用:四捨五入

 

CREATE TABLE numericTest (
	c1 numeric(4,3)   -- precision:4, scale:3
);
INSERT INTO numericTest VALUES (3.141592);
--------
   c1
--------
  3.142
--------

 

自動採番型

  • smallserial:2バイト:1~32767
  • serial:4バイト:1~2147483647
  • bigserial:8バイト:1~922京

 

  暗記  

  • serialint が対応する
    • smallserial:65536 → 1~32500ぐらい
    • serial:6万×7万=42億 → 1~21億ぐらい
    • bigserial:42億×42億≃40億×40億=1600京 → 1~800京ぐらい

 

 

文字型

  • varchar(n), character varying(n):n は文字数
    • 読み:バーチャー
    • 意味:上限付き可変長
  • char(n), character(n) :n は文字数
    • 読み:チャー
    • 意味:空白で埋められた固定長
  • text
    • 意味:制限なし可変長

 

 

バイナリ型

  • bytea:可変長のバイナリ列

 

 

日付/時刻データ型

  • TIMESTAMP
    • 例 :2020-11-01 12:00:00.123456+09
    • 説明:+09:timezone
    • 精度:1マイクロ秒
    • 対応:current_timestamp, statement_timestamp(), clock_timestamp()

 

=> SET timezone to 'UTC';             -- timezone:UTC
=> SELECT current_timestamp;
-------------------------------
        current_timestamp
-------------------------------
 2020-10-11 03:52:52.798392+00        -- +00:timezone
-------------------------------

 

=> SET timezone to 'japan';           -- timezone:Japan
=> SELECT current_timestamp;
-------------------------------
        current_timestamp
-------------------------------
 2020-10-12 12:52:52.798392+09        -- +09:timezone
-------------------------------

 

  • DATE
    • 例 :2020-11-01
    • 対応:current_date

 

  • TIME
    • 例 :12:00:00.123456+09
    • 対応:current_time
=> SELECT current_time;
--------------------
    current_time
--------------------
 12:28:34.580359+09
--------------------

 

  • INTERVAL
    • 書式:intervalquantity unit
      • quantity:(符号付き)時間量
      • unit:単位:year, month, day, hour, minute, etc.
    • 例 :interval ’30 days’
=> SELECT current_date - interval '1 day';
---------------------
      TIMESTAMP
---------------------
 2020-10-11 00:00:00
---------------------
=> SELECT current_timestamp::timestamp + '10 day'::interval;
----------------------------
          TIMESTAMP
----------------------------
 2020-10-22 12:35:01.627517
----------------------------

 

 

 

論理値データ型

  • boolean
    • サイズ:1バイト
    •  値 :不定
      •  :TRUE, ’true’, ‘yes’, ‘on’, ‘1’
      •  :FALSE, ’false’, ‘no’, ‘off’, ‘0’
      • 不定:NULL
    • 注 意:
      • 文字列固有の接頭辞:’t’, ‘y’, ’f’, ‘n’
      • 大文字小文字は混在可
      • 数値の 0, 1 は使用不可

 

 

オブジェクト識別子型

  • オブジェクト識別子:OID(Object Identifier)
    • サイズ:符号なし4バイト整数
    • 説明 :オブジェクトの識別に用いられるID番号
      • DBC で一意の値を取る

 

 

配列

配列の宣言

  • c1 int[]

 

=> CREATE TABLE array1 (
       c1 int[] );

 

配列への値入力

  • ’{ val-1, val-2, val-3, … }’
  • ’{ { val-11, val-12, …}, { val-21, val-22, … }, … }’

 

=> INSERT INTO array1 VALUES ( '{1, 2, 3}');
   INSERT INTO array1 VALUES ( '{{11,12}, {21,22}, {31,32}}' );
--------------------------
           c1
--------------------------
{1,2,3}
{{11,12},{21,22},{31,32}}
--------------------------

 

配列への問い合わせ

:配列の1番目から2番目までの要素を取得

=> SELECT c1[1:2] FROM array1;
-------------------
         c1
-------------------
 {1,2}
 {{11,12},{21,22}}
-------------------

:c1[1][1]の値が 11の要素を取得

=> SELECT * FROM array1 WHERE c1[1][1]=11;
---------------------------
             c1
---------------------------
 {{11,12},{21,22},{31,32}}
---------------------------

 

配列の更新

 

=> UPDATE array1 SET c1[1]=9 WHERE c1[1]=1;
---------
    c1
---------
 {9,2,3}
---------

 

参考

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です