SQLiteリテラル値:プログラミング初心者でも理解できる完全ガイド
文字列リテラル
最も基本的な言語リテラル値は、文字列リテラルです。 一重引用符 ('') または二重引用符 ("") で囲まれた文字列を記述します。 例えば、次のように使用できます。
-- 名前列に 'Alice' を格納
INSERT INTO users (name) VALUES ('Alice');
-- メッセージ列に "Hello, world!" を格納
UPDATE messages SET message = "Hello, world!";
数値リテラル
整数と小数を含む数値リテラルを記述できます。 例えば、次のように使用できます。
-- 年齢列に 30 を格納
INSERT INTO users (age) VALUES (30);
-- 金額列に 123.45 を格納
UPDATE products SET price = 123.45;
論理リテラル
TRUE または FALSE を表す論理リテラルを使用できます。 例えば、次のように使用できます。
-- アクティブフラグ列が TRUE のユーザーを取得
SELECT * FROM users WHERE active = TRUE;
-- 完了フラグ列が FALSE のタスクを取得
SELECT * FROM tasks WHERE completed = FALSE;
NULL リテラル
値が存在しないことを表す NULL リテラルを使用できます。 例えば、次のように使用できます。
-- メールアドレス列が空の場合、デフォルト値を設定
INSERT INTO users (email, name) VALUES (NULL, 'Bob');
-- 画像データ列が NULL の場合、代替画像を表示
SELECT image_path, COALESCE(image_data, 'default_image.png') AS image
FROM products;
ブロブ リテラル
バイナリデータを表すブロブリテラルを使用できます。 例えば、次のように使用できます。
-- プロフィール画像列に画像データを格納
INSERT INTO users (profile_image) VALUES (hexToBlob('0xFF0000'));
-- ファイルデータ列に PDF ファイルを格納
UPDATE documents SET file_data = loadFile('myfile.pdf');
上記以外にも、SQLite ではさまざまな言語リテラル値を使用できます。 詳細については、SQLite の公式ドキュメントを参照してください。
- ブロブリテラルは、バイナリデータを表します。
- NULL リテラルは、値が存在しないことを表します。
- 論理リテラルは、TRUE または FALSE のいずれかである必要があります。
- 数値リテラルは、整数と小数を含むことができます。
- 言語リテラル値は、常に単一引用符または二重引用符で囲む必要があります。
-- ユーザー名とパスワードを格納するテーブルを作成
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL
);
-- ユーザーを追加
INSERT INTO users (username, password) VALUES (
'alice', 'password123',
'bob', 'password456'
);
-- ユーザー情報を取得
SELECT id, username, password FROM users;
数値リテラル
-- 商品情報を含むテーブルを作成
CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INTEGER NOT NULL
);
-- 商品を追加
INSERT INTO products (name, price, stock) VALUES (
'T-shirt', 19.99, 100,
'Jeans', 59.95, 50,
'Shoes', 79.99, 25
);
-- 商品情報を取得
SELECT id, name, price, stock FROM products;
論理リテラル
-- 注文情報を含むテーブルを作成
CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
shipped BOOLEAN NOT NULL DEFAULT FALSE
);
-- 注文を追加
INSERT INTO orders (customer_id, product_id, quantity) VALUES (
1, 1, 2,
2, 2, 1,
3, 3, 3
);
-- 未発送の注文を取得
SELECT * FROM orders WHERE shipped = FALSE;
NULL リテラル
-- 顧客情報を含むテーブルを作成
CREATE TABLE customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT,
address TEXT
);
-- 顧客を追加
INSERT INTO customers (name, email, address) VALUES (
'John Doe', '[email protected]', '123 Main Street'),
('Jane Doe', NULL, '456 Elm Street'),
('Peter Jones', '[email protected]', NULL)
);
-- 顧客情報を取得
SELECT id, name, email, address FROM customers;
ブロブ リテラル
-- 画像情報を含むテーブルを作成
CREATE TABLE images (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
image_data BLOB NOT NULL
);
-- 画像を追加
INSERT INTO images (name, image_data) VALUES (
'profile_pic.jpg', hexToBlob('0xFF0000')),
'product_image.png', loadFile('product_image.png')
);
-- 画像情報を取得
SELECT id, name, image_data FROM images;
- SQLite には、他にもさまざまなデータ型や関数があります。 詳細については、SQLite の公式ドキュメントを参照してください。
- それぞれの例では、基本的な使用方法のみを示しています。 状況に応じて、より複雑なクエリやデータ操作を行うことができます。
プレースホルダパラメータとバインドパラメータ
プレースホルダパラメータとバインドパラメータは、SQL ステートメント内で値を安全かつ柔軟に挿入する方法を提供します。
利点
- パフォーマンス向上
同じクエリを繰り返し実行する場合、バインドパラメータを使用すると、SQLite がクエリを一度だけ解析し、実行計画を再利用できるため、パフォーマンスが向上します。 - コードの可読性と保守性向上
値がクエリ内に直接記述されていないため、コードが読みやすく、将来的な変更も容易になります。 - SQL インジェクション攻撃対策
ユーザ入力値を直接クエリに埋め込む代わりに、パラメータとしてバインドすることで、悪意のあるコードが実行されるのを防ぎます。
欠点
- わずかな記述量の増加
プレースホルダとバインドパラメータを使用するには、クエリと値を別途記述する必要があるため、リテラル値を使用する場合と比べて記述量が増加します。
例
-- リテラル値を使用する場合
SELECT * FROM users WHERE name = 'Alice' AND age = 30;
-- プレースホルダパラメータとバインドパラメータを使用する場合
SELECT * FROM users WHERE name = ? AND age = ?;
関数呼び出し
特定のデータ操作をカプセル化するために、関数を作成して呼び出すことができます。 関数内でリテラル値を使用する代わりに、パラメータとして値を渡すことができます。
利点
- テストの容易化
関数を個別にテストすることで、コード全体をテストするよりも容易になります。 - コードの可読性と保守性向上
関数名とその役割が明確になるため、コードが読みやすく、将来的な変更も容易になります。
欠点
- わずかなパフォーマンスの低下
関数呼び出しにはわずかなオーバーヘッドが発生するため、リテラル値を使用する場合と比べてパフォーマンスが低下する可能性があります。
例
-- 関数を使用してユーザー情報を取得
CREATE FUNCTION get_user_info(name TEXT, age INTEGER)
RETURNS TABLE AS
BEGIN
SELECT * FROM users WHERE name = name AND age = age;
END;
-- 関数を呼び出す
SELECT * FROM get_user_info('Alice', 30);
サブクエリ
サブクエリを使用して、クエリ内で値を生成することができます。
利点
- 複雑なデータ操作が可能
サブクエリを使用して、複雑なデータ操作をクエリ内に埋め込むことができます。
欠点
- パフォーマンスの低下
サブクエリは、別途クエリを実行する必要があるため、リテラル値を使用する場合と比べてパフォーマンスが低下する可能性があります。 - クエリが複雑になり、読みづらくなる
サブクエリを使用すると、クエリが複雑になり、読みづらくなる可能性があります。
例
-- 特定の年齢層のユーザーを取得
SELECT * FROM users WHERE age IN (
SELECT age FROM age_range WHERE min_age = 20 AND max_age = 30
);
組み込み関数
SQLite には、さまざまな組み込み関数が用意されており、データ操作や値の生成に使用することができます。
利点
- パフォーマンスの向上が期待できる
組み込み関数は、最適化されているため、リテラル値を使用する場合と比べてパフォーマンスが向上する可能性があります。 - コードを簡潔に記述できる
組み込み関数を使用することで、コードを簡潔に記述することができます。
欠点
- 必要な関数が常に用意されているとは限らない
必要な機能を提供する組み込み関数が常に用意されているとは限りません。
-- 現在の日付を取得
SELECT date('now');
-- 文字列を小文字に変換
SELECT lower('Hello, World!');