| [サイトマップへ] |
SQLite 3 コマンドライン・インタフェースとは, Windows のコマンドプロンプトなどで動作するツールです. この Web ページでは,SQLite のコマンドライン・インタフェース を使って下記の操作を行う手順を,図解で説明します. (コマンドの簡単な説明と,コマンドを実行させるための操作手順の両方を説明します).
SQLite 3 コマンドライン・インタフェースのインストールは別の Web ページ で説明しています.
SQLite の SQL に関する詳しい説明は:
SQLite 3 コマンドライン・インタフェースに関する詳しい説明は:
SQliteが認識できる SQL について,日本語でのすばらしい説明が http://net-newbie.com/sqlite/lang.html にあります.
この Web ページでは,データベースの生成を行いますので, 生成するデータベースのデータベース論理名を決めておくこと. この Web ページでは,次のように書きます.
使用するデータベースの名前のことを,「データベース論理名」と呼ぶことにします. データベース論理名は,自由に決めていいですが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと,
自由に決めていいですが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと,
リレーショナル・スキーマ (relational schema): order_records(id, year, month, day, customer_name, product_name, unit_price, qty)
SQL 文:
CREATE TABLE order_records (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
year INTEGER NOT NULL CHECK ( year > 2008 ),
month INTEGER NOT NULL CHECK ( month >= 1 AND month <= 12 ),
day INTEGER NOT NULL CHECK ( day >= 1 AND day <= 31 ),
customer_name TEXT NOT NULL,
product_name TEXT NOT NULL,
unit_price REAL NOT NULL CHECK ( unit_price > 0 ),
qty INTEGER NOT NULL DEFAULT 1 CHECK ( qty > 0 ),
created_at DATETIME NOT NULL,
updated_at DATETIME,
CHECK ( ( unit_price * qty ) < 200000 ) );
BEGIN TRANSACTION;
INSERT INTO order_records VALUES( 1, 2009, 10, 26, 'kaneko', 'orange A', 1.2, 10, datetime('now'), NULL );
INSERT INTO order_records (year, month, day, customer_name, product_name, unit_price, qty, created_at) VALUES( 2009, 10, 26, 'miyamoto', 'Apple M', 2.5, 2, datetime('now') );
INSERT INTO order_records (year, month, day, customer_name, product_name, unit_price, qty, created_at) VALUES( 2009, 10, 27, 'kaneko', 'orange B', 1.2, 8, datetime('now') );
INSERT INTO order_records (year, month, day, customer_name, product_name, unit_price, created_at) VALUES( 2009, 10, 28, 'miyamoto', 'Apple L', 3, datetime('now') );
COMMIT;
「now」は,現在の日時を取得する SQLitep の関数 (A SQLitep function to get the current datetime).
「datetime」は,日時のデータを「YYYY-MM-DD HH:MM:SS」形式の文字列に変換する SQLitep の関数 (A SQLitep function to convert a datetime data into the string like "YYYY-MM-DD HH:MM:SS").
- 一貫性制約に違反する更新ができないことの確認 (Integrity constraint violation is not permitted when database update)
- SQL 問い合わせの発行と評価結果の確認 (Issue SQL queries and inspect the results)
SELECT * FROM order_records;
SELECT * FROM order_records WHERE day = 26;
SELECT * FROM order_records WHERE customer_name = 'kaneko';
SELECT * FROM order_records WHERE unit_price > 2;
- SQL を用いた更新 (Update using SQL)
「UPDATE ... SET ...」は更新.ここには 1つの SQL 文を書き, 「BEGIN TRANSACTION」と「COMMIT」で囲む. ("UPDATE ... SET ..." means database update).
BEGIN TRANSACTION;
UPDATE order_records SET qty=12, updated_at=datetime('now')
WHERE id = 1;
COMMIT;
- SQL を用いた行の削除 (Delete row(s) using SQL)
「DELETE FROM ... WHERE ...」は行の削除.ここには 1つの SQL 文を書き, 「BEGIN TRANSACTION」と「COMMIT」で囲む. ("DELETE FROM ... WHERE ..." means deletion of rows).
BEGIN TRANSACTION;
DELETE FROM order_records
WHERE id = 2;
COMMIT;
- テーブルの CSV ファイル形式でのエクスポート (Export table data)
- .explain による SQL 実行計画の表示 (Get SQL query plan using 'explain')
- ファイルに入った SQL の実行 (Execute SQL file)
- データベーススキーマの表示 (Get database schema)
- テーブルのテキストファイル形式でのダンプとリストア (dump and restore database)
SQLite 3 コマンドライン・インタフェース で SQLite データベースの新規作成 (Create a new database)
Ubuntu での sqlite3 の起動手順(例)
以下の手順で,新規の SQLite データベースファイル「/tmp/mydb」を作成する.
(Create a new SQLite database file '/tmp/mydb' on Ubuntu OS)
- Ubuntu の端末で,次の操作を行う.(Use a terminal, and do the following).
SQLite データベース・ディレクトリ /tmp に移る.
cd /tmp
- sqlite3 の起動 (Start the sqlite3).
データベースを新規作成したいので,
sqlite3 の起動で,
新しいデータベースファイル名を指定する(まだ存在しないファイル名を付ける).
データベースファイル名は自由に付けてよいが、アルファベットのみを使うのが良い..
例えば,データベースファイル名 mydb のデータベースファイルを扱いたい場合は次のような操作になる.
sqlite3 /tmp/mydb
上記の操作で,mydb というデータベースファイル名を持つファイルが無いので,自動的にデータベースファイルが生成される.
※ データベースファイルが生成されるタイミングは,テーブルを定義するなど,データベースの更新を行ったときなので,sqlite3 の起動時点で,データベースファイルが出来ていなくても慌てないこと.
Windows での sqlite3 の起動手順(例)
以下の手順で,新規の SQLite データベースファイル「C:\SQLite\mydb」を作成する.
(Create a new SQLite database file 'C:\SQlite\mydb' on Windows)
- Windows のコマンドプロンプトで,次の操作を行う.(Use the Windows command prompt, and do the following).
SQLite データベース・ディレクトリ C:\SQLite に移る.
C:
cd C:\SQLite
- sqlite3.exe の起動 (Start the sqlite3.exe).
データベースを新規作成したいので,
sqlite3.exe の起動で,
新しいデータベースファイル名を指定する(まだ存在しないファイル名を付ける).
データベースファイル名は自由に付けてよいが、アルファベットのみを使うのが良い..
例えば,データベースファイル名 mydb のデータベースファイルを扱いたい場合は次のような操作になる.
.\sqlite3.exe mydb
上記の操作で,mydb というデータベースファイル名を持つファイルが無いので,自動的にデータベースファイルが生成される.
※ データベースファイルが生成されるタイミングは,テーブルを定義するなど,データベースの更新を行ったときなので,sqlite3 の起動時点で,データベースファイルが出来ていなくても慌てないこと.
ヘルプの表示
「.help」で,ヘルプが表示されます.
文字のエンコーディングの確認
現在使用中のデータベースについての,文字のエンコーディングの確認 (encoding)
「PRAGMA encoding;」で,エンコーディングが表示されます.
データベースの消去
データベースを消したいときは,対応するデータベースファイルを消すだけです.
SQLite 3 コマンドライン・インタフェースの終了
「.exit」で終了.
SQLite 3 コマンドライン・インタフェースで既存のデータベースを開く (Open an existing database)
以下の手順で,既存のデータベースファイル「C:\SQLite\mydb」を開く.
(Open an existing database file 'C:\SQlite\mydb')
- Windows のコマンドプロンプトで,次の操作を行う.(Use the Windows command prompt, and do the following).
SQLite データベース・ディレクトリ C:\SQLite に移る.
C:
cd C:\SQLite
- sqlite3.exe の起動 (Start the sqlite3.exe).
sqlite3.exe の起動時に,使用したいデータベースファイルのファイル名を指定する.例えば,mydbというファイル名のデータベースがすでに生成済みで,これを使いたい場合には,「.\sqlite3 mydb」のようになる.
.\sqlite3.exe mydb
SQL を用いたテーブル定義と一貫性制約の記述 (Table defintion and integrity constrant specification using SQL)
SQL を用いて,order_records テーブルを定義し,一貫性制約を記述する.
(Define 'order_records' table and specify integrity constrants of the table using SQL)
リレーショナル・スキーマ (relational schema): order_records(id, year, month, day, customer_name, product_name, unit_price, qty)
- 次の SQL を入力
(Write the following SQL).
CREATE TABLE order_records (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
year INTEGER NOT NULL CHECK ( year > 2008 ),
month INTEGER NOT NULL CHECK ( month >= 1 AND month <= 12 ),
day INTEGER NOT NULL CHECK ( day >= 1 AND day <= 31 ),
customer_name TEXT NOT NULL,
product_name TEXT NOT NULL,
unit_price REAL NOT NULL CHECK ( unit_price > 0 ),
qty INTEGER NOT NULL DEFAULT 1 CHECK ( qty > 0 ),
created_at DATETIME NOT NULL,
updated_at DATETIME,
CHECK ( ( unit_price * qty ) < 200000 ) );
このとき C:\SQLite に,データベースファイル mydb ができる.(At the time, database file is generated)
※ SQLite では,データベースが始めて使うときに,自動的にデータベースファイルが生成される.データベースファイル名は,データベース論理名と同じになる.
※ データベースファイルが生成されるのは,テーブルを定義するなど,データベースの更新を行ったときなので,最初,sqlite3 を起動したとき,データベースファイルが無くてもあわてないこと.
SQL を用いたテーブルへの行の挿入 (Insert rows into a table using SQL)
次のような order_records テーブルを作る.
(Construct table 'order_records')
以下の手順で,SQL を用いてorder records テーブルへの行の挿入を行う (Insert rows into table 'order_records' using SQL)
- SQL の実行
「INSERT INTO ...」は行の挿入.ここには 4つの SQL 文を書き, 「BEGIN TRANSACTION」と「COMMIT」で囲む. ("INSERT INTO ..." means inserting a row into a table. Four SQL statements are wrote).
※ つまり,
挿入の前に BEGIN TRANSACTION; を実行し,一連の挿入が終わったら
COMMIT; を実行する.(Issue "BEGIN TRANSACTION" before database update and "COMMIT" after database update).
BEGIN TRANSACTION;
INSERT INTO order_records VALUES( 1, 2009, 10, 26, 'kaneko', 'orange A', 1.2, 10, datetime('now'), NULL );
INSERT INTO order_records (year, month, day, customer_name, product_name, unit_price, qty, created_at) VALUES( 2009, 10, 26, 'miyamoto', 'Apple M', 2.5, 2, datetime('now') );
INSERT INTO order_records (year, month, day, customer_name, product_name, unit_price, qty, created_at) VALUES( 2009, 10, 27, 'kaneko', 'orange B', 1.2, 8, datetime('now') );
INSERT INTO order_records (year, month, day, customer_name, product_name, unit_price, created_at) VALUES( 2009, 10, 28, 'miyamoto', 'Apple L', 3, datetime('now') );
COMMIT;
datetime('now') は現在日時の取得.DATETIME型は、YYYY-MM-DD HH:MM:SS形式.
INSERT INTO には 2つの方法がある.(Two styles of "INSERT INTO")
■ 属性の値を,テーブル定義の順に全て並べる (List all attribute values. The order is the same as its table definition)
INSERT INTO order_records VALUES( 1, 2009, 10, 26, 'kaneko', 'orange A', 1.2, 10, datetime('now'), NULL );
■ 属性の値の並び方を,属性名を使って明示的に指定する (Specify the order of attribute values using attribute name list)
このとき,属性値を省略すると,テーブル定義のときに指定されたデフォルト値が使われる (defaults values are used)
INSERT INTO order_records (year, month, day, customer_name, product_name, unit_price, qty, created_at) VALUES( 2009, 10, 26, 'miyamoto', 'Apple M', 2.5, 2, datetime('now') );
一貫性制約に違反する更新ができないことの確認 (Integrity constraint violation is not permitted when database update)
ここでは,一貫性制約に違反するような更新を試みる.データベース管理システムソフトウエアが一貫性を維持するので,
一貫性制約に違反するような更新はできない.
主キー制約 (PRIMARY KEY)
BEGIN TRANSACTION;
INSERT INTO order_records VALUES( 3, 2009, 10, 30, 'kaneko', 'banana', 10, 3, datetime('now'), NULL );
ROLLBACK;
※ すでに属性 id には 3 という値がある.
主キー制約「PRIMARY KEY」に違反.
非空制約 (NOT NULL)
BEGIN TRANSACTION;
INSERT INTO order_records VALUES( 3, 2009, 10, 30, NULL, 'melon', 10, 3, datetime('now'), NULL );
ROLLBACK;
※ 非空制約「NOT NULL」.
属性 customer_name には NULL を入れることができない.
その他の一貫性制約
一貫性制約に違反する例
BEGIN TRANSACTION;
INSERT INTO order_records VALUES( 6, 1009, 10, 30, 'kaneko', 'melon', 10, 3, datetime('now'), NULL );
ROLLBACK;
※ 制約「CHECK ( year > 2008 )」に違反
一貫性制約に違反する例
BEGIN TRANSACTION;
INSERT INTO order_records VALUES( 7, 2009, 10, 31, 'kaneko', 'strawberry', 4.6, 100000, datetime('now'), NULL );
ROLLBACK;
※ 制約「CHECK ( ( unit_price * qty ) < 200000 ) )」に違反
SQL 問い合わせの発行と評価結果の確認 (Issue SQL queries and inspect the results)
ここでは,SQL を用いた問い合わせの実行例を示す.
SQL 問い合わせの詳細については,別の Web ページで説明する.ここでは,テーブルの中身を確認して欲しい.
テーブルの全ての行の表示 (List all rows of a table)
SELECT * FROM order_records;
条件を満足する行のみの表示 (List the rows which satisfy a given condition)
SELECT * FROM order_records WHERE product_name = 'orange A';
SELECT * FROM order_records WHERE product_name LIKE 'orange%';
LIKE は文字列のパターンマッチ
SELECT * FROM order_records WHERE unit_price > 2;
SELECT * FROM order_records WHERE qty > 9 AND customer_name = 'kaneko';
SQL を用いた更新 (Update using SQL)
SQL を用いたデータの更新 (update)の実行例を示す.
「UPDATE <table-name> SET <attribute-name>=<expression> WHERE <expression>」の形をした SQL は,データの更新である.
この SQL 文を 「BEGIN TRANSACTION」と「COMMIT」で囲む. ("UPDATE ... SET ..." means database update).
- SQL の実行 (Execute SQL)
「UPDATE ... SET ...」は更新.ここには 1つの SQL 文を書き,
「BEGIN TRANSACTION」と「COMMIT」で囲む.
("UPDATE ... SET ..." means database update.
BEGIN TRANSACTION;
UPDATE order_records SET qty=12, updated_at=datetime('now')
WHERE id = 1;
COMMIT;
- order_records テーブルの中身を確認 (Inspect the table 'order_table')
SQL を用いた行の削除 (Delete row(s) using SQL)
SQL を用いた行の削除 (delete row(s))の実行例を示す.
「DELETE FROM <table-name> WHERE <expression>;」の形をした SQL は行の削除である.
この SQL 文を 「BEGIN TRANSACTION」と「COMMIT」で囲む. ("DELETE FROM ... WHERE ..." means deletion of rows).
- SQL の実行 (Execute SQL)
BEGIN TRANSACTION;
DELETE FROM order_records
WHERE id = 2;
COMMIT;
- order_records テーブルの中身を確認 (Inspect the table 'order_table')
テーブルの CSV ファイル形式でのエクスポート (Export table data)
- 出力モードを CSV に設定し,出力先をファイルに指定した後,「SELECT * FROM ...」を実行
.mode csv
.output order_records.csv
SELECT * FROM order_records;
- 出力先をファイルにしたままでは混乱するので,画面(標準出力)に出力するように戻しておく.
.output stdout
- 念のため Microsoft Excel で開いて確認してみる
.mode による出力モードの切り替え
主な出力モードは次の通りです
- 「.mode csv」: コンマ区切りデータ (Comma-seperated values)
- 「.mode column」: 左詰め形式
- 「.mode list」: 所定のセパレータで区切る表示(セパレータは,「.seperator」で変更できます).
.output による実行結果のファイル出力
SQL の実行結果をファイルに出力するには,「.output」を使います.
- 「.output <ファイル名>」: ファイルに出力
- 「.output stdout」: 画面(標準出力)に出力
.explain による SQL 実行計画の表示 (Get SQL query plan using 'explain')
SQL 文の前に「explain」を付けると,SQL は実行されずに,実行計画が表示されます.
これと別に「.explain」というコマンドがあります.
「.explain on」と「.explain off」により,表示形式が変わります(表示形式が変わるだけです).
ファイルに入った SQL の実行
.read <ファイル名>
データベーススキーマの表示 (Get database schema)
テーブル一覧の表示 (list of tables)
データベース内のテーブル一覧を表示するには,sqlite_master,
sqlite_temp_masterという名前が付いた特別なテーブルを使います.
- sqlite_master: TEMPORARY テーブル以外のデータベーススキーマが格納されている.
- sqlite_temp_master: TEMPORARY テーブルのデータベーススキーマが格納されている.
データベーススキーマを見たいときは,次のような操作を行います.
SELECT * FROM sqlite_master;
SELECT * FROM sqlite_temp_master;
※ sqlite_master, sqlite_temp_master に,DROP TABLE, UPDATE, INSERT, DELETE 操作を行うことは許されていません.
インデックス名の一覧表示 (list of index name)
SQLite コマンドライン・インタフェースの「.indices」コマンドを使い,インデックス名を表示できます.
CREATE INDEX idx1 ON order_records(customer_name);
.indices
テーブルのテキストファイル形式でのダンプとリストア (dump and restore database)
.dump を使い,データベースのダンプ.特定のテーブルだけをダンプしたいときは,「.dump commodity」のようにする
単にダンプを実行すると,スクリーンにダンプ結果が出力されます.
ダンプ結果をファイルに保存したいときは,先に「.output <ファイル名>」を実行します.
ファイルに保存されたダンプ結果をリストアしたいときは,「.read ファイル名」を実行します.