データ型の基本 — 文字列・数値・日付

SQLの基本的なデータ型(文字列・数値・日付/時刻・真偽値)と、CASTによる型変換を解説します。型を意識することがなぜ大切かを、比較や計算の落とし穴とあわせて整理します。

テーブルの各列には「データ型」が決められています。データ型は「その列にどんな種類の値が入るか」を表すもので、型を意識することは正しい SQL を書くうえで欠かせません。ここでは代表的な型と、型変換の基本を見ていきます。

主なデータ型

データベース(ここでは PostgreSQL を例にします)でよく使う型は次のとおりです。

分類型の例用途
文字列text / varchar(n) / char(n)名前・住所・説明など
整数integer / bigint / smallint個数・ID・年など
小数numeric / real / double precision金額・割合など
真偽値booleantrue / false
日付・時刻date / timestamp / time登録日・注文日時など

型が決まっていることで、データベースは「この列には数値しか入らない」と保証でき、比較や計算を正しく行えます。

文字列と数値は別物

同じ「500」でも、文字列の '500' と数値の 500 は別の型です。これを混同すると、意図しない結果になります。たとえば文字列として並べ替えると、辞書順(1文字ずつの比較)になります。

query.sql
-- 文字列の '10' と '9' を比べると、'1' < '9' なので '10' が先に来る
SELECT '10' < '9' AS result;   -- true

数値なら当然 10 < 9 は false です。「数値のつもりが文字列だった」ために並び順が想定と違う、というのはよくある落とし穴です。列の型が数値であることを確認しましょう。

日付・時刻の型

日付は文字列ではなく専用の型(date / timestamp)で持つのが基本です。日付型なら大小比較や差の計算が自然にできます。

query.sql
SELECT name, hire_date
FROM employees
WHERE hire_date >= '2020-01-01'
ORDER BY hire_date;

'2020-01-01' のような文字列は、日付型の列と比較するとき自動的に日付として解釈されます。日付から一部を取り出したいときは EXTRACT が使えます。

query.sql
SELECT EXTRACT(YEAR FROM hire_date) AS 
FROM employees;

CAST で型を変換する

型を明示的に変換したいときは CAST を使います。書き方は 2 通りあり、どちらも同じ意味です。

query.sql
SELECT CAST('2020' AS integer);   -- 標準の書き方
SELECT '2020'::integer;           -- PostgreSQL の短縮記法

たとえば文字列で入っている数字を数値として計算したいときや、数値を文字列に変えて連結したいときに使います。

query.sql
-- 数値を文字列にして連結
SELECT '社員番号: ' || CAST(id AS text) AS label
FROM employees;

|| は文字列の連結演算子です。数値のままでは連結できないため、text に変換しています。

型を意識する習慣

型は普段あまり意識しないかもしれませんが、次のような場面で効いてきます。

  • 比較:文字列比較と数値比較で並び順が変わる
  • 計算:整数同士の割り算は小数点以下が切り捨てられることがある
  • 連結:数値と文字列はそのままつなげない

「この列は何型か」を意識するだけで、多くのつまずきを避けられます。

まとめ

  • 列にはデータ型(文字列・数値・日付・真偽値など)がある
  • 同じ見た目でも文字列 '500' と数値 500 は別物で、比較・並び順が変わる
  • 日付は専用の型で持ち、比較や EXTRACT で扱う
  • CAST(または ::)で明示的に型を変換できる

型を正しく理解すると、「なぜこの結果になるのか」が腑に落ちるようになります。SQL の土台として押さえておきましょう。

手を動かして確認しましょう「SELECT の基本」の演習問題で、実際に SQL を書いて自動採点できます。
問題一覧へ →