一、sqlite的安装和使用
1、打开navicate(数据库的软件都可)
2、新建SQlite连接
3、新建user表
4、保存user表,并手动添加数据
二、sqlite3基础数据类型
存储类 描述
INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。
三、主键
PRIMARY Key 约束:唯一标识数据库表中的各行/记录。
四、sql语法
假设您已经在 testDB.db 中创建了 user表,如下所示:
CREATE TABLE "user" (
"id" BIGINT NOT NULL,
"name" VARCHAR(50) NULL,
"account" VARCHAR(50) NULL,
"password" VARCHAR(50) NULL,
"token" VARCHAR(50) NULL,
"create_time" BIGINT NULL,
"balance" BIGINT NULL,
PRIMARY KEY ("id")
);
五、Insert 插入语句
INSERT INTO 语句有两种基本语法,如下所示:
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
现在,下面的语句将在 user表中创建5个记录:
INSERT INTO `user` (`id`,`name`,`account`,`password`,`create_time`,`balance`)
VALUES (1, 'Paul', 'testaccount01', '123456', 123456,100 );
INSERT INTO `user` (`id`,`name`,`account`,`password`,`create_time`,`balance`)
VALUES (2, 'Allen', 'testaccount02', 'abcdef', 123456,200 );
INSERT INTO `user` (`id`,`name`,`account`,`password`,`create_time`,`balance`)
VALUES (3, 'Teddy', 'testaccount03', '654321', 123456,300 );
INSERT INTO `user` (`id`,`name`,`account`,`password`,`create_time`,`balance`)
VALUES (4, 'Mark', 'testaccount04', '666666', 123456,400 );
INSERT INTO `user` (`id`,`name`,`account`,`password`,`create_time`,`balance`)
VALUES (5, 'David', 'testaccount05', '123456', 123456,500 );
六、Select 查询语句
SQLite 的 SELECT 语句的基本语法:
SELECT column1, column2, columnN FROM table_name;
在这里,column1, column2...是表的字段,他们的值即是您要获取的。如果您想获取所有可用的字段,那么可以使用下面的语法:
SELECT * FROM table_name;
举例:
SELECT * FROM user //查询user表所有的字段
SELECT `id`,`password` FROM user //查询user表中的id和password字段
七、where 条件查询
您还可以使用比较或逻辑运算符指定条件,比如 >、<、=、LIKE、NOT,等等。
//查询user表id,name,password,balance,找出balance字段大于200的记录
SELECT `id`,`name`,`password`,`balance` FROM `user` WHERE `balance` > 200;
//查询user表,找出balance字段大于200,并且balance字段小于500的记录
SELECT * FROM `user` WHERE `balance` > 200 AND `balance` < 500;
//查询user表,找出balance等于200或者balance等于500的记录
SELECT * FROM `user` WHERE `balance` = 200 or `balance` = 500;
BETWEEN 查询
//查询user表balance在200和500之间的记录
SELECT * FROM `user` WHERE `balance` BETWEEN 200 AND 500;
模糊查询(%的意思是匹配任何都可以)
//查询user表name字段,a(大小写都行)开头的任意记录
SELECT * FROM `user` WHERE `name` LIKE 'a%';
//查询user表name字段,包括a(大小写都行)的任意记录(只要之包裹着a的都可以)
SELECT * FROM `user` WHERE `name` LIKE '%a%';
in查询
//查询user表,id包含2和5的记录
SELECT * FROM `user` WHERE `id` IN (2,5);
//查询user表,id不包含2和5的
SELECT * FROM `user` WHERE `id` NOT IN (2,5);
Limit 关键字
LIMIT 子句用于限制由 SELECT 语句返回的数据数量。
//查询user表,返回两条数据(返回的第一条和第二条记录)
select * from `user` limit 2
//第一个2表示从第几个开始,后面的2表示返回的数量(返回第三条记录和第四条记录)
select * from `user` limit 2,2
Order By 关键字
asc是指定列按升序排列,desc则是指定列按降序排列
ORDER BY 子句是用来基于一个或多个列按升序或降序顺序排列数据
//查询user表,根据id降序排列,取前三个记录
select * from `user` order by `id` desc limit 3
//查询user表,根据password先排序,在按照id排序,升序区前三个记录
select * from `user` order by `password`,`id` asc limit 3
Distinct 关键字
DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。
select DISTINCT `password` from `user` //查询user表中的password,并消除重复的记录
八、Update 语句
带有 WHERE 子句的 UPDATE 查询的基本语法如下:
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
//更新user表id是1的记录中的account字段和password字段
UPDATE `user` SET `account` = 'admin01',`password`='888888' WHERE `id` = 1;
九、Delete 语句
带有 WHERE 子句的 DELETE 查询的基本语法如下:
DELETE FROM table_name
WHERE [condition];
//删除user表中id是1的记录
DELETE FROM `user` WHERE `id` = 1;
ps:update和delete语句,如果不加where,就会更新和删除所有的记录,除非是特定情况,不然务必加上where。
十、索引
索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。
创建索引
CREATE [UNIQUE] INDEX index_name ON table_name (column_name,column_name);
--单列索引
CREATE INDEX test_index ON `user` (`account`);
--唯一索引
CREATE UNIQUE INDEX test_index ON `user` (`account`);
--组合索引
CREATE INDEX test_index ON `user` (`account`,`name`);
但是sqlite目前还不支持能让你直接在表格里看到索引,所以需要你单独去查看。
查看索引
SELECT * FROM sqlite_master WHERE type = 'index'
删除索引
DROP INDEX test_index;
虽然索引的目的在于提高数据库的性能,但这里有几个情况需要避免使用索引。使用索引时,应重新考虑下列准则:
① 索引不应该使用在较小的表上。
②索引不应该使用在有频繁的大批量的更新或插入操作的表上。
③索引不应该使用在含有大量的 NULL 值的列上。
④索引不应该使用在频繁操作的列上。
十一、约束
约束是在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束有:非空约束(not null)、唯一约束(unique)、主键约束(primary key)
NOT NULL 约束
UNIQUE 约束
PRIMARY Key 约束
十二、常用函数
官方文档 https://www.sqlite.org/lang_corefunc.html
函数 & 描述
1 COUNT 函数 COUNT 计算一个数据库表中的行数。
2 MAX 函数 MAX 选择某列的最大值。
3 MIN 函数 MIN 选择某列的最小值。
4 AVG 函数 AVG 计算某列的平均值。
5 SUM 函数 SUM 数值列计算总和。
SELECT count(*) FROM `user` //查询user表的个数
SELECT MAX(`id`) FROM `user` //查询user表id的最大值
SELECT AVG(`id`) FROM `user` //查询user表id的平均值
SELECT UPPER(`name`),random() FROM `user` //查询user表将name变大写,取随机数
SELECT AVG(`id`) AS avg_val FROM `user` //如果觉得头比较丑,可以用AS去修改标题名称
十三、子查询
子查询或称为内部查询、嵌套查询,指的是在 SQLite 查询中的 WHERE 子句中嵌入查询语句
//user_log表和user表查询id一样的记录
select * from `user` where `id` in (select `id` from `user_log`)
//user_log表和user表查询,其中user_log表查询login_times大于5的记录
select * from `user` where `id` in (select `id` from `user_log` where `login_times` > 5)
十四、JOIN 查询
1、CROSS JOIN
又叫笛卡尔积,匹配前一个表与后一个表的每一行和每一列,这样得到的结果集为n*m行(n, m分别为每张表的行数),x+y列(x,
y分别为每张表的列数)。可见,该结果集可能会成为一个巨大的表,对内存和后续处理都会造成巨大压力,所以,慎用(真没用过)。
//把两个表根据id,id相同的记录拼接起来
SELECT * FROM `user` CROSS JOIN `user_log` ON `user`.`id` = `user_log`.`id`
2、Inner Join
内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2
中的每一行进行比较,找到所有满足连接谓词的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。
//和cross join差不多,基本上不用这个写法
SELECT * FROM `user` JOIN `user_log` ON `user`.`id` = `user_log`.`id`
//一样的拼接,INNER JOIN 用的多一些
SELECT * FROM `user` INNER JOIN `user_log` ON `user`.`id` = `user_log`.`id`
3、LEFT OUTER JOIN
SQLite 只支持 左外连接(LEFT OUTER JOIN)
SQLite3只支持left outer join,其结果集由不大于x + y列,n -
n*m行构成,至少包含左侧表的每一行,对于Join后不存在的字段值,则赋NULL。这样得到的表与我们之前设计那个全集结果一样,但数据结构更清晰,空间占用更少。
//相当于返回user表的所有记录,但是匹配不到的id,就返回空的
SELECT * FROM `user` LEFT OUTER JOIN `user_log` ON `user`.`id` = `user_log`.`id`
ps:内连接和左外连接,区别就在于,一个返回匹配对应的记录拼接,一个是返回主表的所有记录,并匹配不对的记录,就不会有值
十五、事务(Transaction)
事务 (Transaction) 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行
事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源
举个例子,A 向 B 转账 100 元,其实整个转账过程就是一个事务,要么转账成功了,A 的账户扣了 100 元,B 的账户增加了 100 元,要么转账失败,A 还是那么多钱,B 还是没钱,如果出现 A 扣了
100 元,B 的账户却没增加 100 元,那是要出问题的,是不?
事务,就是用来做这件事的,用来保证要么转账成功,要么转账失败
十六、事务属性
事务可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行
一般来说,事务是必须满足4个条件 ( ACID )
Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、原子性
一组事务,要么成功;要么失败回滚当作什么事都没发生
2、稳定性
有非法数据 (外键约束之类),事务撤回
3、隔离性
事务独立运行。一个事务处理后的结果,影响了其它事务,那么其它事务会撤回
事务的100%隔离,需要牺牲速度
4、可靠性
软、硬件崩溃后,SQLite 数据表驱动会利用日志文件重构修改
十七、SQLite 事务
SQLite 默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作
因此要显式地开启一个事务务须使用命令 BEGIN TRANSACTION
SQLite 中可以使用下面的命令来控制事务
命令 / 说明
BEGIN TRANSACTION 开始事务处理。
COMMIT END TRANSACTION 保存更改
ROLLBACK 回滚所做的更改
事务控制命令只与 DML 命令 INSERT、UPDATE 和 DELETE 一起使用
他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的
1、BEGIN TRANSACTION 命令
事务 ( Transaction ) 可以使用 BEGIN TRANSACTION 命令或 BEGIN命令来启动
BEGIN;
BEGIN TRANSACTION;
事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令
有个特殊情况是:在数据库关闭或发生错误时,事务处理会回滚
2、COMMIT 命令
COMMIT 命令用于把事务调用的更改保存到数据库中
COMMIT;
END TRANSACTION;
3、ROLLBACK 命令
ROLLBACK 命令是用于撤消尚未保存到数据库的事务
ROLLBACK;
举例:
--开启事务
BEGIN;
INSERT INTO `user` (`id`,`name`,`account`,`password`,`create_time`,`balance`)
VALUES (6, 'peter', 'testaccount01', '123456', 123456,100 );
--回滚事务
ROLLBACK;
--开启事务
BEGIN;
INSERT INTO `user` (`id`,`name`,`account`,`password`,`create_time`,`balance`)
VALUES (7, 'hello', 'testaccount01', '123456', 123456,100 );
--提交事务
COMMIT;
ps:开启事务之后,进行回滚,会回滚到开启事务之前。提交事务,相当于执行操作。