SQLite
Sqlite受人喜爱的真正原因正是因为它足够小,无需安装和管理配置,简单容易上手,支持数据库的大小也有2TB,足够个人开发爱好者使用了。
一、安装
首先先安装Sqlite,安装Sqlite无需太多过程,即免安装。下载好后直接将Sqlite的应用程序加入到环境变量中即可随意使用了,打开CMD,看到这种字样,表示安装成功。
二、图形化界面管理
Sqlite已经安装上了,但是在命令提示符窗口操作总感觉不美观,这时候需要一个图形界面工具来操纵Sqlite,这样就能更直观的显示数据了,这里推荐SqliteAdmin,中文版的界面再加上简洁的界面设计。
注意,此时的软件还无法正常工作,因为它还没有可以解析Sqlite语句的动态链接库,所以还需要下载个动态链接库,下载后直接复制到软件的目录即可。
三、基本语法
Sqlite不像其它的数据库以“;
”结尾,而且它是以“.
”开头使得式子成立的。打开SqliteAdmin,下面开始学习过程。
1. 数据类型
Null 空值
SMALLLINT 短整型
INTEGER 带符号的整数 这个就是布尔类型 0(false)和 1(true)
TINYINT 长整型
REAL 浮点值
TEXT 大量文本字符串
BLOB 二进制对象
NUMERIC 使用所有五个存储类的值
VARCHAR(n) 变动长度字符串,只能存英文,最多8000个字符
CHAR(n) 固定长度字符串
DATA 年月日
TIME 时分秒
DOUBLE 双精度浮点数
FLOAT 单精度浮点数
TIMESTAMP 存储年月日时分秒
NCHAR 存储Unicode数据类型的固长字符串 ,可存英文汉字,做多4000个字符
NVARCHAR 存储Unicode数据类型的变长字符串
NTEXT 存储Unicode数据类型的大量文本字符串
DATATIME 存储日期时间
其实它的数据类型远不止这些,更多的数据类型需要发掘,这里列举常用的数据类型。
2. 基本关键字
了解了数据类型,在创建数据库时用于操作时需要配套使用的关键字当然也必须得了解,这样才能提高开发效率。
AND 与
BETWEEN 最小值和最大值之间
EXISTS 判断是否存在
IN 判断某个值是否属于另一个值
NOT IN 判断某个值是否不属于另一个值
LIKE 使用通配符比较值与另一个值 不区分大小写 %(表示零个,一个或者多个) _(表示一个)
GLOB 使用通配符将值与类似值进行比较,并区分大小写的 *(表示零个或多个) ?(表示一个)
LIMIT 限制满足条件的值的数量
ORDER BY 排序 ASC(升序) | DESC(降序)
GROUP BY 数据聚合
HAVING 过滤分组,使用前一定要使用GROUP BY
DISTINCT 消除所有重复记录
NOT 不,常和in一起用
OR 或
IS NULL 判断是否等于空值,类型运算符
IS 相当于‘=’
IS NOT 判断是否不等于 相当于“!=”
UNIQUE 不重复
UNION 消除所有重复行
UNIONALL 不消除重复行
WHERE 用于满足某个条件时
SELECT 选择
FROM 来自
INSERT INTO 插入表数据
PRIMARY Key 主列
DEFAULT 默认值
CHECK 检查
3. 数据库相关操作
1).创建数据库文件
首先要创建一个数据库文件,以“.db”结尾的文件,还可以在命令提示符里面创建数据库,如下命令:
sqlite3 test.db
这样就创建了一个”test”的数据库文件了,创建之后就进入了”test”数据库中了,然后就可以进行其它操作了。
2).查看数据库
.database
# 或
.databases
3).退出数据库
.quit
4).导出数据库
sqlite3 test.db .dump > test.sql
5).创建附加数据库
ATTACH DATABASE 'test1.db' as 'test1';ATTACH DATABASE 'test2.db' as 'test2';
上述操作是将所有数据库数据都存放在了数据库文件“test.db”中了,不过实际开发中不建议这么做,建议多做几个数据库,或者将数据库嵌入到其它数据库中。
6).显示附加数据库
.database
# 或
.databases
7).分离数据库
DETACH DATABASE 'test1';
4. 数据表相关操作
1).创建数据表
CREATE TABLE student (
ID INTEGER DEFAULT '1406061' PRIMARY KEY AUTOINCREMENT NOT NULL,
NAME NVARCHAR(100) UNIQUE NOT NULL,
score INTEGER NOT NULL,
time TIMESTAMP NOT NULL
);
可以使用SqliteAdmin快速生成表。
这样表就建立成功了。
2).删除表
3).显示表名
4).数据表的增删改查
1).增加
这里可以给刚创建的表添加一个数据,如下:
insert into student(ID,NAME,score,time)
values(1406063,'任性的90后boy',90,'2020-07-06 12:23:32');
这里插入了三行数据。
还可以给表添加新列,如下;
alter table people add column aa char(10);#添加列并且列名为aa
2).删除
delete from people;#删除表数据delete from people where score<20#删除people数据表score数值小于20的记录
3).修改
其实就是更新操作,如下;
update people set score=100 where age=46;#当age=46时score设置为100
4).查找
查找不管是在哪个数据库中方法都是相当多的,因为查询操作是最常见也是最频繁的,下面就来详细说说:
1. 查询所有的结果
select * from student;
2. 查询指定结果
select NAME,score from student; #打印出NAME和score列的结果
select * from people where score<20 and age<40;#当score小于20并且age小于40的时候
select *from people where score between 10 and 30;#当score为10~30之间时
select *from people where NAME LIKE '放大%';#当name的开始处含有放大
select *from people where NAME glob '放大*';#与上同
select *from where score not in(12,23);#当score不属于12~23
3. 查找排序
select * from people order by score desc; #对score降序排序
4. 查找指定数量的数据
select * from people limit 3 offset 2#偏移2个单位然后输出三行数据,其实就是输出后三行数据
5. 查找重复数据并消除
select distinct * from people where score>10;#当score大于10的时候消除重复数据
6. 查找数据并进行分组
select NAME ,max(age) from people where score>10 group by age#返回score大于10的时候age的最大值
7. 查找数据进行分组并过滤分组
select NAME ,max(age) from people where score>10 group by age having count(NAME)>1;#名称计数大于1
5).表的重命名
alter table people rename to man;#将表名people改为man
6).数据表的连接
这里的连接分为内外交叉三种连接,使用好了可以极大提高工作效率。这里再次创建一张表,如下:
1).交叉连接
select * from people cross join woman;
2).内连接
select * from people inner join woman;
3).外连接
select * from people outer join woman;
7).表的复制
create table man as select * from people where 1=0;#复制表结构create table woman as select * from people;#复制表结构和数据
8).临时表
有时候不需要存储所有表的数据,这个时候临时表就很有使用的必要了。如下:
#创建一个临时表
create temporary table temp_table( id int primary key, name varchar(50) unique not null, age int not null);
#查看临时表
temp.temp_table
#删除临时表
drop table temp.temp_table;
5. 索引操作
1).创建索引
create index user on people(score);#在people表的score字段上设置索引
create unique name on people(NAME);#在people表的score字段上设置唯一索引
create index pa on people(score,age)#在people表的score和age字段上设置索引
2).查看索引
SELECT * FROM sqlite_master WHERE type = 'index';
这里之前仅仅只是创建了一个索引,那就是”user”,为何会有两个索引了,而且最上面的索引好像不是自己创建的,其实,这个就是隐式索引,这个隐式索引在创建表的时候就连带着一起创建了的,只是为了让查询更加快速而已,影响不大。
3).使用索引
这里涉及到两个关键字请配套使用,表示索引来自于哪里的意思。
select * from people indexed by user where score>10;
4).删除索引
drop index user;
:::warning 注:数据量较小不应使用索引,以免给系统增压。 :::
6. 视图操作
1).创建视图
create view name as select NAME from people;#创建NAME字段的视图
2).使用视图
select *from name;
3).删除视图
drop view name;
7. 触发器
触发器就是使得多个表的交互增强,互相调用,满足条件就调用哪个表,语法格式如下:
create trigger 触发器 after(before) insert(delete update)
on 表1
begin
insert into 表2(表2字段,表2字段,n) VALUES(表1值, 表1值,,,,n);
END;
1).创建触发器
#给people表创建一个触发器
create trigger cf
after insert on people
begin
insert into woman(w_ID,NAME,SCORE,date) values(new.ID,'向前插入',100,datetime('now'));
end;
2).查看触发器
#查看people表的触发器
select * from sqlite_master where type = 'trigger'AND tbl_name='people';
3).删除触发器
drop trigger cf;
8. 事务
有了事务可以让Sqlite语句工作的更加有条不紊,一般大致分为事务开始 提交 回滚 结束,下面来看看:
begin;#开始
insert into people('gf',65,datetime('now'));
rollback; #回滚就是撤销
COMMIT;提交保存数据
end;#结束