データ型の基本 — 文字列・数値・日付
SQLの基本的なデータ型(文字列・数値・日付/時刻・真偽値)と、CASTによる型変換を解説します。型を意識することがなぜ大切かを、比較や計算の落とし穴とあわせて整理します。
テーブルの各列には「データ型」が決められています。データ型は「その列にどんな種類の値が入るか」を表すもので、型を意識することは正しい SQL を書くうえで欠かせません。ここでは代表的な型と、型変換の基本を見ていきます。
主なデータ型
データベース(ここでは PostgreSQL を例にします)でよく使う型は次のとおりです。
| 分類 | 型の例 | 用途 |
|---|---|---|
| 文字列 | text / varchar(n) / char(n) | 名前・住所・説明など |
| 整数 | integer / bigint / smallint | 個数・ID・年など |
| 小数 | numeric / real / double precision | 金額・割合など |
| 真偽値 | boolean | true / false |
| 日付・時刻 | date / timestamp / time | 登録日・注文日時など |
型が決まっていることで、データベースは「この列には数値しか入らない」と保証でき、比較や計算を正しく行えます。
文字列と数値は別物
同じ「500」でも、文字列の '500' と数値の 500 は別の型です。これを混同すると、意図しない結果になります。たとえば文字列として並べ替えると、辞書順(1文字ずつの比較)になります。
-- 文字列の '10' と '9' を比べると、'1' < '9' なので '10' が先に来る
SELECT '10' < '9' AS result; -- true数値なら当然 10 < 9 は false です。「数値のつもりが文字列だった」ために並び順が想定と違う、というのはよくある落とし穴です。列の型が数値であることを確認しましょう。
日付・時刻の型
日付は文字列ではなく専用の型(date / timestamp)で持つのが基本です。日付型なら大小比較や差の計算が自然にできます。
SELECT name, hire_date
FROM employees
WHERE hire_date >= '2020-01-01'
ORDER BY hire_date;'2020-01-01' のような文字列は、日付型の列と比較するとき自動的に日付として解釈されます。日付から一部を取り出したいときは EXTRACT が使えます。
SELECT EXTRACT(YEAR FROM hire_date) AS 入社年
FROM employees;CAST で型を変換する
型を明示的に変換したいときは CAST を使います。書き方は 2 通りあり、どちらも同じ意味です。
SELECT CAST('2020' AS integer); -- 標準の書き方
SELECT '2020'::integer; -- PostgreSQL の短縮記法たとえば文字列で入っている数字を数値として計算したいときや、数値を文字列に変えて連結したいときに使います。
-- 数値を文字列にして連結
SELECT '社員番号: ' || CAST(id AS text) AS label
FROM employees;|| は文字列の連結演算子です。数値のままでは連結できないため、text に変換しています。
型を意識する習慣
型は普段あまり意識しないかもしれませんが、次のような場面で効いてきます。
- 比較:文字列比較と数値比較で並び順が変わる
- 計算:整数同士の割り算は小数点以下が切り捨てられることがある
- 連結:数値と文字列はそのままつなげない
「この列は何型か」を意識するだけで、多くのつまずきを避けられます。
まとめ
- 列にはデータ型(文字列・数値・日付・真偽値など)がある
- 同じ見た目でも文字列
'500'と数値500は別物で、比較・並び順が変わる - 日付は専用の型で持ち、比較や
EXTRACTで扱う CAST(または::)で明示的に型を変換できる
型を正しく理解すると、「なぜこの結果になるのか」が腑に落ちるようになります。SQL の土台として押さえておきましょう。