sqlite3 : Tips

Last Change: 19-Aug-2015.
author : qh73xe

このページには sqlite3 関連のTipsを記述しておきます。

基本的な使い方

外部ファイルに記述した SQL を実行する

sqlite3 コマンドラインツールから

コマンドラインツールから SQL を読み込む場合、.read コマンドを使用します。

$ sqlite3 hoge.db
sqlite> .read hoge.sql
  • この際、SQL を記述したファイルの拡張子は任意のものでかまいません。
    • 私は分かりやすく sql という拡張子を使用します。

sqlite3 コマンドに直接引き渡す

外部ファイルを直接コマンドラインに渡すことも可能です。

$ sqlite3 hoge.db < foo.sql
  • この場合実行結果が直接、標準出力に表示されます。

Shell スクリプト上で使用する

shell スクリプト内で直接 SQL を記述する場合例えば以下のようにします。

#!/bin/sh

db=$1

sqlite3 $1 <<END
select * from hoge;
END

このスクリプトの場合実行は以下のような感じです。

sh ./foo.sh piyo.db

sqlite3 を vim から操作する

** dbext.vim ** というプラグインを入れると vim から sqlite3 のDB を弄ることが可能です。

  • SQL の補完も可能なので (sqlite3コマンドラインツールではできない?) こっちから弄る方が便利かもしれません。

設定関係

タブ区切りの出力を得る

sqlite3 で DB をいじっている際、直接検索結果をファイルにしたい場合があります。 そのような場合以下のようにすると便利です。

.mode tabs
.output <ファイル名.txt>
<適当なクエリ>

上記の様にコマンドを入力すると最後のクエリの出力結果をファイルに書き出します。

注釈

.mode の対応している形式について

.mode コマンドは以下の形式に対応しています。

  • csv カンマ区切りで出力
  • column カラム毎に左揃えで出力
  • html HTMLのTABLE形式で出力
  • insert INSERT文として出力
  • line 各カラム毎に行を分けて出力
  • list 区切り文字でカラムを区切り1行で出力(デフォルト)
  • tabs タブ区切りで出力
  • tcl TCLのlist形式で出力

出力の際にフィールド名を出力させる

.header(s) ON|OFF を指定するとそれ以降のクエリにヘッダを表示するか否かを決めることができます. なお,デフォルトの設定は OFF なので,基本的にはヘッダを付けたい時のみ以下のように使用します.

sqlite> .header ON
sqlite> <適当なクエリ>

SQL 関係

重複数が n 個以上のデータを取得する

GROUP BY, HAVING, COUNT を使用します.

SELECT 検索行 FROM 該当テーブル
GROUP BY 検索行 HAVING COUNT(検索行) <> 1

副クエリを設定する

副クエリとは,WHERE =(LIKE/IN) 文に渡す条件を選択するための クエリのことです.

SELECT * From xxxTable
    WHERE hoge1 IN (
        SELECT hoge2 From xxxTable
            WHERE foo = 'piyopiyo'
    )

例えば上記の例では xxxTable の foo が piyopiyo になっている時の hoge2 を持ってきて, その値と hoge1 が同じデータのみを持っていく処理を行います.

  • 時系列的なイベントを記録したデータであるイベントの開始,終了時刻を保持しているデータを扱う際に便利です.
    • 終了時刻が開始時刻のデータを持ってくると一つ後のイベント指定が可能ですし,逆もできます.