PostgreSQLのデータ型(数値、文字、通貨、配列)について
この記事はPostgreSQL公式ドキュメントを参考にしました。詳細は以下のページをご覧ください。
- タイトル: PostgreSQL 15.0文書 第8章 データ型
- URL: https://www.postgresql.jp/document/15/html/datatype.html
- 出典元: PostgreSQL.JP
数値型
型名 | 格納サイズ | 説明 | 範囲 |
---|---|---|---|
smallint | 2バイト | 狭範囲の整数 | -32768から+32767 |
integer | 4バイト | 典型的に使用する整数 | -2147483648から+2147483647 |
bigint | 8バイト | 広範囲整数 | -9223372036854775808から+9223372036854775807 |
decimal | 可変長 | ユーザ指定精度、正確 | 小数点より上は131072桁まで、小数点より下は16383桁まで |
numeric | 可変長 | ユーザ指定精度、正確 | 小数点より上は131072桁まで、小数点より下は16383桁まで |
real | 4バイト | 可変精度、不正確 | 6桁精度 |
double precision | 8バイト | 可変精度、不正確 | 15桁精度 |
smallserial | 2バイト | 狭範囲自動整数 | 1から32767 |
serial | 4バイト | 自動増分整数 | 1から2147483647 |
bigserial | 8バイト | 広範囲自動増分整数 | 1から9223372036854775807 |
1.smallint
このデータ型は、範囲が限定的な整数を格納するのに適しています。例えば、学生の成績を格納するために使用することができます。成績は通常、0から100の範囲であるため、smallint型はこの用途に適しています。また、年齢や月の日数(1から31)など、範囲が小さい整数値を格納する場合にも使用できます。
使用例:
CREATE TABLE grades (
student_id SERIAL PRIMARY KEY,
grade SMALLINT
);
このコードは、「grades」という名前のテーブルを作成します。テーブルには2つの列があります:student_id
とgrade
。student_id
は自動的に増分する整数(SERIAL
型)で、各学生を一意に識別します。grade
はSMALLINT
型で、学生の成績を格納します。
2.integer
このデータ型は、より広範囲の整数を格納するのに適しています。例えば、人口の数を格納するために使用することができます。人口は通常、数千から数億の範囲であるため、integer型はこの用途に適しています。また、商品の在庫数や、ウェブサイトのページビュー数など、範囲が大きい整数値を格納する場合にも使用できます。
使用例:
CREATE TABLE population (
city_id SERIAL PRIMARY KEY,
population INTEGER
);
このコードは、「population」という名前のテーブルを作成します。テーブルには2つの列があります:city_id
とpopulation
。city_id
は自動的に増分する整数(SERIAL
型)で、各都市を一意に識別します。population
はINTEGER
型で、各都市の人口を格納します。
3.bigint
このデータ型は、非常に大きな整数を格納するのに適しています。例えば、社会保障番号やクレジットカード番号などの長い数値を格納するために使用することができます。また、非常に大きなデータセットを扱う場合や、TwitterのツイートIDのように急速に増加するIDを格納する場合にも使用できます。
使用例:
CREATE TABLE citizens (
citizen_id SERIAL PRIMARY KEY,
social_security_number BIGINT
);
このコードは、「citizens」という名前のテーブルを作成します。テーブルには2つの列があります:citizen_id
とsocial_security_number
。citizen_id
は自動的に増分する整数(SERIAL
型)で、各市民を一意に識別します。social_security_number
はBIGINT
型で、市民の社会保障番号を格納します。
4.decimal,numeric
これらのデータ型は、精度が重要な数値を格納するのに適しています。例えば、金融取引での金額や、科学的な計算結果を格納するために使用することができます。これらのデータ型は、小数点以下の桁数をユーザーが指定できるため、金融計算や工学的な計算など、精度が要求される場面で使用されます。
使用例:
CREATE TABLE transactions (
transaction_id SERIAL PRIMARY KEY,
amount DECIMAL(10, 2)
);
このコードは、「transactions」という名前のテーブルを作成します。テーブルには2つの列があります:transaction_id
とamount
。transaction_id
は自動的に増分する整数(SERIAL
型)で、各取引を一意に識別します。amount
はDECIMAL
型で、取引の金額を格納します。
5.real
このデータ型は、精度がそれほど重要でない浮動小数点数を格納するのに適しています。例えば、気温や身長などの測定値を格納するために使用することができます。これらの値は通常、完全な精度が必要ないため、real型はこのような用途に適しています。
使用例:
CREATE TABLE temperatures (
measurement_id SERIAL PRIMARY KEY,
temperature REAL
);
このコードは、「temperatures」という名前のテーブルを作成します。テーブルには2つの列があります:measurement_id
とtemperature
。measurement_id
は自動的に増分する整数(SERIAL
型)で、各測定を一意に識別します。temperature
はREAL
型で、測定された気温を格納します。
6.double precision
このデータ型は、より高い精度の浮動小数点数を格納するのに適しています。例えば、科学的な計算結果や、GPS座標などの精密な測定値を格納するために使用することができます。これらの値は通常、高い精度が必要なため、double precision型はこのような用途に適しています。
使用例:
CREATE TABLE locations (
location_id SERIAL PRIMARY KEY,
latitude DOUBLE PRECISION,
longitude DOUBLE PRECISION
);
このコードは、「locations」という名前のテーブルを作成します。テーブルには3つの列があります:location_id
、latitude
、longitude
。location_id
は自動的に増分する整数(SERIAL
型)で、各位置を一意に識別します。latitude
とlongitude
はDOUBLE PRECISION
型で、位置の緯度と経度を格納します。
7.smallserial,serial,bigserial
これらのデータ型は、自動的に増分する整数を格納するのに適しています。これらは主に、データベースの各行に一意のIDを割り当てるための主キーとして使用されます。例えば、ユーザーIDや商品IDなどを格納するために使用することができます。これらのデータ型は、新しいレコードが追加されるたびに自動的に次の数値を生成するため、手動で一意のIDを生成する手間を省くことができます。
使用例:
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
username VARCHAR(50)
);
このコードは、「users」という名前のテーブルを作成します。テーブルには2つの列があります:user_id
とusername
。user_id
は自動的に増分する整数(SERIAL
型)で、各ユーザーを一意に識別します。username
はVARCHAR
型で、ユーザーの名前を格納します。
文字型
型名 | 説明 |
---|---|
character varying(n), varchar(n) | 上限付き可変長 |
character(n), char(n) | 空白で埋められた固定長 |
text | 制限なし可変長 |
1.character varying(n), varchar(n)
このデータ型は、最大長がnの可変長文字列を格納します。nは任意の正の整数で、最大長を指定します。このデータ型は、長さが一定でない文字列を格納するのに適しています。例えば、人々の名前やメールアドレスなど、長さが異なる可能性があるデータを格納するのに使用できます。
使用例:
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(255)
);
このコードは、「users」という名前のテーブルを作成します。テーブルには3つの列があります:user_id
、name
、email
。user_id
は自動的に増分する整数(SERIAL
型)で、各ユーザーを一意に識別します。name
とemail
はVARCHAR
型で、それぞれユーザーの名前とメールアドレスを格納します。
2.character(n), char(n)
このデータ型は、長さがnの固定長文字列を格納します。nは任意の正の整数で、文字列の長さを指定します。このデータ型は、長さが一定の文字列を格納するのに適しています。例えば、国コードや州コードなど、長さが一定のデータを格納するのに使用できます。
使用例:
CREATE TABLE countries (
country_id SERIAL PRIMARY KEY,
country_code CHAR(2)
);
このコードは、「countries」という名前のテーブルを作成します。テーブルには2つの列があります:country_id
とcountry_code
。country_id
は自動的に増分する整数(SERIAL
型)で、各国を一意に識別します。country_code
はCHAR
型で、2文字の国コードを格納します。
3.text
このデータ型は、制限なしの可変長文字列を格納します。このデータ型は、長さが非常に長い可能性がある文字列を格納するのに適しています。例えば、記事の本文やユーザーのコメントなど、長さが一定でないデータを格納するのに使用できます。
使用例:
CREATE TABLE articles (
article_id SERIAL PRIMARY KEY,
content TEXT
);
このコードは、「articles」という名前のテーブルを作成します。テーブルには2つの列があります:article_id
とcontent
。article_id
は自動的に増分する整数(SERIAL
型)で、各記事を一意に識別します。content
はTEXT
型で、記事の本文を格納します。
通貨型
型名 | 格納サイズ | 説明 | 範囲 |
---|---|---|---|
money | 8バイト | 貨幣金額 | -92233720368547758.08 から +92233720368547758.07 |
もちろんです、以下にPostgreSQLの通貨型についての説明と使用例をまとめます。
money
このデータ型は、通貨の金額を格納します。このデータ型は、金額の範囲が-92233720368547758.08から+92233720368547758.07の間である場合に使用します。このデータ型は、商品の価格や取引の金額など、通貨の金額を格納するのに適しています。
使用例:
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
price MONEY
);
このコードは、「products」という名前のテーブルを作成します。テーブルには2つの列があります:product_id
とprice
。product_id
は自動的に増分する整数(SERIAL
型)で、各商品を一意に識別します。price
はMONEY
型で、商品の価格を格納します。
ただし、money
型は通貨記号や小数点以下の桁数など、ロケールに依存する形式を使用します。そのため、国際的なアプリケーションでは、金額をnumeric
やdecimal
型で格納し、アプリケーション側で通貨形式を処理することが推奨されます。
日付/時刻データ型
型名 | 格納サイズ | 説明 | 最遠の過去 | 最遠の未来 | 精度 |
---|---|---|---|---|---|
timestamp [ (p) ] [ without time zone ] | 8 バイト | 日付と時刻両方(時間帯なし) | 4713 BC | 294276 AD | 1マイクロ秒 |
timestamp [ (p) ] with time zone | 8バイト | 日付と時刻両方、時間帯付き | 4713 BC | 294276 AD | 1マイクロ秒 |
date | 4バイト | 日付(時刻なし) | 4713 BC | 5874897 AD | 1日 |
time [ (p) ] [ without time zone ] | 8バイト | 時刻(日付なし) | 00:00:00 | 24:00:00 | 1マイクロ秒 |
time [ (p) ] with time zone | 12 バイト | 時刻(日付なし)、時間帯付き | 00:00:00+1559 | 24:00:00-1559 | 1 マイクロ秒 |
interval [ fields ] [ (p) ] | 16バイト | 時間間隔 | -178000000年 | 178000000年 | 1マイクロ秒 |
1.timestamp [ (p) ] [ without time zone ]
このデータ型は、日付と時刻の両方を格納しますが、時間帯の情報は含まれません。これは、特定の瞬間を表すのに適していますが、その瞬間がどの時間帯で発生したかは考慮されません。例えば、あるイベントが特定の日時に発生したという情報を格納するのに使用できます。
使用例:
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
event_time TIMESTAMP WITHOUT TIME ZONE
);
このコードは、「events」という名前のテーブルを作成します。テーブルには2つの列があります:event_id
とevent_time
。event_id
は自動的に増分する整数(SERIAL
型)で、各イベントを一意に識別します。event_time
はTIMESTAMP WITHOUT TIME ZONE
型で、イベントが発生した日時を格納します。
2.timestamp [ (p) ] with time zone
このデータ型も日付と時刻の両方を格納しますが、時間帯の情報も含まれます。これは、特定の瞬間を表すのに適しており、その瞬間がどの時間帯で発生したかも考慮されます。例えば、国際的なビデオ会議のスケジュールを格納するのに使用できます。
使用例:
CREATE TABLE meetings (
meeting_id SERIAL PRIMARY KEY,
meeting_time TIMESTAMP WITH TIME ZONE
);
このコードは、「meetings」という名前のテーブルを作成します。テーブルには2つの列があります:meeting_id
とmeeting_time
。meeting_id
は自動的に増分する整数(SERIAL
型)で、各会議を一意に識別します。meeting_time
はTIMESTAMP WITH TIME ZONE
型で、会議が開催される日時と時間帯を格納します。
3.date
このデータ型は、日付のみを格納します。これは、特定の日を表すのに適していますが、その日の中の特定の時刻は考慮されません。例えば、誕生日や記念日を格納するのに使用できます。
使用例:
CREATE TABLE birthdays (
person_id SERIAL PRIMARY KEY,
birthday DATE
);
このコードは、「birthdays」という名前のテーブルを作成します。テーブルには2つの列があります:person_id
とbirthday
。person_id
は自動的に増分する整数(SERIAL
型)で、各人物を一意に識別します。birthday
はDATE
型で、人物の誕生日を格納します。
4.time [ (p) ] [ without time zone ]
このデータ型は、時刻のみを格納しますが、時間帯の情報は含まれません。これは、特定の時刻を表すのに適していますが、その時刻がどの日に発生したかや、どの時間帯で発生したかは考慮されません。例えば、毎日のアラーム時間を格納するのに使用できます。
使用例:
CREATE TABLE alarms (
alarm_id SERIAL PRIMARY KEY,
alarm_time TIME WITHOUT TIME ZONE
);
このコードは、「alarms」という名前のテーブルを作成します。テーブルには2つの列があります:alarm_id
とalarm_time
。alarm_id
は自動的に増分する整数(SERIAL
型)で、各アラームを一意に識別します。alarm_time
はTIME WITHOUT TIME ZONE
型で、アラームが鳴る時刻を格納します。
5.time [ (p) ] with time zone
このデータ型も時刻のみを格納しますが、時間帯の情報も含まれます。これは、特定の時刻を表すのに適しており、その時刻がどの時間帯で発生するかも考慮されます。例えば、異なる時間帯でのテレビ番組の放送時間を格納するのに使用できます。
使用例:
CREATE TABLE broadcasts (
broadcast_id SERIAL PRIMARY KEY,
broadcast_time TIME WITH TIME ZONE
);
このコードは、「broadcasts」という名前のテーブルを作成します。テーブルには2つの列があります:broadcast_id
とbroadcast_time
。broadcast_id
は自動的に増分する整数(SERIAL
型)で、各放送を一意に識別します。broadcast_time
はTIME WITH TIME ZONE
型で、放送が開始される時刻と時間帯を格納します。
6.interval [ fields ] [ (p) ]
このデータ型は、時間の間隔を格納します。これは、2つの瞬間の間の時間の長さを表すのに適しています。例えば、プロジェクトの期間や、あるイベントから別のイベントまでの待ち時間を格納するのに使用できます。
使用例:
CREATE TABLE projects (
project_id SERIAL PRIMARY KEY,
duration INTERVAL
);
このコードは、「projects」という名前のテーブルを作成します。テーブルには2つの列があります:project_id
とduration
。project_id
は自動的に増分する整数(SERIAL
型)で、各プロジェクトを一意に識別します。duration
はINTERVAL
型で、プロジェクトの期間を格納します。
配列型
PostgreSQLでは、テーブルの列を配列として定義することができます。配列とは、同じ型のデータを順序付けて格納するデータ構造のことを指します。配列は一次元(つまりリスト)であることも、二次元(つまりテーブル)であることも、それ以上の次元を持つこともあります。
以下の例では、sal_emp
というテーブルを作成しています。このテーブルには、name
(従業員の名前)、pay_by_quarter
(四半期ごとの給与)、schedule
(スケジュール)という3つの列があります。name
はテキスト型、pay_by_quarter
は整数の一次元配列、schedule
はテキストの二次元配列として定義されています。
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
);
配列の要素にアクセスするには、大括弧[]
内にインデックス(位置)を指定します。インデックスは1から始まります。例えば、pay_by_quarter[1]
はpay_by_quarter
配列の最初の要素を指します。
SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];
このSQL文は、第1四半期と第2四半期の給与が異なる従業員の名前を選択します。
配列の一部を切り出すには、:
を使用して範囲を指定します。例えば、schedule[1:2][1:1]
はschedule
配列の最初の2つの要素からなる部分配列を指します。
SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';
このSQL文は、名前が'Bill'の従業員のスケジュールの最初の2日間を選択します。
配列の全要素数を取得するには、cardinality
関数を使用します。
SELECT cardinality(schedule) FROM sal_emp WHERE name = 'Carol';
このSQL文は、名前が'Carol'の従業員のスケジュールに含まれる要素の総数を返します。
以上が、PostgreSQLの配列型についての基本的な説明です。配列は、同じ型の複数のデータを一つの列に格納するための便利なデータ型です。
Discussion