🌊

SQL文の書き方の注意点

2024/08/18に公開

大文字と小文字は区別しない❓

命令語は区別はされません。(区別する製品もあるかもしれません)
ただし、MySQLは、データベース名の大文字と小文字を区別しています。
これは、データベース名のアクセスに、ファイルシステム上のファイル名を利用するからです。
MacやWindowsのファイルシステムは、大文字と小文字を区別するか選択できますが、デフォルトは区別しないになっています。
Linuxは大文字と小文字を区別するため、テーブル名は大文字か小文字か正確に入力する必要があります。

文字列はシングルクォート(')で囲む

WHEREでレコードの抽出する条件を指定する場合、数字ではなく文字列を指定する場合は、シングルクォート(')で囲む必要があります。

SELECT * FROM t_table WHERE name = 'taro'

カラム名もエスケープする

通常はカラム名をエスケープしなくても問題はありません。

SELECT id FROM t_user WHERE email = 'user@example.com';

ただし、groupというカラム名の値を抽出しようとするとエラーになります。

SELECT group FROM t_user WHERE id = 1;

これは、groupが、SQL文の予約語だからです。limitorderなどのカラム名も同様にエラーになります。
エラーは思わぬ箇所で発生しますので、常にエスケープしておくと良いと思います。

SELECT `limit` FROM `t_user` WHERE `group` = 'japanese';

エスケープ記号はデータベース毎に異なります。

日付の形式

日付の形式は、yyyy-mm-ddです。
⭕ 2024-01-01
❌ 2024-1-1
❌ 2024/01/01
日付も文字列と同様にシングルクォート(')で囲む必要があります。

SELECT * FROM t_table WHERE date = '2024-01-01'

集計関数

SQL文には集計関数があります。合計や平均、最大値や最小値を簡単にもとめられます。

sum

scoreカラムの合計をもとめます。

SELECT sum(score) FROM t_table

count

今日のレコードが何件あるかもとめます。
MySQLでは、日付を計算しなくても、CURDATE()で、今日の日付をMySQLが計算してくれます。
PostgreSQLでは、CURRENT_DATEという定数が用意されています。

SELECT count(score) FROM t_table WHERE date = CURDATE();

min, max, avg

今日の最小、最大、平均をもとめられます。

SELECT min(score) FROM t_table WHERE date = CURDATE();

Discussion