SQLを学び始めたばかりの方が、クエリの書き方を調べていると「リテラル」という言葉を頻繁に目にすることでしょう。
リテラルはプログラミング全般で使われる用語ですが、SQLにおいても非常に重要な役割を担っています。
リテラルを正しく理解し使い分けることは、データベースへの正確なデータ操作や、エラーのない効率的なクエリ作成を行うための第一歩となります。
本記事では、SQLリテラルの基礎知識から具体的な種類、そして実務で役立つ正しい書き方までを初心者の方にもわかりやすく解説していきます。
SQLリテラルとは?
SQLリテラルとは、プログラムのソースコード内に直接記述された「固定の値」のことを指します。
データベースを操作する際、検索条件を指定したり、新しいデータを登録したりするときに、具体的な「名前」や「数値」を指定する必要があります。
その際に記述される値そのものがリテラルです。
例えば、SELECT * FROM products WHERE category = '家電'; というSQL文がある場合、'家電' の部分がリテラルに該当します。
一方で、category は「カラム名(列名)」、products は「テーブル名」であり、これらはリテラルではありません。
リテラルと識別子の違い
初心者の方が混同しやすいのが「リテラル」と「識別子(Identifier)」の違いです。
- リテラル:データそのもの(例:’山田太郎’、100、’2026-05-06’)
- 識別子:データが格納されている場所の名前(例:user_name、price、created_at)
SQL文を書く際には、この両者を明確に区別して記述する必要があります。
多くのデータベース製品において、リテラルは特定の記号(シングルクォーテーションなど)で囲むルールがあり、これを間違えると構文エラー(Syntax Error)の原因となります。
代表的なリテラルの種類
SQLで扱われるデータにはさまざまな型があり、それぞれの型に対応したリテラルの記述方法が定められています。
ここでは、実務で頻繁に使用する主要なリテラルを紹介します。
文字列リテラル
文字列リテラルは、名前、住所、説明文などのテキストデータを表す際に使用されます。
もっとも基本的なルールは、値をシングルクォーテーション(’)で囲むことです。
-- 文字列リテラルの使用例
SELECT * FROM employees WHERE last_name = '田中';
+----+-----------+-----------+
| id | last_name | first_name|
+----+-----------+-----------+
| 1 | 田中 | 太郎 |
+----+-----------+-----------+
もし文字列の中にシングルクォーテーション自体を含めたい場合は、シングルクォーテーションを2つ続けて記述(エスケープ)するのが一般的です(例:'It''s a pen')。
数値リテラル
数値リテラルは、整数や小数を表すために使用されます。
文字列リテラルとは異なり、引用符(クォーテーション)で囲んではいけません。
- 整数:
123、-50 - 小数:
3.14、0.005
-- 数値リテラルの使用例(価格が1000円以上の商品を検索)
SELECT product_name, price FROM products WHERE price >= 1000;
+--------------+-------+
| product_name | price |
+--------------+-------+
| キーボード | 5000 |
| マウス | 1200 |
+--------------+-------+
日付・時刻リテラル
日付や時刻を指定する場合、基本的には文字列リテラルと同様にシングルクォーテーションで囲みます。
記述形式(フォーマット)はデータベースの種類によって多少異なりますが、一般的にはISO規格(’YYYY-MM-DD’)に従うのが最も安全です。
- 日付リテラル:
'2026-01-01' - 時刻リテラル:
'12:30:00' - 日時リテラル:
'2026-01-01 12:30:00'
-- 日付リテラルの使用例(2026年以降の注文を表示)
SELECT order_id, order_date FROM orders WHERE order_date >= '2026-01-01';
真偽値(Boolean)リテラル
真(TRUE)か偽(FALSE)かを表すリテラルです。
これらは引用符で囲まずに記述します。
ただし、使用しているデータベースエンジン(MySQL、PostgreSQL、Oracleなど)によって、真偽値の扱いが異なる場合があるため注意が必要です。
-- 真偽値リテラルの使用例(有効なユーザーのみ抽出)
SELECT user_id FROM users WHERE is_active = TRUE;
NULLリテラル
データが存在しない状態を指す「NULL」もリテラルの一種です。
NULLは「0」や「空文字」とは異なり、「値がない」という特別な状態を意味します。
比較演算子(=)ではなく、IS NULL または IS NOT NULL を使って判定するのがSQLの基本ルールです。
-- NULLリテラルの使用例(電話番号が登録されていない顧客を検索)
SELECT customer_name FROM customers WHERE phone_number IS NULL;
SQLリテラルの記述ルールと注意点
SQLリテラルを記述する際には、いくつかの厳格なルールがあります。
これらを守らないと、予期せぬ動作をしたり、セキュリティ上のリスクが生じたりすることがあります。
シングルクォーテーションとダブルクォーテーションの使い分け
SQLにおいて、リテラルを囲むのは必ずシングルクォーテーション(’)です。
ダブルクォーテーション(”)は、通常「識別子(テーブル名やカラム名)」を囲むために予約されています。
| 記号 | 用途 | 例 |
|---|---|---|
| シングル(’) | 文字列リテラル、日付リテラル | ‘Apple’ |
| ダブル(”) | 識別子(カラム名やテーブル名など) | “Product Name” |
MySQLなど一部の環境ではダブルクォーテーションで文字列リテラルを囲むことも許容されていますが、標準SQLに準拠し、移植性の高いコードを書くためには常にシングルクォーテーションを使用すべきです。
データの型不一致(型変換)に注意
数値リテラルが必要な場所に文字列リテラルを指定したり、その逆を行ったりすると、データベース側で「暗黙的な型変換」が行われることがあります。
-- 数値カラムに対して文字列リテラルで検索(非推奨)
SELECT * FROM sales WHERE amount = '1000';
上記のようなクエリは動作することもありますが、インデックスが正しく利用されず検索パフォーマンスが大幅に低下する原因となります。
必ずカラムのデータ型に合わせたリテラルを記述するように心がけましょう。
応用的なリテラルの表現
基本的なリテラル以外にも、特定の用途で使用されるリテラルが存在します。
16進数リテラル
バイナリデータなどを扱う際、16進数形式で記述することがあります。
一般的に X'...' や 0x... という形式で記述されます。
-- 16進数リテラルの例(MySQL形式)
SELECT 0x41; -- 実行結果:'A'
インターバル(期間)リテラル
「1ヶ月」や「3時間」といった時間の長さを表すためのリテラルです。
主に日付の計算に使用されます。
-- 現在時刻から1週間前を計算する例(PostgreSQLなど)
SELECT NOW() - INTERVAL '7 days';
セキュリティとリテラルの関係(SQLインジェクション)
SQL文の中に直接リテラルを埋め込む手法は、静的なクエリにおいては問題ありません。
しかし、Webアプリケーションなどで「ユーザーが入力した値」をそのまま文字列連結してクエリを生成する場合、SQLインジェクションという重大な脆弱性が発生します。
「ユーザーの入力を直接リテラルとして結合しない」ことが、セキュアな開発における鉄則です。
この問題を解決するために、実務では「プリペアドステートメント」と「バインド変数」を使用します。
-- SQLインジェクションのリスクがある例(絶対に行わないこと)
-- $input_name に "' OR '1'='1" と入力されると全データが流出する
query = "SELECT * FROM users WHERE name = '" + $input_name + "'";
-- 安全な例(バインド変数を使用)
query = "SELECT * FROM users WHERE name = ?";
execute(query, [$input_name]);
バインド変数を使用することで、入力された値はリテラルとして正しく処理され、悪意のあるSQL命令が実行されるのを防ぐことができます。
まとめ
SQLリテラルは、クエリの中で「具体的な値」を表現するための最も基本的な要素です。
- 文字列・日付はシングルクォーテーションで囲む
- 数値は引用符で囲まない
- NULLは特殊なリテラルであり、比較には
IS NULLを使う - 識別子(ダブルクォーテーション)とリテラル(シングルクォーテーション)を混同しない
これらの基本を忠実に守ることで、構文エラーを減らし、読みやすくメンテナンス性の高いSQLを書くことができるようになります。
また、実務においては、リテラルの直接埋め込みによるセキュリティリスクを常に意識し、適切なバインド変数の活用を忘れないようにしましょう。
SQLの学習を進める中で「なぜこのクエリは動かないのか?」と迷ったときは、まずリテラルの記述方法が正しいかをチェックしてみてください。
正しい知識を身につけて、より高度なデータベース操作に挑戦していきましょう。
