SQLのデータ型を完全ガイド!初心者でもわかるデータ型の種類と使い方
新人
「データベースにデータを保存するとき、どんな種類があるんですか?」
先輩
「データベースでは、保存するデータの種類ごとに適切なデータ型を指定する必要があるんだ。」
新人
「データ型って具体的にはどんなものがあるんですか?」
先輩
「主に数値、文字列、日付・時刻の3つのカテゴリーに分かれるよ。今回は、数値型について詳しく見ていこう!」
1. データ型とは何か?
データベースでデータを格納するとき、どのような値を保存するかを決めるのがデータ型です。
データ型を適切に選ぶことで、無駄なストレージを削減し、データの整合性を保つことができます。
主なデータ型の種類
- 数値型(INT, DECIMAL, FLOAT): 数値データを保存
- 文字列型(VARCHAR, CHAR, TEXT): 文字列を保存
- 日付・時刻型(DATE, DATETIME, TIMESTAMP): 日付や時刻を保存
今回は、数値データを扱う「数値型」について詳しく解説します。
2. 数値型(INT, DECIMAL)の種類と使い方
数値型には、整数を扱うINTと、小数点を含むDECIMALがあります。
1. 整数型(INT)
整数型(INT)は、小数点を含まない数値を保存するのに使用します。
CREATE TABLE employee (
id INT PRIMARY KEY,
age INT,
salary INT
);
このテーブルでは、id(社員ID)、age(年齢)、salary(給与)にINTを使用しています。
2. 小数型(DECIMAL)
小数点を含む数値を扱う場合は、DECIMAL型を使用します。
CREATE TABLE product (
id INT PRIMARY KEY,
price DECIMAL(10,2)
);
このテーブルでは、price(価格)にDECIMAL(10,2)を指定しています。
10: 最大10桁まで保存可能2: 小数点以下2桁まで保存可能
例えば、以下のようなデータが保存できます。
| id | price |
|---|---|
| 1 | 1500.50 |
| 2 | 2999.99 |
このように、DECIMALを使うことで、小数点を含む金額などを正確に保存できます。
3. 文字列型(VARCHAR, CHAR)の違いと適切な使い方
データベースでテキストを扱う場合、VARCHARとCHARの2種類の文字列型があります。
1. 可変長のVARCHAR
VARCHARは、可変長の文字列を保存するデータ型です。文字数に応じてデータのサイズが変わるため、効率よくストレージを使用できます。
CREATE TABLE customer (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
このテーブルでは、nameを最大50文字、emailを最大100文字まで格納できます。
2. 固定長のCHAR
CHARは、固定長の文字列を保存するデータ型です。データの長さが決まっている場合に適しています。
CREATE TABLE country (
code CHAR(3),
name VARCHAR(50)
);
このテーブルでは、code(国コード)にCHAR(3)を指定しています。
例えば、"JPN" や "USA" のように常に3文字でデータを保存する場合は、CHARを使うと効率的です。
3. VARCHARとCHARの違い
| データ型 | 特徴 | 用途 |
|---|---|---|
| VARCHAR | 可変長で、文字数が少ないとストレージを節約できる | 名前、住所、メールアドレスなど |
| CHAR | 固定長で、データの長さが一定なら処理が速い | 国コード、郵便番号など |
基本的にはVARCHARを使用し、データの長さが一定の場合はCHARを選ぶと良いでしょう。
4. 日付型(DATE, TIMESTAMP)の種類と使い方
日付や時刻を扱う場合、DATEとTIMESTAMPを使います。
1. DATE型
DATEは、年月日のみを保存するデータ型です。
CREATE TABLE orders (
id INT PRIMARY KEY,
order_date DATE
);
このテーブルでは、order_dateにYYYY-MM-DD形式の日付を保存できます。
例:
| id | order_date |
|---|---|
| 1 | 2024-05-10 |
| 2 | 2024-06-15 |
2. TIMESTAMP型
TIMESTAMPは、年月日+時刻を保存するデータ型です。
CREATE TABLE logs (
id INT PRIMARY KEY,
event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
このテーブルでは、event_timeにデフォルトで現在の日時が自動保存されます。
例:
| id | event_time |
|---|---|
| 1 | 2024-05-10 14:30:00 |
| 2 | 2024-06-15 09:45:20 |
3. DATEとTIMESTAMPの違い
| データ型 | 保存内容 | 用途 |
|---|---|---|
| DATE | 年月日 (YYYY-MM-DD) | 誕生日、注文日など |
| TIMESTAMP | 年月日 + 時刻 (YYYY-MM-DD HH:MM:SS) | ログの記録、イベント発生時刻など |
日付だけ保存する場合はDATE、時刻まで記録する場合はTIMESTAMPを使いましょう。
5. データ型を適切に選ぶポイント
データ型を選ぶときは、次のポイントを考慮しましょう。
1. 必要なデータの種類を考える
数値を保存するならINTやDECIMAL、文字列ならVARCHARやTEXTを使います。
2. データの長さを考える
文字列の長さが一定ならCHAR、変動するならVARCHARが適しています。
3. パフォーマンスを意識する
不要に大きなデータ型を使うと、ストレージを無駄に消費するため、必要最小限のサイズを選びましょう。
4. 将来の拡張性を考える
データの増加を見越して適切なデータ型を選びましょう。
例えば、社員の給与を保存するなら、次のように設計できます。
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE
);
このようにデータ型を適切に選ぶことで、効率的にデータを管理できます。
6. よくあるエラーと対策(型変換ミス・NULLの扱い)
データ型を適切に扱わないと、SQLの実行時にエラーが発生することがあります。ここでは、初心者がよく遭遇するエラーとその対策を紹介します。
1. 型変換ミス
文字列を数値に変換しようとしたり、数値を日付に変換しようとするとエラーになります。
SELECT age + '30' FROM employee;
エラー内容: ERROR: invalid input syntax for integer
対策: 文字列を数値に変換するにはCASTやCONVERTを使用する。
SELECT age + CAST('30' AS INT) FROM employee;
2. NULLの扱い
NULLは「値が存在しない」ことを示す特殊なデータです。NULLを適切に扱わないと予期しない結果になることがあります。
SELECT salary + 10000 FROM employee;
もしsalaryにNULLがあると、計算結果もNULLになってしまいます。
対策: NULLを0として扱う場合はCOALESCEを使用する。
SELECT COALESCE(salary, 0) + 10000 FROM employee;
これで、NULLのデータも計算可能になります。
7. CAST関数・CONVERT関数を使ったデータ型変換
SQLでは、異なるデータ型を変換するためにCAST関数とCONVERT関数を使用します。
1. CAST関数
CASTを使うと、データ型を指定した型に変換できます。
SELECT CAST('2024-05-10' AS DATE);
このSQLを実行すると、文字列をDATE型に変換します。
2. CONVERT関数(MySQL、SQL Server)
MySQLやSQL Serverでは、CONVERT関数を使うことで、データ型の変換が可能です。
SELECT CONVERT('2024-05-10', DATE);
このSQLは、文字列をDATE型に変換します。
3. 数値を文字列に変換する
数値を文字列に変換する場合も、CASTやCONVERTを使用します。
SELECT CAST(salary AS CHAR) FROM employee;
これにより、給与データ(数値)が文字列として扱われるようになります。
8. 実践!データ型を適切に選んでテーブルを設計しよう
適切なデータ型を選ぶことで、データの管理がスムーズになります。ここでは、具体的なテーブル設計の例を紹介します。
1. 従業員管理テーブル
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
salary DECIMAL(10,2),
hire_date DATE
);
データ型の選択ポイント:
id→ 一意の番号なのでINT(主キー)name→ 変動する名前の長さに対応するためVARCHARage→ 年齢は整数なのでINTsalary→ 小数点を含む給与を保存するためDECIMAL(10,2)hire_date→ 採用日を記録するためDATE
2. 商品管理テーブル
CREATE TABLE product (
id INT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
データ型の選択ポイント:
id→ 商品ごとに一意のIDを持つためINTname→ 商品名は長さが可変なのでVARCHAR(100)price→ 小数点を含む金額を記録するためDECIMAL(10,2)created_at→ 商品の登録日時を保存するためTIMESTAMP
3. 注文管理テーブル
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
total_price DECIMAL(12,2)
);
データ型の選択ポイント:
id→ 注文ごとに一意の番号を持つためINTcustomer_id→ 顧客の識別のためINTorder_date→ 注文日を記録するためDATEtotal_price→ 合計金額を保存するためDECIMAL(12,2)
適切なデータ型を選ぶことで、データの整合性を保ちつつ、効率的なデータ管理が可能になります。