什么是 SQLite?
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。
为什么要用 SQLite?
(1).不需要一个单独的服务器进程或操作的系统(无服务器的)。
(2).SQLite 不需要配置,这意味着不需要安装或管理。
(3).一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
(4).SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
(5).SQLite 是自给自足的,这意味着不需要任何外部的依赖。
(6).SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
(7).SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
(8).SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
(9).SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
SQLite 局限性
在 SQLite 中,SQL92 不支持的特性如下所示:
特性 描述
RIGHT OUTER JOIN 只实现了 LEFT OUTER JOIN。
FULL OUTER JOIN 只实现了 LEFT OUTER JOIN。
ALTER TABLE 支持 RENAME TABLE 和 ALTER TABLE 的 ADD COLUMN variants 命令,不支持 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT。
Trigger 支持 支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器。
VIEWs 在 SQLite 中,视图是只读的。您不可以在视图上执行 DELETE、INSERT 或 UPDATE 语句。
GRANT 和 REVOKE 可以应用的唯一的访问权限是底层操作系统的正常文件访问权限。
SQLite 命令
与关系数据库进行交互的标准 SQLite 命令类似于 SQL。命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。这些命令基于它们的操作性质可分为以下几种:
(1).DDL - 数据定义语言
命令 描述
CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。
ALTER 修改数据库中的某个已有的数据库对象,比如一个表。
DROP 删除整个表,或者表的视图,或者数据库中的其他对象。
(2).DML - 数据操作语言
命令 描述
INSERT 创建一条记录。
UPDATE 修改记录。
DELETE 删除记录。
(3).DQL - 数据查询语言
命令 描述
SELECT 从一个或多个表中检索某些记录。
********************************************************************************************
********************************************************************************************
命令行进入
$ sqlite3
SQLite version 3.3.6
Enter ".help" for instructions
sqlite>
------------------------------------
需获取可用的点命令的清单
.help
------------------------------------
命令 描述
.backup ?DB? FILE 备份 DB 数据库(默认是 "main")到 FILE 文件。
.bail ON|OFF 发生错误后停止。默认为 OFF。
.databases 列出数据库的名称及其所依附的文件。
.dump ?TABLE? 以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。
.echo ON|OFF 开启或关闭 echo 命令。
.exit 退出 SQLite 提示符。
.explain ON|OFF 开启或关闭适合于 EXPLAIN 的输出模式。如果没有带参数,则为 EXPLAIN on,及开启 EXPLAIN。
.header(s) ON|OFF 开启或关闭头部显示。
.help 显示消息。
.import FILE TABLE 导入来自 FILE 文件的数据到 TABLE 表中。
.indices ?TABLE? 显示所有索引的名称。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表的索引。
.load FILE ?ENTRY? 加载一个扩展库。
.log FILE|off 开启或关闭日志。FILE 文件可以是 stderr(标准错误)/stdout(标准输出)。
.mode MODE 设置输出模式,MODE 可以是下列之一:
csv 逗号分隔的值
column 左对齐的列
html HTML 的 <table> 代码
insert TABLE 表的 SQL 插入(insert)语句
line 每行一个值
list 由 .separator 字符串分隔的值
tabs 由 Tab 分隔的值
tcl TCL 列表元素
.nullvalue STRING 在 NULL 值的地方输出 STRING 字符串。
.output FILENAME 发送输出到 FILENAME 文件。
.output stdout 发送输出到屏幕。
.print STRING... 逐字地输出 STRING 字符串。
.prompt MAIN CONTINUE 替换标准提示符。
.quit 退出 SQLite 提示符。
.read FILENAME 执行 FILENAME 文件中的 SQL。
.schema ?TABLE? 显示 CREATE 语句。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表。
.separator STRING 改变输出模式和 .import 所使用的分隔符。
.show 显示各种设置的当前值。
.stats ON|OFF 开启或关闭统计。
.tables ?PATTERN? 列出匹配 LIKE 模式的表的名称。
.timeout MS 尝试打开锁定的表 MS 毫秒。
.width NUM NUM 为 "column" 模式设置列宽度。
.timer ON|OFF 开启或关闭 CPU 定时器。
------------------------------------
格式化输出
sqlite>.header on
sqlite>.mode column
sqlite>.timer on
------------------------------------
sqlite_master 表格
主表中保存数据库表的关键信息,并把它命名为 sqlite_master。如要查看表概要,可按如下操作:
sqlite>.schema sqlite_master
这将产生如下结果:
CREATE TABLE sqlite_master (
type text,
name text,
tbl_name text,
rootpage integer,
sql text
);
------------------------------------
大小写敏感性
有个重要的点值得注意,SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。
------------------------------------
注释
SQLite 注释是附加的注释,可以在 SQLite 代码中添加注释以增加其可读性,他们可以出现在任何空白处,包括在表达式内和其他 SQL 语句的中间,但它们不能嵌套。
SQL 注释以两个连续的 "-" 字符(ASCII 0x2d)开始,并扩展至下一个换行符(ASCII 0x0a)或直到输入结束,以先到者为准。
您也可以使用 C 风格的注释,以 "/*" 开始,并扩展至下一个 "*/" 字符对或直到输入结束,以先到者为准。SQLite的注释可以跨越多行。
********************************************************************************************
********************************************************************************************
SQLite 语句
所有的 SQLite 语句可以以任何关键字开始,如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP 等,所有的语句以分号(;)结束。
(1).SQLite ANALYZE 语句:
ANALYZE;
or
ANALYZE database_name;
or
ANALYZE database_name.table_name;
(2).SQLite AND/OR 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION-1 {AND|OR} CONDITION-2;
(3).SQLite ALTER TABLE 语句:
ALTER TABLE table_name ADD COLUMN column_def...;
(4).SQLite ALTER TABLE 语句(Rename):
ALTER TABLE table_name RENAME TO new_table_name;
(5).SQLite ATTACH DATABASE 语句:
ATTACH DATABASE 'DatabaseName' As 'Alias-Name';
(6).SQLite BEGIN TRANSACTION 语句:
BEGIN;
or
BEGIN EXCLUSIVE TRANSACTION;
(7).SQLite BETWEEN 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE column_name BETWEEN val-1 AND val-2;
(8).SQLite COMMIT 语句:
COMMIT;
(9).SQLite CREATE INDEX 语句:
CREATE INDEX index_name
ON table_name ( column_name COLLATE NOCASE );
(10).SQLite CREATE UNIQUE INDEX 语句:
CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);
(11).SQLite CREATE TABLE 语句:
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);
(12).SQLite CREATE TRIGGER 语句:
CREATE TRIGGER database_name.trigger_name
BEFORE INSERT ON table_name FOR EACH ROW
BEGIN
stmt1;
stmt2;
....
END;
(13).SQLite CREATE VIEW 语句:
CREATE VIEW database_name.view_name AS
SELECT statement....;
(14).SQLite CREATE VIRTUAL TABLE 语句:
CREATE VIRTUAL TABLE database_name.table_name USING weblog( access.log );
or
CREATE VIRTUAL TABLE database_name.table_name USING fts3( );
SQLite COMMIT TRANSACTION 语句:
COMMIT;
(15).SQLite COUNT 子句:
SELECT COUNT(column_name)
FROM table_name
WHERE CONDITION;
(16).SQLite DELETE 语句:
DELETE FROM table_name
WHERE {CONDITION};
(17).SQLite DETACH DATABASE 语句:
DETACH DATABASE 'Alias-Name';
(18).SQLite DISTINCT 子句:
SELECT DISTINCT column1, column2....columnN
FROM table_name;
(19).SQLite DROP INDEX 语句:
DROP INDEX database_name.index_name;
(20).SQLite DROP TABLE 语句:
DROP TABLE database_name.table_name;
(21).SQLite DROP VIEW 语句:
DROP VIEW view_name;
(22).SQLite DROP TRIGGER 语句:
DROP TRIGGER trigger_name
(23).SQLite EXISTS 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE column_name EXISTS (SELECT * FROM table_name );
(24).SQLite EXPLAIN 语句:
EXPLAIN INSERT statement...;
or
EXPLAIN QUERY PLAN SELECT statement...;
(25).SQLite GLOB 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE column_name GLOB { PATTERN };
(26).SQLite GROUP BY 子句:
SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name;
(27).SQLite HAVING 子句:
SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name
HAVING (arithematic function condition);
(28).SQLite INSERT INTO 语句:
INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);
(29).SQLite IN 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE column_name IN (val-1, val-2,...val-N);
(30).SQLite Like 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE column_name LIKE { PATTERN };
(31).SQLite NOT IN 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE column_name NOT IN (val-1, val-2,...val-N);
(32).SQLite ORDER BY 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION
ORDER BY column_name {ASC|DESC};
(33).SQLite PRAGMA 语句:
PRAGMA pragma_name;
For example:
PRAGMA page_size;
PRAGMA cache_size = 1024;
PRAGMA table_info(table_name);
(34).SQLite RELEASE SAVEPOINT 语句:
RELEASE savepoint_name;
(35).SQLite REINDEX 语句:
REINDEX collation_name;
REINDEX database_name.index_name;
REINDEX database_name.table_name;
(36).SQLite ROLLBACK 语句:
ROLLBACK;
or
ROLLBACK TO SAVEPOINT savepoint_name;
(37).SQLite SAVEPOINT 语句:
SAVEPOINT savepoint_name;
(38).SQLite SELECT 语句:
SELECT column1, column2....columnN
FROM table_name;
(39).SQLite UPDATE 语句:
UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE CONDITION ];
(40).SQLite VACUUM 语句:
VACUUM;
(41).SQLite WHERE 子句:
SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION;