SQLite入门

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。
可以到网上下载sqlite的dll和exe。
这里写图片描述 解压后我们可以得到
这里写图片描述
可以将sqlite3添加到path中,这样就可以直接在CMD中运行。

下面开始学习一些语法。有个重要的点值得注意,SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。

首先创建一个数据库

sqlite3 DatabaseName.db

这里创建一个测试的数据库test.db

sqlite3 test.db

这里写图片描述
查看是否创建好了

.databases

这里写图片描述
接着我们在这个数据库中创建一个表

CREATE TABLE database_name.table_name(
   column1 datatype  PRIMARY KEY(one or more columns),
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

这里需要输入很多内容,如果在命令行中输入很容易输入错误。我们可以建立一个test.sql文件,在这个文件中输入命令,然后将命令读入。注意将test.sql与test.db放在一起.test.sql内容为
这里写图片描述

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);
CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

接着我们用.read读取

.read test.sql

这里写图片描述
用.tables命令来查看是否成功创建这两个表
这里写图片描述
可以用 .schema来查看表的结构。
这里写图片描述
表已经创建完成,接着就可以插入数据了。

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)]  
VALUES (value1, value2, value3,...valueN);

INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

插入语句很多也直接放在sql文件中

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'David', 27, 'Texas', 85000.00 );

INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );

INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );

如果某条记录多插入了,比如第七条,此时我们需要删除这条记录

DELETE FROM table_name
WHERE [condition];

这里就可以

DELETE FROM COMPANY WHERE ID = 7;

然后.read test.sql,这个时候表内就导入了数据。如果我们想要删除一个表

DROP TABLE database_name.table_name;

我们可以先用.tables来查看数据库中有哪些表,然后DROP TABLE table_name;就可以了。

好了接着来看如何查看表中的数据。使用的SELECT 语句。

SELECT column1, column2, columnN FROM table_name;

columnN就是表中的字段,用*可以返回所有的字段,例如这里

SELECT * FROM COMPANY

这里写图片描述
输入语句后没有输入结束语句的标识符;,这时就会显示…>让我们接着输入,这里可以直接输入;来结束。
这里可以看到将所有插入的数据所有字段全都返回显示出来,但是都紧挨在一起很不好看,这里我们可以设置mode。首先

.show

这里写图片描述
查看一下所有的默认配置,我们发现headers是off,这里headers就是字段的名称。mode是list,我们设置成column,width没有设置,我们可以设置也可以不设置。这里格式化为

.headers on
.mode column

然后输入select查询一下
这里写图片描述

接着是WHERE语句,WHERE相当于if,当数据符合某些条件时就按照select显示出来

SELECT column1, column2, columnN 
FROM table_name
WHERE [condition]

比如这里选择出年纪大于25薪水大于60000的

SELECT * FROM COMPANY WHERE AGE > 25 AND SALARY > 60000;

这里写图片描述

有时候某个数据的字段我们赋值出错了,想要修改,这时就可以用UPDATE 语句。

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

比如我们需要修改Paul的薪水为80000,地址是中国

UPDATE COMPANY SET ADDRESS = 'China', SALARY=80000 WHERE ID = 1;

这里写图片描述
我们看到此时已经更正过来了。

有时候我们需要查找某些特定的信息,比如地址是以C开头的,名字是以l结尾的记录,此时就需要匹配,这里可以用Like和GLOB,只介绍GLOB语句

星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。这些符号可以被组合使用。
例如

语句描述
WHERE SALARY GLOB ‘200*’查找以 200 开头的任意值
WHERE SALARY GLOB ‘200查找任意位置包含 200 的任意值
WHERE SALARY GLOB ‘?00*’查找第二位和第三位为 00 的任意值
WHERE SALARY GLOB ‘2??’查找以 2 开头,且长度至少为 3 个字符的任意值
WHERE SALARY GLOB ‘*2’查找以 2 结尾的任意值
WHERE SALARY GLOB ‘?2*3’查找第二位为 2,且以 3 结尾的任意值
WHERE SALARY GLOB ‘2???3’查找长度为 5 位数,且以 2 开头以 3 结尾的任意值

所以我们可以

SELECT NAME ADDRESS FROM COMPANY WHERE NAME GLOB '*l' AND ADDRESS GLOB 'C*';

还有我们可能需要按照薪水的高低进行排序,此时有排序语句

SELECT column-list 
FROM table_name 
[WHERE condition] 
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

比如这里按照薪水进行升序排序

SELECT * FROM COMPANY ORDER BY SALARY ASC;

这里写图片描述

本次更新对于支持库来说,接口改动不大,模块版的话是尽量和支持库接口保持一致,所以对于以前的模块接口可能改动就大了。 要解决多线程问题,主要是对sqlite3的锁机制进行了解,和事务有密切的关系。本次更新的版本在开始事务时,增加了一个 事务锁状态 的参数。 拿简单的话来描述就是 开始事务 时如果 设置了 事务锁状态_ 立即 参数,那么这个时候其他线程的连接就不能写操作了,但是可以读操作,但是在提交事务时也要等待所有读操作完成了才能提交。 设置了 事务锁状态_ 独占 参数,那么这个时候其他线程的连接读写都不可以了。 在等待的时候就处于繁忙状态,我们可以设置 数据库.繁忙超时()来设置等待时间。 还有种情况还是会死锁,就是记录集没有关闭,而且这次更新的支持库和模块都是必须手动关闭记录集的,所以一定注意。 当然多进程和多线程是一个道理,具体操作看例子。 esqlite3 V1.1 相对于1.0的更新 1、增加了全局命令: S3互斥体进入 S3互斥体退出 S3聚合上下文 S3取数据库自上下文 2、增加了zySqlite数据库 命令 繁忙超时 繁忙处理 取文件名 是否只读 取互斥体 是否自动提交 进度处理 取下一记录集 取总影响行 3、增加了 zySqlite记录集 命令 是否繁忙 是否只读 取数据库句柄 取行数 4、数据库.开始事务() 增加了 事务锁状态 参数,此参数在多线程中非常重要。 5、记录集必须手动关闭,任何内部方法都不再自动关闭。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值