SQLで大文字と小文字はどう扱われる?

SQLを書いていて、「SELECT」は大文字で書くべき?それとも「select」でもいいの?「Users」と「users」は同じテーブル?こんな疑問を持ったことはありませんか。
実は、SQLにおける大文字・小文字の扱いは、何を指しているかとどのデータベースを使っているかによって大きく変わります。
この記事では、SQLキーワード、テーブル名、カラム名、データ値それぞれの大文字小文字の扱いについて、わかりやすく解説していきますね。
ケースセンシティブとケースインセンシティブって何?
まず、基本的な用語を理解しておきましょう。
ケースセンシティブ(Case Sensitive)
大文字と小文字を区別すること。「User」と「user」は別物として扱われます。
ケースインセンシティブ(Case Insensitive)
大文字と小文字を区別しないこと。「User」と「user」は同じものとして扱われます。
英語では「case」が大文字小文字の意味、「sensitive」が敏感という意味なので、「大文字小文字に敏感かどうか」と覚えると理解しやすいでしょう。
SQLキーワードは大文字?小文字?
結論:どちらでも動作します
SELECT、FROM、WHEREなどのSQLキーワード(予約語)は、大文字でも小文字でも問題なく動作します。
すべて同じ動作をします:
SELECT name FROM users;
select name from users;
Select Name From Users;
SeLeCt NaMe FrOm UsErS;
どれも正しく実行されますが、最後の例のように混在させるのは読みにくいので避けましょう。
SQLキーワードの書き方の慣習
実際のコーディング現場では、いくつかのスタイルがよく使われています。
スタイル1:キーワードを大文字にする(最も一般的)
SELECT name, email
FROM users
WHERE status = 'active';
スタイル2:すべて小文字にする
select name, email
from users
where status = 'active';
スタイル3:文の先頭だけ大文字(英語の文章のように)
Select name, email
From users
Where status = 'active';
どのスタイルを選んでも動作に違いはありませんが、チームやプロジェクトで統一することが重要です。多くのエンジニアは、キーワードを大文字にするスタイルを採用しています。
テーブル名とカラム名の大文字小文字
ここからが少し複雑になります。テーブル名やカラム名の扱いは、使用しているデータベースシステムと設定によって変わるんです。
MySQLの場合
MySQLでは、オペレーティングシステム(OS)によって動作が異なるという特徴があります。
Windowsの場合:
- テーブル名は大文字小文字を区別しない
- 「Users」「users」「USERS」は同じテーブルとして扱われる
Linux/Unixの場合:
- テーブル名は大文字小文字を区別する
- 「Users」と「users」は別のテーブルとして扱われる
カラム名は常に区別しない:
- どのOSでも「UserName」「username」「USERNAME」は同じカラムとして扱われる
実例:
-- Windowsでは以下はすべて同じテーブルを参照
SELECT * FROM Users;
SELECT * FROM users;
SELECT * FROM USERS;
-- Linuxでは以下は異なるテーブルを参照(エラーになる可能性あり)
SELECT * FROM Users; -- 「Users」テーブル
SELECT * FROM users; -- 「users」テーブル
PostgreSQLの場合
PostgreSQLは、少し特殊な扱いをします。
ダブルクォートなしの場合:
- すべて小文字に変換される
- 大文字小文字を区別しない
ダブルクォートありの場合:
- 大文字小文字を区別する
実例:
-- 以下はすべて「users」テーブルを参照(小文字に変換される)
SELECT * FROM Users;
SELECT * FROM users;
SELECT * FROM USERS;
-- ダブルクォートを使うと、大文字小文字がそのまま扱われる
SELECT * FROM "Users"; -- 「Users」テーブル(大文字のU)
SELECT * FROM "users"; -- 「users」テーブル(小文字のu)
SELECT * FROM "USERS"; -- 「USERS」テーブル(大文字)
ダブルクォートで囲まない限り、PostgreSQLは自動的に小文字に変換するので、通常は大文字小文字を気にする必要はありません。
SQL Serverの場合
SQL Serverでは、照合順序(Collation)の設定によって動作が変わります。
デフォルト設定(CI:Case Insensitive):
- 大文字小文字を区別しない
- 「Users」「users」「USERS」は同じ
CS設定(Case Sensitive):
- 大文字小文字を区別する
- 「Users」と「users」は別物
照合順序は、データベースやカラムごとに設定できます。
Oracleの場合
Oracleは、PostgreSQLと似た動作をします。
通常の場合:
- すべて大文字に変換される
- 大文字小文字を区別しない
ダブルクォートを使う場合:
- 大文字小文字を区別する
実例:
-- 以下はすべて「USERS」テーブルを参照(大文字に変換される)
SELECT * FROM Users;
SELECT * FROM users;
SELECT * FROM USERS;
-- ダブルクォートを使うと、大文字小文字がそのまま扱われる
SELECT * FROM "Users"; -- 「Users」テーブル
SELECT * FROM "USERS"; -- 「USERS」テーブル
データ値(文字列データ)の大文字小文字

テーブルに格納されている実際のデータ(文字列)については、常に大文字小文字が区別されます。
実例:
-- usersテーブル
name
-------
Yamada
yamada
YAMADA
-- 以下のクエリは異なる結果を返す
SELECT * FROM users WHERE name = 'Yamada'; -- Yamadaのみ取得
SELECT * FROM users WHERE name = 'yamada'; -- yamadaのみ取得
SELECT * FROM users WHERE name = 'YAMADA'; -- YAMADAのみ取得
ただし、この動作も照合順序の設定によって変更できます。
大文字小文字を区別せずに検索する方法
データ値を大文字小文字関係なく検索したい場合は、以下の方法があります。
方法1:UPPER関数やLOWER関数を使う
-- すべて大文字に変換して比較
SELECT * FROM users WHERE UPPER(name) = 'YAMADA';
-- すべて小文字に変換して比較
SELECT * FROM users WHERE LOWER(name) = 'yamada';
この方法なら、「Yamada」「yamada」「YAMADA」のいずれも検索できます。
方法2:LIKE演算子とワイルドカードを使う
SELECT * FROM users WHERE name LIKE '%yamada%';
ただし、これは部分一致検索になるので、「yamada123」なども引っかかります。
方法3:データベース固有の機能を使う(MySQL)
-- MySQLの場合、COLLATE句で照合順序を指定
SELECT * FROM users WHERE name COLLATE utf8mb4_general_ci = 'yamada';
実際のプロジェクトでの推奨事項
命名規則を統一する
チームやプロジェクトで、テーブル名やカラム名の命名規則を決めておきましょう。
推奨される命名スタイル:
スネークケース(小文字+アンダースコア):
user_accounts
order_details
created_at
キャメルケース(大文字を使わない方が無難):
userAccounts -- 避けた方が良い
orderDetails -- 避けた方が良い
多くのプロジェクトでは、すべて小文字でアンダースコア区切り(スネークケース)が採用されています。理由は、どのデータベースでも確実に動作し、タイプミスも防げるからです。
SQLキーワードは大文字に統一
可読性を高めるため、SQLキーワードは大文字に統一することをおすすめします。
良い例:
SELECT user_id, user_name, email
FROM user_accounts
WHERE status = 'active'
AND created_at > '2024-01-01'
ORDER BY created_at DESC;
悪い例:
select USER_ID, UserName, email
from UserAccounts
WHERE Status = 'active'
and CreatedAt > '2024-01-01'
order by CreatedAt desc;
統一されていない書き方は、読みにくく、エラーの原因にもなりやすいです。
データベース移行を考慮する
将来的に別のデータベースシステムに移行する可能性がある場合は、以下に注意しましょう。
安全な命名規則:
- すべて小文字を使う
- ダブルクォートで囲まない
- 予約語を避ける
- スネークケースを使う
これらを守ることで、データベース間の移行がスムーズになります。
よくあるトラブルと解決方法
トラブル1:Linuxで「Table doesn’t exist」エラー
症状:
SELECT * FROM Users;
ERROR 1146: Table 'database.Users' doesn't exist
原因:
Linux環境のMySQLでは、テーブル名が大文字小文字を区別します。実際のテーブル名が「users」なのに「Users」で検索している可能性があります。
解決方法:
-- テーブル一覧を確認
SHOW TABLES;
-- 実際のテーブル名に合わせる
SELECT * FROM users;
トラブル2:PostgreSQLでダブルクォートを忘れた
症状:
テーブル作成時に「UserAccounts」という名前をつけたのに、検索できない。
原因:
PostgreSQLはダブルクォートなしで作成すると、自動的に小文字「useraccounts」に変換します。
解決方法:
-- 小文字で検索するか
SELECT * FROM useraccounts;
-- またはダブルクォートで囲む(ただし毎回必要になる)
SELECT * FROM "UserAccounts";
最初から小文字で作成することをおすすめします。
トラブル3:Windows→Linux移行でエラー
症状:
Windows環境で動いていたSQLが、Linux環境でエラーになる。
原因:
Windowsでは大文字小文字を区別しなかったので気づかなかったが、実際のテーブル名と異なる大文字小文字で書いていた。
解決方法:
-- テーブル名を確認
SHOW TABLES;
-- 実際の名前に合わせて修正
-- 修正前:SELECT * FROM Users;
-- 修正後:SELECT * FROM users;
まとめ
SQLにおける大文字小文字の扱いは、対象と環境によって異なります。
SQLキーワード:
- 大文字でも小文字でも動作する
- 可読性のため大文字推奨
テーブル名・カラム名:
- MySQL:OSによって動作が異なる
- PostgreSQL:小文字に自動変換(ダブルクォートなしの場合)
- SQL Server:照合順序の設定による
- Oracle:大文字に自動変換(ダブルクォートなしの場合)
データ値(文字列):
- 基本的に大文字小文字を区別する
- UPPER/LOWER関数で大文字小文字を無視した検索が可能
推奨事項:
- テーブル名・カラム名はすべて小文字(スネークケース)
- SQLキーワードは大文字
- 命名規則をチーム内で統一
- データベース移行を考慮した命名
大文字小文字の扱いを正しく理解することで、予期しないエラーを防ぎ、どの環境でも安定して動作するSQLを書けるようになります。

コメント