Sqlite全面学习(一)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!

【工匠若水 】

官网 SQLite是一款轻型的数据库,是关系型数据库(RDBMS)管理系统,它包含在一个相对小的C库中。目前在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix/Android/IOS等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

Sqlite命令分类:

(DDL)数据定义语言:

CMD Description

CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。

ALTER 修改数据库中的某个已有的数据库对象,比如一个表。

DROP 删除整个表,或者表的视图,或者数据库中的其他对象。

(DML)数据操作语言:

CMD Description

INSERT 创建一条记录。

UPDATE 修改记录。

DELETE 删除记录。

(DQL)数据查询语言:

CMD Description

SELECT 从一个或多个表中检索某些记录。

Sqlite点命令

先看一张Windows下的截图:

这是在Windows的cmd下运行sqlite3命令(如何安装和配置烦请自行google | baidu),然后依据提示运行.help的打印(只截图一部分)。

可以发现sqlite的help列出来了所有sqlite支持的点命令,也可以发现,点命令不需要已”;”结尾。

我们对上面的.help命令进行翻译大致如下:

CMD Description

.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数据库的sqlite_master表

主表中保存数据库表的关键信息,并把它命名为sqlite_master。如要查看表概要,可如下操作:

sqlite>.schema sqlite_masterSqlite语法规则

SQLite是遵循一套独特的称为语法的规则和准则。

SQLite是不区分大小写的,但也有一些命令是大小写敏感的,比如GLOB和glob在SQLite的语句中有不同的含义。

SQLite 注释是附加的注释,可以在 SQLite 代码中添加注释以增加其可读性,他们可以出现在任何空白处,包括在表达式内和其他 SQL 语句的中间,但它们不能嵌套。

SQL注释以两个连续的”-“字符开始,并扩展至下一个换行符或直到输入结束,以先到者为准。也可以以”/*”开始,并扩展至下一个 “*/” 字符对或直到输入结束,以先到者为准。SQLite的注释可以跨越多行。

SQLite语句以任何关键字开始,以”;”结束。

Sqlite数据类型

SQLite数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。您可以在创建表的同时使用这些数据类型。SQLite使用一个更普遍的动态类型系统。在SQLite中,值的数据类型与值本身是相关的,而不是与它的容器相关。

存储类

SQLite有5个原始的数据类型,被称为存储类。存储类这个词表明了一个值在磁盘上存储的格式,其实就是类型或数据类型的同义词。如下即是存储类:

存储类 Description

NULL 值是一个NULL值。

INTEGER 值是一个带符号的整数,根据值的大小存储在1、2、3、4、6 或8字节中。

REAL 值是一个浮点值,存储为8字节的IEEE浮点数字。

TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储。

BLOB 值是一个blob数据,完全根据它的输入存储。

SQLite通过值的表示法来判断其类型,下面就是SQLite的推理方法:

如下就是验证结果:

SQLite单独的一个字段可能包含不同存储类的值。

如下就是验证结果:

喜欢钻牛角尖的这时候指定开始BB了,temp这一列数据类型不同,咋样比较大小?咋样排序等等?

经过查阅资料发现,具有不同存储类的值可以存储在同一个字段中。可以被排序,因为这些值可以相互比较。有完善定义的规则来做这件事。不同存储类的值可以通过它们各自类的“类值”进行排序,定义如下:

所以,当SQLite对一个字段进行排序时,首先按存储类排序,然后再进行类内的排序 (NULL类内部各值不必排序) 。

弱类型(manifest typing)

首先有如下SQL语句:

table_yanbo VALUES (‘1’, ‘1’, ‘1’);

这里的x、y和z这3个字段中存储的是INTEGER, TEXT和REAL类型。

再看下面例子:

table_yanbo VALUES (‘1’, ‘1’, ‘1’);

这里的x、y和z这3个字段中存储的是TEXT、TEXT和TEXT类型。

再看下面例子:

table_yanbo VALUES (1, 1.0, x’10’);

这里的x、y和z这3个字段中存储的是INTEGER、REAL和BLOB类型。

通过上面几种写法你会发现,可以为SQLite的字段定义类型,但这不是必须的,你可以尽管违反类型定义。这是因为在任何情况下,SQLite都可以接受一个值并推断它的类型。

总之,SQLite的弱类型可表示为:

字段可以有类型。类型可以通过值来推断。

类型亲和性介绍这两个规定如何相互关联。所谓类型亲和性就是在强类型(strict typing)和动态类型(dynamic typing)之间的平衡艺术。

类型亲和性(Type Affinity)不论你在什么时候开始,重要的是开始之后就不要停止

Sqlite全面学习(一)

相关文章:

你感兴趣的文章:

标签云: