SQLite数据库
SQLite数据库特点
SQLite是一种用ANSI-C编写的嵌入书关系数据库管理系统
SQLite是基于文件的,它与其他SQL数据库不同,因为与大多数其他SQL数据库不同,SQLite没有单独的服务器进程
SQLite支持SQL的很多特性,性能高,不支持存储过程,而SQL是一种查询语言,被不同的SQL数据库使用,它本身不是数据库
SQLite最初设计于2000年8月。最初命名为SQLite,是因为它于SQL Server或Oracle等其他数据库管理系统不同,非常小(小于500Kb大小)
- SQLite是完全免费的:SQLite是开源的,不需要许可证
- SQLite是无服务器的:SQLite不需要不同的服务器或系统来运行
- SQLite非常灵活:可以在一个会话中同时处理多个数据库,SQLite不需要配置,无需设置或管理
- SQLite是一个跨平台的DBMS:不需要Windows、Mac OS、Linux和Unix这样的大量不同平台。它可以用于许多嵌入书操作系统
- 存储数据:SQLite提供了一种高效的数据存储方式
- 列的可变长度:列的长度是可变的
- 提供大量API:SQLite为大量编程语言提供API
SQLite优势
- 轻量级:轻量级数据库
- 更好的性能:读写操作非常快
- 无需安装:不需要安装和配置
- 可靠:不断更新内容,在断电或崩溃的情况下几乎不会丢失任何工作
- 便携式:可以在32位和64位操作系统以及大端和小端架构中移植
- 无障碍:SQLite数据库可通过各种第三方工具访问
- 降低成本和复杂性:降低了应用程序成本
SQLite的缺点:用于处理中低流量的HTTP请求,大多数情况下,数据库大小限制在2GB
SQLite命令三种类型
- DDL:数据定义语言create、alter、drop
- DML:数据操作语言insert、updata、delete
- DQL:数据查询语言select
- SQLite点命令
SQLite语法
- 区分大小写:不区分大小写,但是有些命令区分大小写;例如GLOB和glob在SQLite中具有不一样的含义
- 注释:不能嵌套,以两个连续的“-”字符开头
SQLite数据类型
- integer:带符号的整型(最多64位)
- decimal(p,s):p精确值和s大小的十进位整数,p是多少个数字,s表示小数有多少个
- float:32位实数
- double:64位实数
- char(n):n长度的字符串,n不能超过254
- varchar(n):长度不固定且最大长度为n的字符串,n不能超过4000
- date:包含年份、月份、日期 (2019-09-09)
- time:包含小时、分钟、秒
- real:8字节表示的浮点类型
- text:字符类型,支持多种编码(如UTF-8、UTF-16),大小无限制
- blob:任意类型的数据,大小无限制。BLOB二进制大对象,使用二进制保存数据
- null:表示空值
SQLite3安装
# 只下载包但是不安装,其中不包含API接口
apt-get download sqlite3
# 下载并安装
apt-get install sqlite3
# 进入sqlite3,这样进入写的数据是在内存中,退出后数据就会消失
sqlite3
# 进入sqlite3,并保存在哪个位置
sqlite3 student
# 退出sqlite3
.exit
# 查看表
.table
# 设置查询的间隙
.mode column
# 设置查询的表头
.header on
# 创建表
create table student (id integer,name text,age integer);
# 如果不存在就创建表否则不创建
create table if not exists student (id integer,name text,age integer);
# 查看表结构
.schema
# 插入数据
insert into student (id,name,age) values(1,"aa",11);
insert into student values(2,"bb",22),(3,"cc",33);
# 查询数据
select * from student;
# 修改数据
update student set age=25 where id=3;
# 删除数据
delete from student where id=1;
# 删除表
drop table student
# 创建会自增列
create table marketCommodity (商品编号 integer primary key autoincrement,商品名称 text);
SQLite的API
# 安装头文件
apt-get install libsqlite3-dev
// filename: 数据库的名字,如果不存在则创建
// ppDb:返回数据库句柄
// 返回值:返回SQLITE_OK表示成功
int sqlite3_open(const char *filename,sqlite3 **ppDb);
// ppDb:表示数据库的句柄
// 返回值:返回错误描述字符串
const char *sqlite3_errmsg(sqlite3* ppDb);
// 万能函数处理指令
int sqlite3_exec(
sqlite3*, /*数据库句柄*/
const char *sql, /*将要执行的指令的字符串*/
int (*callback)(void *,int,char **,char **), /*回调函数,如果执行的指令的结果需要处理,就需要用回调函数处理,创建表就不需要回调函数*/
void *, /*回调函数的第一个参数*/
char **errmsg /*保存错误信息*/
);
int sqlite3_get_table(
sqlite3 *db, /*数据库句柄*/
const char *zSql, /*查询语句*/
char ***pazResult, /*保存结果的指针*/
int *pnRow, /*行数*/
int *pnColumn, /*列数*/
char **pzErrmsg /*保存错误信息*/
);
pazResult存放结构
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>
int print(void *arg,int column,char **value,char **name)
{
for(int i=0;i<column;i++){
printf("%s=%s ",name[i],value[i]);
}
printf("\n");
return 0;
}
int main()
{
int ret=0;
char commod[128];
sqlite3 *ppdb;
//打开数据库,如果不存在则创建
ret=sqlite3_open("student.db",&ppdb);
if(ret!=SQLITE_OK){
fprintf(stderr,"sqlite3_open error:%s",sqlite3_errmsg(ppdb));
exit(1);
}
//创建表,如果存在则不执行
memset(commod,0,sizeof(commod));
sprintf(commod,"create table if not exists student (id integer,name text,age integer);");
ret=sqlite3_exec(ppdb,commod,NULL,NULL,NULL);
if(ret!=SQLITE_OK){
fprintf(stderr,"sqlite3_exec error:%s",sqlite3_errmsg(ppdb));
exit(1);
}
//插入数据
int age,id;
char name[64]={0};
for(int i=0;i<2;i++){
printf("请输入学号 姓名 年龄:\n");
scanf("%d%s%d",&id,name,&age);
memset(commod,0,sizeof(commod));
sprintf(commod,"insert into student values(%d,'%s',%d);",id,name,age);
ret=sqlite3_exec(ppdb,commod,NULL,NULL,NULL);
if(ret!=SQLITE_OK){
fprintf(stderr,"sqlite3_exec error:%s",sqlite3_errmsg(ppdb));
exit(1);
}
}
//查询数据
memset(commod,0,sizeof(commod));
sprintf(commod,"select * from student");
ret=sqlite3_exec(ppdb,commod,print,NULL,NULL);
if(ret!=SQLITE_OK){
fprintf(stderr,"sqlite3_exec error:%s",sqlite3_errmsg(ppdb));
exit(1);
}
//查询数据
char **pazresult;
int row;
int column;
memset(commod,0,sizeof(commod));
sprintf(commod,"select * from student");
ret=sqlite3_get_table(ppdb,commod,&pazresult,&row,&column,NULL);
if(ret!=SQLITE_OK){
fprintf(stderr,"sqlite3_get_table error:%s",sqlite3_errmsg(ppdb));
exit(1);
}
int index=column;
// row不包含第一行,也就是说当row=50时就表示一共有50行数据
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
printf("%s=%s ",pazresult[j],pazresult[index++]);
}
printf("\n");
}
return 0;
}
注意编译时要加上动态库,例如gcc -o build main.c -lsqlite3