🦔

PostgreSQLのデータ型(数値、文字、通貨、配列)について

2023/07/10に公開

この記事はPostgreSQL公式ドキュメントを参考にしました。詳細は以下のページをご覧ください。

数値型

型名 格納サイズ 説明 範囲
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_idgradestudent_idは自動的に増分する整数(SERIAL型)で、各学生を一意に識別します。gradeSMALLINT型で、学生の成績を格納します。

2.integer

このデータ型は、より広範囲の整数を格納するのに適しています。例えば、人口の数を格納するために使用することができます。人口は通常、数千から数億の範囲であるため、integer型はこの用途に適しています。また、商品の在庫数や、ウェブサイトのページビュー数など、範囲が大きい整数値を格納する場合にも使用できます。

使用例:

CREATE TABLE population (
    city_id SERIAL PRIMARY KEY,
    population INTEGER
);

このコードは、「population」という名前のテーブルを作成します。テーブルには2つの列があります:city_idpopulationcity_idは自動的に増分する整数(SERIAL型)で、各都市を一意に識別します。populationINTEGER型で、各都市の人口を格納します。

3.bigint

このデータ型は、非常に大きな整数を格納するのに適しています。例えば、社会保障番号やクレジットカード番号などの長い数値を格納するために使用することができます。また、非常に大きなデータセットを扱う場合や、TwitterのツイートIDのように急速に増加するIDを格納する場合にも使用できます。

使用例:

CREATE TABLE citizens (
    citizen_id SERIAL PRIMARY KEY,
    social_security_number BIGINT
);

このコードは、「citizens」という名前のテーブルを作成します。テーブルには2つの列があります:citizen_idsocial_security_numbercitizen_idは自動的に増分する整数(SERIAL型)で、各市民を一意に識別します。social_security_numberBIGINT型で、市民の社会保障番号を格納します。

4.decimal,numeric

これらのデータ型は、精度が重要な数値を格納するのに適しています。例えば、金融取引での金額や、科学的な計算結果を格納するために使用することができます。これらのデータ型は、小数点以下の桁数をユーザーが指定できるため、金融計算や工学的な計算など、精度が要求される場面で使用されます。

使用例:

CREATE TABLE transactions (
    transaction_id SERIAL PRIMARY KEY,
    amount DECIMAL(10, 2)
);

このコードは、「transactions」という名前のテーブルを作成します。テーブルには2つの列があります:transaction_idamounttransaction_idは自動的に増分する整数(SERIAL型)で、各取引を一意に識別します。amountDECIMAL型で、取引の金額を格納します。

5.real

このデータ型は、精度がそれほど重要でない浮動小数点数を格納するのに適しています。例えば、気温や身長などの測定値を格納するために使用することができます。これらの値は通常、完全な精度が必要ないため、real型はこのような用途に適しています。

使用例:

CREATE TABLE temperatures (
    measurement_id SERIAL PRIMARY KEY,
    temperature REAL
);

このコードは、「temperatures」という名前のテーブルを作成します。テーブルには2つの列があります:measurement_idtemperaturemeasurement_idは自動的に増分する整数(SERIAL型)で、各測定を一意に識別します。temperatureREAL型で、測定された気温を格納します。

6.double precision

このデータ型は、より高い精度の浮動小数点数を格納するのに適しています。例えば、科学的な計算結果や、GPS座標などの精密な測定値を格納するために使用することができます。これらの値は通常、高い精度が必要なため、double precision型はこのような用途に適しています。

使用例:

CREATE TABLE locations (
    location_id SERIAL PRIMARY KEY,
    latitude DOUBLE PRECISION,
    longitude DOUBLE PRECISION
);

このコードは、「locations」という名前のテーブルを作成します。テーブルには3つの列があります:location_idlatitudelongitudelocation_idは自動的に増分する整数(SERIAL型)で、各位置を一意に識別します。latitudelongitudeDOUBLE PRECISION型で、位置の緯度と経度を格納します。

7.smallserial,serial,bigserial

これらのデータ型は、自動的に増分する整数を格納するのに適しています。これらは主に、データベースの各行に一意のIDを割り当てるための主キーとして使用されます。例えば、ユーザーIDや商品IDなどを格納するために使用することができます。これらのデータ型は、新しいレコードが追加されるたびに自動的に次の数値を生成するため、手動で一意のIDを生成する手間を省くことができます。

使用例:

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50)
);

このコードは、「users」という名前のテーブルを作成します。テーブルには2つの列があります:user_idusernameuser_idは自動的に増分する整数(SERIAL型)で、各ユーザーを一意に識別します。usernameVARCHAR型で、ユーザーの名前を格納します。

文字型

型名 説明
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_idnameemailuser_idは自動的に増分する整数(SERIAL型)で、各ユーザーを一意に識別します。nameemailVARCHAR型で、それぞれユーザーの名前とメールアドレスを格納します。

2.character(n), char(n)

このデータ型は、長さがnの固定長文字列を格納します。nは任意の正の整数で、文字列の長さを指定します。このデータ型は、長さが一定の文字列を格納するのに適しています。例えば、国コードや州コードなど、長さが一定のデータを格納するのに使用できます。

使用例:

CREATE TABLE countries (
country_id SERIAL PRIMARY KEY,
country_code CHAR(2)
);

このコードは、「countries」という名前のテーブルを作成します。テーブルには2つの列があります:country_idcountry_codecountry_idは自動的に増分する整数(SERIAL型)で、各国を一意に識別します。country_codeCHAR型で、2文字の国コードを格納します。

3.text

このデータ型は、制限なしの可変長文字列を格納します。このデータ型は、長さが非常に長い可能性がある文字列を格納するのに適しています。例えば、記事の本文やユーザーのコメントなど、長さが一定でないデータを格納するのに使用できます。

使用例:

CREATE TABLE articles (
article_id SERIAL PRIMARY KEY,
content TEXT
);

このコードは、「articles」という名前のテーブルを作成します。テーブルには2つの列があります:article_idcontentarticle_idは自動的に増分する整数(SERIAL型)で、各記事を一意に識別します。contentTEXT型で、記事の本文を格納します。

通貨型

型名 格納サイズ 説明 範囲
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_idpriceproduct_idは自動的に増分する整数(SERIAL型)で、各商品を一意に識別します。priceMONEY型で、商品の価格を格納します。

ただし、money型は通貨記号や小数点以下の桁数など、ロケールに依存する形式を使用します。そのため、国際的なアプリケーションでは、金額をnumericdecimal型で格納し、アプリケーション側で通貨形式を処理することが推奨されます。

日付/時刻データ型

型名 格納サイズ 説明 最遠の過去 最遠の未来 精度
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_idevent_timeevent_idは自動的に増分する整数(SERIAL型)で、各イベントを一意に識別します。event_timeTIMESTAMP 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_idmeeting_timemeeting_idは自動的に増分する整数(SERIAL型)で、各会議を一意に識別します。meeting_timeTIMESTAMP WITH TIME ZONE型で、会議が開催される日時と時間帯を格納します。

3.date

このデータ型は、日付のみを格納します。これは、特定の日を表すのに適していますが、その日の中の特定の時刻は考慮されません。例えば、誕生日や記念日を格納するのに使用できます。

使用例:

CREATE TABLE birthdays (
    person_id SERIAL PRIMARY KEY,
    birthday DATE
);

このコードは、「birthdays」という名前のテーブルを作成します。テーブルには2つの列があります:person_idbirthdayperson_idは自動的に増分する整数(SERIAL型)で、各人物を一意に識別します。birthdayDATE型で、人物の誕生日を格納します。

4.time [ (p) ] [ without time zone ]

このデータ型は、時刻のみを格納しますが、時間帯の情報は含まれません。これは、特定の時刻を表すのに適していますが、その時刻がどの日に発生したかや、どの時間帯で発生したかは考慮されません。例えば、毎日のアラーム時間を格納するのに使用できます。

使用例:

CREATE TABLE alarms (
    alarm_id SERIAL PRIMARY KEY,
    alarm_time TIME WITHOUT TIME ZONE
);

このコードは、「alarms」という名前のテーブルを作成します。テーブルには2つの列があります:alarm_idalarm_timealarm_idは自動的に増分する整数(SERIAL型)で、各アラームを一意に識別します。alarm_timeTIME 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_idbroadcast_timebroadcast_idは自動的に増分する整数(SERIAL型)で、各放送を一意に識別します。broadcast_timeTIME WITH TIME ZONE型で、放送が開始される時刻と時間帯を格納します。

6.interval [ fields ] [ (p) ]

このデータ型は、時間の間隔を格納します。これは、2つの瞬間の間の時間の長さを表すのに適しています。例えば、プロジェクトの期間や、あるイベントから別のイベントまでの待ち時間を格納するのに使用できます。

使用例:

CREATE TABLE projects (
    project_id SERIAL PRIMARY KEY,
    duration INTERVAL
);

このコードは、「projects」という名前のテーブルを作成します。テーブルには2つの列があります:project_iddurationproject_idは自動的に増分する整数(SERIAL型)で、各プロジェクトを一意に識別します。durationINTERVAL型で、プロジェクトの期間を格納します。

配列型

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