2026年3月21日土曜日

SQLite 3 .mode で幅広文字の表示が改善された

概要

コマンドラインツールには select 文の結果表示モードを変更する .mode コマンドがある。

今までだと、このコマンドで指定できるモードのうち boxcolumn では 幅広の文字を表示しようとすると体裁が崩れてしまっていた。

ver 3.51.0 でこれが改善され、日本語のひらがなや漢字でも体裁が崩れることなく表示されるようになった。

構文

改善された表示モードは以下の通り。


.mode box
.mode column
.mode markdown
.mode qbox
.mode table
                    

実行例

まずは古いバージョンでの見え方。

環境
  • Windows 11
  • SQLite3 Command-Line Shell ver 3.49.0

sqlite> .version
SQLite 3.49.0 2025-02-06 11:55:18 4a7dd425dc2a0e5082a9049c9b4a9d4f199a71583d014c24b4cfe276c5a77cde
zlib version 1.3
msvc-1939 (64-bit)

sqlite> create table user (id, name);
sqlite> insert into user values ('0001', 'ほげほげ');
sqlite> select * from user;
0001|ほげほげ

sqlite> .mode box
sqlite> select * from user;
┌──────┬──────┐
│  id  │ name │
├──────┼──────┤
│ 0001 │ ほげ │
└──────┴──────┘

sqlite> .mode column
sqlite> select * from user;
id    name
----  ----
0001  ほげ

sqlite> .mode markdown
sqlite> select * from user;
|  id  | name |
|------|------|
| 0001 | ほげ |

sqlite> .mode qbox
sqlite> select * from user;
┌────────┬────────┐
│   id   │  name  │
├────────┼────────┤
│ '0001' │ 'ほげほげ'  │
└────────┴────────┘

sqlite> .mode table
sqlite> select * from user;
+------+------+
|  id  | name |
+------+------+
| 0001 | ほげ |
+------+------+
                        

上記の例では、「name」カラムに「ほげほげ」というデータが入っているが、 表示モードを切り替えることで体裁が崩れ、データが欠けてしまっていることがわかる。

これが ver 3.51.0 以降は改善され、表示されるようになる。

環境
  • Windows 11 64bit
  • SQLite Command-Line Shell ver 3.51.3

sqlite> .version
SQLite 3.51.3 2026-03-13 10:38:09 737ae4a34738ffa0c3ff7f9bb18df914dd1cad163f28fd6b6e114a344fe6d618
zlib version 1.3
msvc-1939 (64-bit)

sqlite> create table user (id, name);
sqlite> insert into user values ('0001', 'ほげほげ');
sqlite> select * from user;
0001|ほげほげ

sqlite> .mode box
sqlite> select * from user;
┌──────┬──────────┐
│  id  │   name   │
├──────┼──────────┤
│ 0001 │ ほげほげ │
└──────┴──────────┘

sqlite> .mode column
sqlite> select * from user;
id    name
----  --------
0001  ほげほげ

sqlite> .mode qbox
sqlite> select * from user;
┌────────┬────────────┐
│   id   │    name    │
├────────┼────────────┤
│ '0001' │ 'ほげほげ' │
└────────┴────────────┘

sqlite> .mode markdown
sqlite> select * from user;
|  id  |   name   |
|------|----------|
| 0001 | ほげほげ |


sqlite> .mode table
sqlite> select * from user;
+------+----------+
|  id  |   name   |
+------+----------+
| 0001 | ほげほげ |
+------+----------+
                        

参考URL

2026年3月15日日曜日

SQLite3 SQL実行にかかった時間を計測する (.timer)

概要

SQLite3 で SQL を実行した際、実行にかかった時間を計測するためのコマンド。

計測出来るのは SQL のみで、コマンドラインツールのコマンドの実行時間は計測出来ない。

構文

時間計測を有効化する「on」/ 無効化する「off」
出力される時間の単位は「秒」。


.timer on
.timer off
                    

実行例

環境
  • Windows 11
  • SQLite Command-Line Shell ver 3.51.3

時間計測を「on」にしてSQLを実行する


c:\temp> rem  # 1
c:\temp> sqlite3 sample.db

sqlite> -- # 2
sqlite> .timer on

sqlite> -- # 3
sqlite> select * from user;
...
Run Time: real 4.729 user 0.312500 sys 1.078125
                        
  1. コマンドラインツールで「sample.db」というsqliteデータベースを開く
  2. 時間計測を「on」にする
  3. SQLを実行すると、SQLの実行結果の後に計測結果が秒単位で出力される

各項目の意味は以下の表の通りで、これはUNIXの timeコマンドの結果と同等の内容と思われる。 (SQLite3 公式サイトに正式な説明が載っていないので推測)

種類 意味
real 実際に経過した時間。
I/O待ちや他のプロセスの影響などクエリの開始から終了までの時間になる。 コマンドラインツール上であれば、select の結果をディスプレイに出力するのにかかった時間も含まれる。
user CPUが使われた時間。
実行する SQLの解析、テーブルのJOIN、ソート計算や関数の実行にかかった時間。 SQL 文の品質を確認したいならこの時間を確認すればよさそう。
sys OSが処理した時間。
ファイルの読み書きの時間が含まれる。 ケースに寄りけりだが、SQLite3 ではそこまで重要視する時間ではないかも。

一般的に real ≧ user + sys となる想定

時間計測を止めるには以下のようにコマンドを実行する


sqlite> .timer off
                        

参考URL

2026年2月1日日曜日

SQLite3 文字列を結合する (concat(X,Y,...))

概要

文字列を結合するには||演算子か 関数concat()を使用する。

構文


X || Y || ...
concat(X,Y,...)
                

実行例

単純に文字列を結合する例:

sqlite> select 'taro' || '.' || 'yamada';
taro.yamada
sqlite> select concat('taro','.','yamada');
taro.yamada
                
テーブルのカラムを結合する例:

sqlite> select * from user;
┌────┬────────────┬───────────┐
│ id │ first_name │ last_name │
├────┼────────────┼───────────┤
│ 1  │ taro       │ yamada    │
│ 2  │ jiro       │ yamada    │
│ 3  │ hanako     │ suzuki    │
└────┴────────────┴───────────┘
sqlite> .mode box
sqlite> select
   ...>     first_name || '.' || last_name
   ...>         as full_name
   ...> from
   ...>     user;
┌───────────────┐
│   full_name   │
├───────────────┤
│ taro.yamada   │
│ jiro.yamada   │
│ hanako.suzuki │
└───────────────┘

sqlite> select
   ...>     concat (first_name, '.', last_name)
   ...>         as full_name
   ...> from
   ...>     user;
┌───────────────┐
│   full_name   │
├───────────────┤
│ taro.yamada   │
│ jiro.yamada   │
│ hanako.suzuki │
└───────────────┘
                

NULLを含む場合

||演算子の対象にNULLが含まれる場合、結果もNULLになる:

sqlite> .nullvalue [null]
sqlite> select 'taro' || NULL ;
┌────────────────┐
│ 'taro' || NULL │
├────────────────┤
│ [null]         │
└────────────────┘
                
concat()の引数にNULLが含まれる場合、空文字として扱われる:

sqlite> .nullvalue [null]
sqlite> select concat('taro', NULL );
┌───────────────────────┐
│ concat('taro', NULL ) │
├───────────────────────┤
│ taro                  │
└───────────────────────┘
                

参考URL

2026年1月23日金曜日

SQLite3 ソートしたときのNULLの位置を調整する

概要

NULLを含むデータをソートした場合、 デフォルトだとNULLは最小値より小さい値としてソートされる。
nulls first、もしくは nulls last を使用することで、 NULLの位置をコントロールすることができる。

構文

NULL を最初に配置する。

order by column_name nulls first
                
NULL を最後に配置する。

order by column_name nulls last
                

実行例

環境
  • Windows 10 64bit
  • SQLite Command-Line Shell ver 3.50.4
以下のテーブルからデータをソートして取得する。
id name
0 hoge1
1 hoge2
2
昇順ソートでNULLの位置を調整する
nameカラムに対し、
  1. 何も指定しない場合
  2. ascだけを指定した場合
  3. nulls firstを指定した場合、 ascだけを指定した場合と同じ結果になる
  4. ascnulls first は一緒に指定することもできる(結果は同じ)
  5. nulls lastを指定した場合、 値が入っているレコードが先に来て、nullが最後に来る

sqlite> .nullvalue [null]
sqlite> .mode box
sqlite> -- 1.
sqlite> select * from user;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 0  │ hoge1  │
│ 1  │ hoge2  │
│ 2  │ [null] │
└────┴────────┘
sqlite> -- 2.
sqlite> select * from user order by name asc;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 2  │ [null] │
│ 0  │ hoge1  │
│ 1  │ hoge2  │
└────┴────────┘
sqlite> -- 3.
sqlite> select * from user order by name nulls first;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 2  │ [null] │
│ 0  │ hoge1  │
│ 1  │ hoge2  │
└────┴────────┘
sqlite> -- 4.
sqlite> select * from user order by name asc nulls first;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 2  │ [null] │
│ 0  │ hoge1  │
│ 1  │ hoge2  │
└────┴────────┘
sqlite> -- 5.
sqlite> select * from user order by name asc nulls last;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 0  │ hoge1  │
│ 1  │ hoge2  │
│ 2  │ [null] │
└────┴────────┘
sqlite> select * from user order by name nulls last;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 0  │ hoge1  │
│ 1  │ hoge2  │
│ 2  │ [null] │
└────┴────────┘
                    
降順ソートでNULLの位置を調整する
nameカラムに対し、
  1. descだけを指定した場合
  2. desc nulls firstを指定した場合、 値が入っているレコードが後に来て、nullが最初に来る
  3. desc nulls lastを指定した場合、 descを単独で指定した場合と同じ結果になる

sqlite> -- 1.
sqlite> select * from user order by name desc;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 1  │ hoge2  │
│ 0  │ hoge1  │
│ 2  │ [null] │
└────┴────────┘
sqlite> -- 2.
sqlite> select * from user order by name desc nulls first;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 2  │ [null] │
│ 1  │ hoge2  │
│ 0  │ hoge1  │
└────┴────────┘
sqlite> -- 3.
sqlite> select * from user order by name desc nulls last;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 1  │ hoge2  │
│ 0  │ hoge1  │
│ 2  │ [null] │
└────┴────────┘
                    

参考URL