やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3学習をはじめよう

 なんもわかってなかったと気付く。

対象環境

きっかけ

 偶然こちら表制約の存在をはじめて知った。こんな基本的なことすら知らなかったことにショック。

たとえば

create table if not exists MyTable(
    id int primary key,
    age int,
    name text,
    constraint c1 check((0<=age and age>=200) and (name='A' or name='B'))
);

 以下2つを知らなかった。

  • if not exists
  • constraint

反省

 今までネットで見たコードを適当にコピペして理解したつもりになっていた。別に今まで困らなかったから、と思っていたが、if not existsを知らないがゆえにdrop tableしてからcreate tableとかやってた。いや、結果的にそれでいいのかもしれないが、良し悪しを判断する以前に、そもそも知らなかったのが問題。いかん。これはいかん。

 そこで、ちゃんと資料を読むことにする。読んでなかったからわかってなくて当然だった。

資料

 SQLite3の公式資料と思われる。まずはこれをザッと順に流し読み。

 構文なら上記か。これを読めばSQLを書けるようになりそう。

 リリース一覧。最新機能を知れる。

 いずれにせよ英文なので、自動翻訳しながら読むことになる。

非実装機能

項目 実装済 非実装
外部結合 LEFT OUTER JOIN RIGHT OUTER JOIN(FULL OUTER JOIN)
ALTER TABLE RENAME TABLE, ADD COLUMN, RENAME COLUMNのみ DROP COLUMN,ALTER COLUMN,ADD CONSTRAINT等ほぼ全て
トリガー FOR EACH ROW FOR EACH STATEMENT
ビュー書込 DELETE,INSERT,UPDATE時に起動するトリガーで実行 ビューに対してDELETE,INSERT,UPDATEできない
GRANT,REVOKE 無意味のため非実装 無意味のため非実装

 SQLite3はファイルベースである。その上、軽量である。だが機能は少ない。

SQLキーワード

 SQL構文を俯瞰できる。ザッと目を通す。

 たとえばSELECTのようなキーワードがある。たしかSQLは大文字小文字を区別しない。なのでselectsElectもキーワードのはず。

キーワード一覧

  1. ABORT
  2. ACTION
  3. ADD
  4. AFTER
  5. ALL
  6. ALTER
  7. ANALYZE
  8. AND
  9. AS
  10. ASC
  11. ATTACH
  12. AUTOINCREMENT
  13. BEFORE
  14. BEGIN
  15. BETWEEN
  16. BY
  17. CASCADE
  18. CASE
  19. CAST
  20. CHECK
  21. COLLATE
  22. COLUMN
  23. COMMIT
  24. CONFLICT
  25. CONSTRAINT
  26. CREATE
  27. CROSS
  28. CURRENT
  29. CURRENT_DATE
  30. CURRENT_TIME
  31. CURRENT_TIMESTAMP
  32. DATABASE
  33. DEFAULT
  34. DEFERRABLE
  35. DEFERRED
  36. DELETE
  37. DESC
  38. DETACH
  39. DISTINCT
  40. DO
  41. DROP
  42. EACH
  43. ELSE
  44. END
  45. ESCAPE
  46. EXCEPT
  47. EXCLUDE
  48. EXCLUSIVE
  49. EXISTS
  50. EXPLAIN
  51. FAIL
  52. FILTER
  53. FOLLOWING
  54. FOR
  55. FOREIGN
  56. FROM
  57. FULL
  58. GLOB
  59. GROUP
  60. GROUPS
  61. HAVING
  62. IF
  63. IGNORE
  64. IMMEDIATE
  65. IN
  66. INDEX
  67. INDEXED
  68. INITIALLY
  69. INNER
  70. INSERT
  71. INSTEAD
  72. INTERSECT
  73. INTO
  74. IS
  75. ISNULL
  76. JOIN
  77. KEY
  78. LEFT
  79. LIKE
  80. LIMIT
  81. MATCH
  82. NATURAL
  83. NO
  84. NOT
  85. NOTHING
  86. NOTNULL
  87. NULL
  88. OF
  89. OFFSET
  90. ON
  91. OR
  92. ORDER
  93. OTHERS
  94. OUTER
  95. OVER
  96. PARTITION
  97. PLAN
  98. PRAGMA
  99. PRECEDING
  100. PRIMARY
  101. QUERY
  102. RAISE
  103. RANGE
  104. RECURSIVE
  105. REFERENCES
  106. REGEXP
  107. REINDEX
  108. RELEASE
  109. RENAME
  110. REPLACE
  111. RESTRICT
  112. RIGHT
  113. ROLLBACK
  114. ROW
  115. ROWS
  116. SAVEPOINT
  117. SELECT
  118. SET
  119. TABLE
  120. TEMP
  121. TEMPORARY
  122. THEN
  123. TIES
  124. TO
  125. TRANSACTION
  126. TRIGGER
  127. UNBOUNDED
  128. UNION
  129. UNIQUE
  130. UPDATE
  131. USING
  132. VACUUM
  133. VALUES
  134. VIEW
  135. VIRTUAL
  136. WHEN
  137. WHERE
  138. WINDOW
  139. WITH
  140. WITHOUT

キーワードを使う

 キーワードを識別子として使うときはダブルクォートで囲む。

select id, "select" from MyTable;

 文字リテラルとするときはシングルクォートで囲む。

insert into MyTable values(1, 'insert');

引用符

 SQLite3で使う引用符は4種類ある。

引用符 概要
'' 文字列リテラル
"" 識別子
[] SQL標準。MS AccessSQL Serverとの互換性のため。スペースは-で置き換える。
`` SQL標準。MySQLとの互換性のため。

 上2つだけ使うほうがシンプルで良い。

気になる機能

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux