2012年12月28日金曜日

SQLiteの基礎


コマンドラインツールでの入力方法
コマンドプロンプトから次のように実行するとSQLiteのコマンドラインツールが起動し、指定したデータベースに接続します。
sqlite3 データベース名
コマンドラインツール上では、SQL文を実行したり、コマンドラインツールに関する設定を行うようなSQLiteコマンドなどを実行することができます。
例えばSQLiteコマンドの「.show」を実行してみます。
今度はSQL文を実行してみます。

コマンドであればコマンドに加えて必要に応じて引数を入力してEntereキーを押すと実行されます。またSQL文であれば最後に「;」を入力されるまでが一つのSQL文として扱われますので、「;」まで入力を行ってからEnterキーを押す事で実行されます。

ただ特にSQL文では一つのSQL文が非常に長くなることがあります。全ての文を一度に入力しようとすると入力し難かったり、どこまで入力したか分かりにくい場合があります。

このような場合、コマンドラインツールでは分割して入力することができます。途中まで入力した時点でEnterキーを押して下さい。

SQL文は最後に「;」が現れるまでが一つの文のため、まだ入力の途中だと判断されると「...>」と表示されて続けて入力を行うことができるようになります。

では残りの部分を入力していきます。

この時、空白を一つあけて入力する必要はありません。コマンドの途中でEnterキーを押すと自動的に前と後の文は別の単語として扱われます。

SQL文の場合は「;」が含まれる文が入力されてEnterが押された時点で文の入力が完了したと判断されて実行されます。

まとめて入力しても分割して入力しても結果は同じなので場合に応じて使い分けて下さい。

SQLコマンドの場合

なお、SQLコマンドの場合は分割して入力することはできません。例えば「.mode」コマンドは引数を一つ指定しますが、引数を指定しない時点でEnterキーを押すとエラーとなります。

SQLコマンドの場合は分割して入力を行わずに最後まで入力を行ってから実行して下さい。


SQLiteでは多くのキーワードが定義されています。例えばTABLEやSELECTといった言葉はキーワードです。キーワードは予約語とも呼ぶ場合があります。

テーブル名やデータベース名は識別子と呼ばれます。識別子にはアルファベットや数字などを組み合わせて付けることができます。(例えば「booktable」や「name」など)。ただしキーワードはそのままでは識別子として使用することができません。


識別子とキーワード

キーワードを識別子と使用したい場合には、次の4つのいずれかの方法を使います。

'keyword'
"keyword"
[keyword]
`keyword`
シングルクオーテーション(')でキーワードを囲った場合、文字列の値として扱われます。識別子を記述すべきところにシングルクオーテーションで囲んだ文字列の値を記述すると識別子として扱われるためこの形式でも指定することができます。



ダブルクオーテーション(")、角括弧([])、グレイヴ・アクセント(`)でキーワードを囲った場合、識別子として扱われます。(なお文字列を記述すべきところにダブルクオーテーションで囲んだ識別子を記述すると文字列として扱われます)。



なお角括弧はAccessやSQL Serverで使われている方式でグレイブ・アクセントはMySQLで使われている方式です。この2つの方式はそれぞれのデータベースとの互換性を保つために用意されています。

以上のことからキーワードを識別子として使用するにはダブルクオーテーション(")で囲むようにしておけばいいかと思います。

キーワードの一覧

キーワードを識別子として使用するための方法を記載してきましたが、SQLiteでは多くのキーワードでクォートしなくても使用できるようになっています。

例えば「TEMP」はキーワードの一つですが、クォートしなくてもテーブル名として使用することができます。



ただクォートしないで使用すると分かりにくくなり不要な間違いを起こしかねません。またそれ以前の問題としてキーワードを識別子としてあまり使用しない方が望ましいと思います。

下記にキーワードの一覧を記載します。必ずクォートが必要なキーワードと、必要でないキーワードに分けて記載します。

クォートが必須のキーワード:

ADD
ALL
ALTER
AND
AS
AUTOINCREMENT
BETWEEN
CASE
CHECK
COLLATE
COMMIT
CONSTRAINT
CREATE
CROSS
DEFAULT
DEFERRABLE
DELETE
DISTINCT
DROP
ELSE
ESCAPE
EXCEPT
EXISTS
FOREIGN
FROM
FULL
GROUP
HAVING
IN
INDEX
INNER
INSERT
INTERSECT
INTO
IS
ISNULL
JOIN
LEFT
LIMIT
NATURAL
NOT
NOTNULL
NULL
ON
OR
ORDER
OUTER
PRIMARY
REFERENCES
RIGHT
ROLLBACK
SELECT
SET
TABLE
THEN
TO
TRANSACTION
UNION
UNIQUE
UPDATE
USING
VALUES
WHEN
WHERE
クォートが不要のキーワード:

ABORT
AFTER
ANALYZE
ASC
ATTACH
BEFORE
BEGIN
BY
CASCADE
CAST
COLUMN
CONFLICT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATABASE
DEFERRED
DESC
DETACH
EACH
END
EXCLUSIVE
EXPLAIN
FAIL
FOR
GLOB
IF
IGNORE
IMMEDIATE
INDEXED
INITIALLY
INSTEAD
KEY
LIKE
MATCH
OF
OFFSET
PLAN
PRAGMA
QUERY
RAISE
REGEXP
REINDEX
RELEASE
RENAME
REPLACE
RESTRICT
ROW
SAVEPOINT
TEMP
TEMPORARY
TRIGGER
VACUUM
VIEW
VIRTUAL
システムで使っている識別子

下記の識別子はキーワードではありませんが、SQLiteシステムが使用している識別子です。他のテーブル名などに識別子として使うことも可能なようですが、使用しないほうがいいと思われます。

_ROWID_
MAIN
OID
ROWID
SQLITE_MASTER
SQLITE_SEQUENCE
SQLITE_TEMP_MASTER
TEMP


SQL文でのコメントの記述

SQLiteでSQL文にコメントを記述するには次のいずれかの方法を使用します。

-- コメント
/* コメント */
コメントは単なるメモであり、SQL文の実行時に無視されて何も影響を与えません。

「-- コメント」の形式でコメントを記述した場合、「--」から行末までに記述された文字列をコメントとします。

「/* コメント */」の形式でコメントを記述した場合、「/*」から「*/」までに記述された文字列をコメントとします。

なおコメントを付けてINSERT文を実行しても、「.dump」コマンドでダンプした内容にはコメントは残っていません。

その為、コマンドツール上でコマンドを記述してもあまり意味はありません。