SQLite学習メモ

:large_blue_diamond:**SQLiteのこと**
基本はデータベース毎に1ファイル作成して管理する。

:large_blue_diamond:**データ型**
テーブル作成時に型の定義は必須でない。
どんな型かは区別されている。

NULL
INTEGER
TEXT
REAL
BLOB

:large_blue_diamond:**テーブル作成時に指定できる型**

NONE
INTEGER
TEXT
REAL
NUMERIC

:large_blue_diamond:**データベースの作成・接続**
`sqlite3 データベース名`

一致するデータベース名があれば接続される。
一致するデータベース名がなければ新規作成され、接続される。
「データベース名」がそのままファイル名として作成される。
接続されるとプロンプト(コマンドを入力する場所)が`sqlite>`となる。

:small_blue_diamond:sqlite3.exeファイルのあるディレクトリ以外にデータベースファイルを作成したい場合
`sqlite3 パス名¥データベース名`

:large_blue_diamond:**テーブル作成**
`create table テーブル名(カラム名,　カラム名);`

:small_blue_diamond:型を指定する時
`create table テーブル名(カラム名 型,　カラム名 型);`

:large_blue_diamond:**テーブル名変更**
`alter table テーブル名 rename to 新テーブル名;`

:large_blue_diamond:**テーブル削除**
`drop table テーブル名;`

:large_blue_diamond:**データの追加**
①`insert into user values(データ, データ);`
②`insert into テーブル名(カラム名, カラム名, カラム名) values(データ名 データ名, データ名);`

:bulb:DEFAULT制約をつけているカラムをDEFALUTの値で登録させたい時は①の方法ではカラム数不足でエラーが出る。②で登録したいカラムのみ設定するとできる。

:large_blue_diamond:**存在しているテーブルの確認**
接続している状態で`.tables`

:large_blue_diamond:**プライマリーキーの設定**
`create table テーブル名(カラム名 型 primary key, カラム名 型);`

:small_blue_diamond:integer型にプライマリーキーの設定
`create table テーブル名(カラム名 integer primary key, カラム名 型);`
新データ追加時、存在している最大値＋1の数を自動で付与してくれる。

`insert into user(name) values('あああ');`
→idが自動で付与される

:large_blue_diamond:**autoincrementの設定**
`create table テーブル名(カラム名 型 primary key　autoincrement, カラム名 型);`

これをつけると、一度使われた値は割り当てられなくなり、今まで付与された最大値＋1の値がカラムに設定される。
primary keyだけだと削除したデータがあれば新データはその値がもう一度割り当てられちゃう。

:large_blue_diamond:**ROWIDの表示**
`select *, rowid from テーブル名;`

ROWIDとは、データ追加時に自動で付与される非表示のid。
:bulb:integer型のプライマリーキーを設定すると御暗示値を取る

:large_blue_diamond:**カラムの追加**
`alter table テーブル名 add column 新カラム名 型;`

型は指定してもしなくてもよい。

:large_blue_diamond:**NOT NULL制約**
`create table テーブル名(カラム名 型 not null, カラム名 型);`

対象のカラムにはnullが入れられなくなる。

:large_blue_diamond:**UNIQUE制約**
`create table user(id integer unique, name text);`

対象のカラムには同じ値が入れられなくなる。
:bulb:nullは重複可

:small_blue_diamond:複数カラムの組み合わせにUNIQUE制約
`create table テーブル名(カラム名 型, カラム名 型, カラム名 型, unique(カラム名1, カラム名2));`

カラム名1とカラム名2の値は重複可能。
組み合わせの重複が不可。

:large_blue_diamond:**DEFAULT制約**
`create table product(カラム名 型 default デフォルト値);`

何もいれずに登録した時にDEFAULTで設定した値が反映される。
null、文字列、数値、が設定できる。

:small_blue_diamond:日付のデフォルト値設定
`create table product(カラム名 default CURRENT_TIME);`

追加した時点の日時を登録できる。

①CURRENT_TIME 「HH:MM:SS」
②CURRENT_DATE 「YYYY-MM-DD」
③CURRENT_TIMESTAMP「YYYY-MM-DD HH:MM:SS」

:large_blue_diamond:**CHECK制約**
`create table テーブル名(カラム名 型, カラム名 型 check(条件式));`
`create table テーブル名(カラム名1, カラム名2, ... , check(条件式));`

カラム追加時に条件に一致しているか判定してくれる。
:bulb:ANDやORを使って条件式を複雑にもできる

例）年齢が1歳より大きく10歳未満
`create table user(id integer, old integer check(old > 1 and old < 10));`

:large_blue_diamond:**終了**
`.exit`

:large_blue_diamond:**Viewの作成**
SELECT分の条件に合う中身を引き抜いて仮想のテーブルを作成できる。
`create view ビュー名 as SELECT文;`

例）create view ppriceview as select name, price from product where price > 100;

:small_blue_diamond:Viewの中身確認
`select * from 作成したビュー名;`

:small_blue_diamond:View一覧の確認
Viewのみを一覧する機能はない。
`.tables`でテーブルと共にViewも一覧表示される。

:small_blue_diamond:Viewが作られた時のSQL文確認
`select name, sql from sqlite_master where type = 'view';`

:large_blue_diamond:**Viewの削除**
`drop view ビュー名`




:large_blue_diamond:**設定されているコマンドを確認**
データベースに接続されている状態で`.show`

:large_blue_diamond:**テーブルを選択**
`select * from テーブル名;`
指定したテーブルの中身が確認できる。

:large_blue_diamond:**コメントを残す**
`-- コメント`
`/* コメント */`

:large_blue_diamond:**文字列のエスケープ処理**
「'」を前に入れる
`insert into テーブル名　value('I''m a human.');`

:large_blue_diamond:**テーブルがどのように作成されたか確認**
スキーマ情報が確認できる。
:bulb:`.mode line`を使うと表示が見やすくなる。

①`select * from sqlite_master;`
②`.schema`

:small_blue_diamond:特定のテーブルを指定
①`select * from sqlite_master where type='table' and name='テーブル名';`
②`.schema テーブル名`

:bulb:**コマンドが長い時**
SQL文が長くなると、何を書いているか分からなくなってくる。
SQL文は`；`が付くまで1つの文として扱われるので
長ければEnterキーを押して改行できる。
ちょっと見やすくなる。

:large_blue_diamond:**参考記事**
DBOnline　SQLite入門
https://www.dbonline.jp/sqlite/