加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

学习Stephen Liu的《SQLite学习手册(数据表和视图)》(一)

发布时间:2020-12-12 20:25:01 所属栏目:百科 来源:网络整理
导读:好好学习,day day up.不能再玩了,学习要紧 以下内容主要基于对于Stephen Liu的博文SQLite学习手册(数据表和视图)的学习。 零、准备工作 先 把sqlite3.exe的路径添加到环境变量中,以便以后直接在命令行下调用sqlite3。 一、创建数据库 创建数据库现只知

好好学习,day day up.不能再玩了,学习要紧

以下内容主要基于对于Stephen Liu的博文SQLite学习手册(数据表和视图)的学习。

零、准备工作

把sqlite3.exe的路径添加到环境变量中,以便以后直接在命令行下调用sqlite3。

一、创建数据库

创建数据库现只知道两种方法,后面如果学到新的再添。

1)调用sqlite3.exe的同时,创建数据库

>sqlite3 mydb.db

后面的mydb.db为自定义的数据库名,我们可以同命令查看当前连接的数据库

--查询当前链接的数据库

sqlite>.databases

--查询结果显示

seq name file
--- --------------- ----------------------------------------------------------
0 main D:Program Filessqlitemydb.db


这种方式创建数据库的话,如果不对该数据库进行操作(包括上面的查询),则不会产生该.db文件。


2)通过备份main数据库实现

其实直接运行sqlite3.exe就会生成一个默认的数据库,缺省名即为main,我们可以通过sqlite提供的.backup命令备份这个main数据库来保存到本地。

--运行sqlite

>sqlite3

--备份数据到指定文件->.backup ?DB? FILE Backup DB (default "main") to FILE

sqlite>.backupD:Program Filessqlitemydb.db

这样就将默认数据库main备份到了mydb.db中。


3)还有一个就是连接到已存在的数据库,不是创建哦,我懒得分了,写一起吧

sqlite>ATTACH DATABASE'D:Program Filessqlitemydb.db'AS mydb;

在用上面的命令查看一下数据库如何?

sqlite>.databases

--查询结果显示

seq name file
--- --------------- ----------------------------------------------------------
0 main
2 mydb D:Program Filessqlitemydb.db


这样,结果就一目了然了,呵呵。在以上情况下,让看看创建表会有什么不同。

这里先通过ATTACH DATABASE命令将一个已经存在的数据库文件attach到当前的连接中,之后再通过指定数据库名的方式在目标数据库中创建数据表,如mydb.testtable。关于该规则还需要给出一些额外的说明,如果我们在创建数据表时没有指定数据库名,那么将会在当前连接的main数据库中创建该表,在一个连接中只能有一个main数据库。


二、创建数据表

专业的说法我也不懂,咱就复制粘贴一下吧:该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则。但是对于一些SQLite特有的规则,我们会给予额外的说明。注:以下所有示例均是在sqlite自带命令行工具中完成的。

1).最简单的数据表
sqlite>CREATE TABLE testtable(first_col integer);

这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前缀定义的表名都用于sqlite内部。语法和标准的SQL语句一样,没什么差异。


期间,我们查看一下现有的数据表
--列出表名清单
sqlite>.tables
--显示结果
testtable

这个暂且不提,继续后面操作。

2). 创建带缺省值的数据表
sqlite>CREATE TABLE mydb.testtable (first_col integer DEFAULT 0,second_col varchar DEFAULT 'hello');
--查询现有的数据表
sqlite> .tables

mydb.testtable testtable

我们可以看到一个是有数据库名mydb,一个没有,以mydb开头的数据表就是连接到mydb.db以后,在此数据库中创建的数据表;而没有库名开头的数据表为main数据库中建立的表。由于运行sqlite3程序时没有以数据库名做参数,所以这个表和缺省的数据库不会保存到本地,如果需要保存,可以通过之前使用的备份命令进行保存。


3). 创建临时表
sqlite>CREATE TEMP TABLE temptable(first_col integer);
在此查看现有的数据表
sqlite> .tables
--结果显示

mydb.testtable temp.temptable testtable

再查看一下数据库就能看出点问题来了
sqlite> .databases
seq name file
--- --------------- --------------------------------
0 main
1 temp
2 mydb D:Program Filessqlitemydb.db

哦?貌似多了个temp数据库。这个临时数据库如果不做保存的话,和创建缺省的数据库一样,不会存到本地。查询的序列号也有讲究,0是main数据库,若运行时以数据库名作为参数,则为创建或打开指定的数据库,而main数据库指代这个指定的数据库;1是临时数据库,这个应该只是作为内存数据库用的吧?没经验,猜测而已。2以后的应该就是ATTACH连接的数据库了,这个自不必多说。

4). "IF NOT EXISTS"从句 如果当前创建的数据表名已经存在,即与已经存在的表名、视图名和索引名冲突,那么本次创建操作将失败并报错。然而如果在创建表时加上"IF NOT EXISTS"从句,那么本次创建操作将不会有任何影响,即不会有错误抛出,除非当前的表名和某一索引名冲突。
sqlite>CREATE TABLE testtable (first_col integer);
Error: table testtable already exists

sqlite>CREATE TABLE IF NOT EXISTS testtable (first_col integer);


5). CREATE TABLE ... AS SELECT:
通过该方式创建的数据表将与SELECT查询返回的结果集具有相同的Schema信息,但是不包含缺省值和主键等约束信息。然而新创建的表将会包含结果集返回的所有数据。
sqlite>CREATE TABLE testtable2 AS SELECT * FROM testtable;
sqlite> .schematesttable2
CREATE TABLE testtable2(first_col INT);

.schema命令是sqlite3命令行工具的内置命令,用于显示当前数据表的CREATE TABLE语句。


对于这一点,我试了一下,.schema这个命令只对main数据库有效。而CREATE TABLE ... AS SELECT会将数据类型转换为sqlite支持的五种最基本的数据类型。比如之前的varchar转为TEXT。原来如此

五种数据类型如下:
1.NULL:空值。
2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。
3.REAL:浮点数字,存储为8-byte IEEE浮点数。
4.TEXT:字符串文本。
5.BLOB:二进制对象。
但实际上,sqlite3也接受如下的数据类型:
smallint 16 位元的整数。
interger 32 位元的整数。
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float 32位元的实数。
double 64位元的实数。
char(n) n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000
date 包含了 年份、月份、日期。
time 包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。

datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!

扯得远了,回到正题。

6). 主键约束:
--直接在字段的定义上指定主键。
sqlite>CREATE TABLE testtable (first_col integer PRIMARY KEY ASC);

ASC是升序,DESC是降序,你懂的。

--在所有字段已经定义完毕后,再定义表的数约束,这里定义的是基于first_col和second_col的联合主键。
sqlite>CREATE TABLE testtable2 (
...> first_col integer,
...> second_col integer,sans-serif; line-height:18px">...> PRIMARY KEY (first_col,second_col)
...> );
和其他关系型数据库一样,主键必须是唯一的。 7). 唯一性约束:
--直接在字段的定义上指定唯一性约束。
sqlite>CREATE TABLE testtable (first_col integer UNIQUE);
--在所有字段已经定义完毕后,在定义表的唯一性约束,这里定义的是基于两个列的唯一性约束。
...> UNIQUE (first_col,second_col)

...> );

在SQLite中,NULL值被视为和其他任何值都是不同的,这样包括和其他的NULL值,如下例:
sqlite>DELETE FROM testtable;
sqlite>SELECT count(*) FROM testtable;
count(*)
----------

0


sqlite>INSERT INTO testtable VALUES(NULL);
sqlite>INSERT INTO testtable VALUES(NULL);
----------
2

由此可见,两次插入的NULL值均插入成功。


后面的改天再学习吧,天黑,收摊~~~~

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读