OSS-DB Silver 暗記 C-1-2
開発/SQL(32%):::SQL:データ型【重要度:13】dokoQL可
- 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京
暗記
- serial と int が対応する
- 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型
- 書式:interval ‘quantity unit’
- quantity:(符号付き)時間量
- unit:単位:year, month, day, hour, minute, etc.
- 例 :interval ’30 days’
- 書式:interval ‘quantity unit’
=> 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} ---------
参考
- IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/ACCEL/OPCEL
- PostgreSQL 11.5文書
- OSS教科書 OSS-DB Silver Ver2.0対応
- 徹底攻略OSS-DB Silver問題集[Ver.2.0]対応
- dokoQL 学習用オンラインSQL実行環境
- スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)