一、sqlite3数据库的使用
在linux中,输入sqlite3 就能进入sqlite3命令行,然后通过SQL语句执行命令。
可以使用 .quit 退出 sqlite 提示符。
1.新建表格
命令:CREATE TABLE 表名
(
字段名1 数据类型 “约束条件”,
字段名2 数据类型 “约束条件”,
...
字段名n 数据类型 “约束条件”,
);
表名:关系表的名称;
字段名:在关系表中表示属性,即列的信息;
数据类型:表明字段名下的数据的类型,每一列都具有相同的数据类型;
常用数据类型:INT(size)、REAL(size,d)、VCHAr(size) ..............
“约束条件”:NOT NULL : 数据不能为空;
PRIMARY KEY: 主键,数据不能为空并且唯一;
CHECK( 对字段名的约束条件 ):限制数据的范围;
.table : 查看数据库中的表格。
如下:
2. 插入用户数据
命令:INSERT INTO 表名 VALUES(data1、data2、.......);
or :INSETR INTO 表明(字段名1、字段名2....) VALUES(data1、data2、.......);
.header on :显示表头。
.mode column:按列显示数据。
SELECt * FROM 表名:查询表中所有数据。
如下:
3. 查询用户数据
命令:SELECt 字段名1,字段名2,..... FROM 表名;
or :SELECt 字段名1,字段名2,..... FROM 表名 WHERe 限制条件;
除了基本的查找,SELECt还能排序、模糊查找、多表查询以及其他的查询方式:
排序:SELECT * FROM 表名 ORDER BY 字段 ASC/DESC;
ASC:升序 DESC:降序
模糊查找:SELECt * FROM CS2128 WHERe NUM LIKE "2%";
表示查找NUM第一个数字为2的所有学生;
多表查询:SELECt 表名.字段名1,表名.字段名2,...FROM 表名1,表名2...;
or :SELECt 表名.字段名1,表名.字段名2,...FROM 表名1,表名2... WHERe 限制条件;
4. 更新数据
命令:UPDATe 表名 SET 字段名1=新值,字段名2=新值... ;
or :UPDATE 表名 SET 字段名1=新值,字段名2=新值... WHERe 限制条件;
如下:
5.修改表格结构
命令: 1. 修改表名
ALTER TABLE 表名 RENAME TO 新名字;
2. 增加字段
ALTER TABLE 表名 ADD 字段名 字段类型 约束条件;
6. 删除表格中的行(DELETE) 和 删除表格(DORP)
命令:DELETE FROM 表名 WHERe 限制条件;
and :DROp TABLE 表名;
二、API函数接口的使用
sqlite3的API函数接口核心:两大对象和八大函数。
两大对象:1. 数据库的连接对象,表示要将要进行操作的数据库;
2. SQL语句对象,准备好的SQL语句。
八大函数族:
1. 打开数据库函数
sqlite3_open();
2. 操作数据库函数
sqlite3_prepare_*() //准备一个SQL语句
sqlite3_bind_*() //绑定参数
sqlite3_step() //执行SQL语句
sqlite3_column_*() //输出查询到的数据库的数据
sqlite3_finalizi() //释放资源,销毁SQL语句对象
sqlite3_exec() //万能函数
3. 关闭数据库函数
sqlite3_close();
用代码操作数据库的简单步骤如下:
1. 打开数据库
函数原型:SQLITE_API int sqlite3_open(
const char *filename,
sqlite3 **ppDb
);
返回值:成功返回SQLITE_OK,否则返回其他值。
2. 准备好SQL语句对象
函数原型:SQLITE_API int sqlite3_prepare_v2(
sqlite3 *db,
const char *zSql,
int nByte,
sqlite3_stmt **ppStmt,
const char **pzTail
);
返回值:成功返回SQLITE_OK,否则返回其他值。
3. 执行准备好的SQL语句对象
函数原型:SQLITE_API int sqlite3_step(sqlite3_stmt*);
4. 释放资源,销毁SQL语句对象和关闭数据库连接对象
销毁SQL语句对象函数原型:SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
关闭数据库连接对象函数原型:SQLITE_API int sqlite3_close(sqlite3*);
对表格写入数据代码如下:
#include#include #include int main(int argc,char **argv) { if(argc != 3) { fprintf(stderr,"Usage : %s < Database path > < FileName >n",argv[0]); return 0; } //打开文件 FILE *fp = fopen(argv[2],"r"); if(fp == NULL) { perror("Open file error"); return -1; } //1.打开数据库 sqlite3 *pdb = NULL; int ret = sqlite3_open(argv[1],&pdb); if(ret != SQLITE_OK) { perror("Open database error"); return -1; } //2.准备SQL语句对象 sqlite3_stmt *stmt = NULL; //用来表示SQL语句对象的指针 //为原始SQL语句绑定一个索引值(占位符) char *sql = "INSERT INTO student VALUES(@NUM,@NAME,@GRODE);"; ret = sqlite3_prepare_v2(pdb,sql,-1,&stmt,NULL); if(ret != SQLITE_OK) { perror("Prepare Failed"); sqlite3_close(pdb); return -1; } while(1) { int num; double grode; char name[32] = {0}; int ret = fscanf(fp,"%d%s%lf",&num,name,&grode); if(ret != 3) { if(feof(fp)) { break; } continue; } //绑定sql语句的参数的索引值 //通过索引名@NUM,@NAME,@GRODE获取索引号 int var_index[3]; var_index[0] = sqlite3_bind_parameter_index(stmt,"@NUM"); var_index[1] = sqlite3_bind_parameter_index(stmt,"@NAME"); var_index[2] = sqlite3_bind_parameter_index(stmt,"@GRODE"); int i; for(i = 0;i < 3;i++) { printf("index[%d] = %dn",i,var_index[i]); } //var_index数组就可以代替@NUM,@NAME,@GRODE //给参数绑定具体的值 sqlite3_bind_int(stmt,var_index[0],num); sqlite3_bind_text(stmt,var_index[1],name,strlen(name),NULL); sqlite3_bind_double(stmt,var_index[2],grode); //3.执行准备好的SQL语句对象 ret = sqlite3_step(stmt); if(ret == SQLITE_DONE) { printf("INSERT Success!n"); } else { perror("INSERT Failed"); break; } } //4.释放资源 fclose(fp); sqlite3_finalize(stmt); sqlite3_close(pdb); return 0; }
执行结果:
查找表格数据代码如下:
#include#include #include #include int main(int argc,char **argv) { if(argc != 3) { fprintf(stderr,"Usage : %s < Database path > < NUM >n",argv[0]); return 0; } //打开数据库 sqlite3 *pdb = NULL; int ret = sqlite3_open(argv[1],&pdb); if(ret != SQLITE_OK) { perror("Open database error"); return -1; } //准备SQL语句对象 sqlite3_stmt *stmt = NULL; //用来表示SQL语句对象的指针 char *sql = "SELECT * FROM student WHERe NUM < @NUM;"; ret = sqlite3_prepare_v2(pdb,sql,strlen(sql),&stmt,NULL); if(ret != SQLITE_OK) { perror("Prepare Failed"); sqlite3_close(pdb); return -1; } //为索引值指定具体的值 int var_index = sqlite3_bind_parameter_index(stmt,"@NUM"); sqlite3_bind_int(stmt,var_index,atoi(argv[2])); int flag = 0; while(1) { //4.执行准备好的SQL语句对象 ret = sqlite3_step(stmt); if(ret == SQLITE_ROW)//获取到了一条记录 { //获取查询到的记录(一行数据)的列数 int ncols = sqlite3_column_count(stmt); int i; if(flag == 0) { //先将表头打印出来 for(i = 0;i < ncols;i++) { //将每一列的字段名(表头)打印出来 printf("%st",sqlite3_column_name(stmt,i)); } putchar('n'); flag = 1; } for(i = 0;i < ncols;i++) { //将用户数据打印出来 //获取到当前记录的列的数据类型 int type = sqlite3_column_type(stmt,i); if(type == SQLITE_INTEGER) { printf("%dt",sqlite3_column_int(stmt,i)); } else if(type == SQLITE_FLOAT) { printf("%.2ft",sqlite3_column_double(stmt,i)); } else if(type == SQLITE_TEXT) { printf("%st",sqlite3_column_text(stmt,i)); } else { printf("t"); } } printf("n"); } else if(ret == SQLITE_DONE)//意味着记录已经全部查询完毕 { printf("SELECT Done!n"); break; } else { perror("SELECT Failed"); break; } } //释放资源,销毁SQL语句对象和关闭数据库连接对象 sqlite3_finalize(stmt); sqlite3_close(pdb); return 0; }
执行结果:



