SQLiteに入門する。
この本を買った。
この本でのSQLiteのバージョンは3.6.23だった。
2023年8月現在、最新バージョンは3.43.0だが、どれだけ変わってるのかは不明。
0章
基本
SQLコマンドは以下の3種類に分類される。
- データ操作言語(DML: Data Manipulation Language)
- データ定義言語(DDL: Data Definition Language)
- データ制御言語(DCL: Data Control Language)
DML
INSERT, SELECT, UPDATE, DELETEなど。
DDL
デーブル作成、インデックスやビューの作成、トリガーの作成など。
DCL
トランザクションの制御やロックの制御など。
SQLiteの手軽さとデメリット
- SQLiteはユーザの概念がないため、どのユーザがデータベースにアクセスできるかの権限設定ができない
- データ型の管理を行わないため、数値型のフィールドに文字列を格納することもできてしまう
というSQLiteの手軽さとデメリットが挙げられていた。
とは言え現代ではLineterを入れたりORMやQuery builderを使えば型の不一致は起こらなそうなので心配する必要はない。
データ型
データ型 | 意味 |
---|---|
NULL | データが入っていない状態 |
INTEGER | 正負の整数。データにより、1、2、3、4、6、8バイトのサイズをとる |
REAL | 8バイトのIEEE浮動小数点数 |
TEXT | 文字列。UTF-8、UTF-16BE、UTF-16-LEのエンコーディングを使用する |
BLOB | Binary Large OBjectの略。入力されたデータがそのままの形で格納される |
システムテーブル
SQLiteのシステムテーブルは全て読み取り専用。
テーブル名 | 内容 | 補足 |
---|---|---|
sqlite_master | テーブルの定義 | テーブルを作成した時に実行したCREATE TABLEコマンドが格納される |
sqlite_temp_table | テンポラリテーブルの定義 | テンポラリテーブルを作成した時に実行したCREATE TEMPORARY TABLEコマンドが格納される |
sqlite_sequence | オートナンバーの最大値 | オートナンバーを指定したフィールドの最大値が格納される |
sqlite_stat1 | 統計情報 | ANALYZEコマンドによって収集された統計情報が格納される |
SQLiteでできること
- テーブル、ビュー
- インデックス
- トランザクション
- 主キー、外部キーなどのフィールド制約
- オートナンバー
SQLコマンドはSQL92に準拠しており、基本的なSQLコマンドや関数、演算子を使用することもできる。
OUTER JOINやUNIONもサポートされている。
SQLiteでできないこと
- トリガーの一部機能
- フィールドの追加意外のALTER TABLEコマンド
- 右外部結合および完全外部結合
- ビューへの書き込み
- GRANTおよびREVOKEコマンド
FOR EACH STATEMENTトリガーや、テーブルに対してのINSTEAD OFトリガーを指定することはできない。
ALTER TABLEコマンドはフィールドの追加のみサポートされており、削除やフィールド名の変更はサポート外。
また、右外部結合(RIGHT JOIN)と完全外部結合(FULL OUTER JOIN)はサポート外。
さらに、ビューは読み取り専用だが、トリガーないではビューに対してDELETEやINSERT、UPDATEも実行できる。
SQLiteにはユーザ権限という概念はないため、GRANT、REVOKEといったユーザ権限に関するSQLコマンドを実行できない。
PRAGMAコマンド
SQLite独自のコマンドだそう。
SQLite自体の動作を変更したり、その設定内容をライブラリに問い合わせるために使用するコマンド。
関数
大きく分けて、集計、文字列、日付、変換、算術、分析、その他の7種類の関数が定義されているそう。
演算子
大きく分けて、集合、算術、ビット、比較、論理、単項、その他の7種類の演算子が定義されているそう。
エンコーディング
SQLite 3ではUTF-8とUTF-16のエンコーディングを扱うことができる。
ファイル構成
SQLiteではデータベースファイルの他に、7種類のファイルを一時的に生成し使用する。
これらのファイルはSQLiteが必要に応じて自動的に生成し、自動的に削除する。
ファイル | 意味 |
---|---|
ロールバックジャーナル | トランザクションのロールバックの際に使用される |
マスタージャーナル | 1つのトランザクションの処理中に、メインのデータベースとあタッチされたデータベースに対して更新をかけた時に生成される |
ステートメントジャーナル | トランザクションの処理中に、多くのデータを対象とした更新クエリを実行する際のロールバックのために使用される |
TEMPデータベース | CREATE TEMP TABLEコマンドを使用した際に作成される |
ビューとサブクエリのマテリアライズ | 複雑なサブクエリを使用する際、クエリの結果を一時的に保存するために使用される |
一時的なインデックスリスト | ORDER BYやUNIONなどのクエリで一時的に使用するインデックスを保持するために使用される |
VACUUMによって使用された一時的なデータベース | VACUUMコマンドの実行時、リビルドしたデータを一時的に保持するために使用される |
VACUUMコマンド
SQLiteでは、削除したデータがそれまで使用していたディスク領域はそのまま解放されず、パフォーマンス悪化に繋がる。
VACUUMコマンドは不要になったディスク領域を解放してくれる。
予約語
SQLiteでは多くの予約語が定義されている。
ここは被らないように気をつければいいだけの話なので深く覚えなくていいかな。
コメント
SQLiteのコメントの書き方は2種類ある。
-- これは1行だけのコメントです
/*
これは複数行
のコメントです。
*/
1章
SQLiteのインストール方法と起動方法が書いていた。
省略。
心折れた。