数据库
数据
- 能够输入计算机并能被计算机程序识别和处理的信息集合。
数据库
- 数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合。
常用数据库
- Oracle关系数据库产品目前市场占有率名列前茅。
- server是微软开发的数据库,主要支持Windows平台。
- MySQL是一个小型数据库,开发者为瑞典MySQL公司,是一款开源数据库。
基于嵌入式的数据库
- 基于嵌入式Linux的数据库主要有sqlite、Firebird、Berkeley DB,extremeDB。
- sqlite关系型数据库,体积小,支持ACID事务。
SQLITE基础
- sqlite的源代码是C,且完全开放,属于一个轻量级的嵌入式数据库。
- sqlite——零配置,无需安装和管理配置。
- 存储在单一磁盘文件中的一个完整的数据库。
- 数据库文件可以在不同字节顺序的机器间自由共享。
- 支持数据库大小至2Tb。
- 足够小,全部源代码大约3万行C代码,250kb。
- 比目前流行的大多数数据库对数据的操作要快。
sqlite 安装
- 下载 .deb安装文件进行安装。(本地安装)
- sudo dpkg -i *.deb
- 在线安装
- sudo apt-get install sqlite3
sqlite 基本命令
- sqlite3 student.db (创建一个名为student的sqlite数据库)
- 系统命令,以 . 开头。
- .help 帮助
- .quit 退出
- .exit 退出
- .schema 查看表的结构
- .databases 查看打开的数据库
- sql命令
创建命令
* create table stu(id Integer, name char, score Integer); 创建一个stu表,并设置表内所含字段和类型,以分号结尾。
插入命令
- insert into stu values(1002, “lisi”, 90); 插入数据。
- select * from stu;查询表内所有字段数据。
- insert into stu (name, score)values(1003, “wangwu”);部分字段插入数据。
查询命令
- select from stu; 查询部分字段。
- select * from stu where score=80;查询score=80的数据。
- select * from stu where score=80 and id=1001;查询同时满足两个条件的数据。
- select * from stu where score=80 or id=1001;查询满足两个条件任意一个的数据。
删除命令
- delete from stu where name=“wangwu”;删除指定条件的数据。
修改数据命令
update stu set name=“wangwu” where id=1001;将id=1001的数据的name修改。
update stu set name=‘wangwu’ , score=88 where id=1001; 同时修改多个字段的数据。
修改表属性命令
- alter table stu add column address char;添加char属性的address字段。(插入一列或者添加字段)
- 不支持删除字段,所以需要通过创建新表格来完成删除字段操作。
- create table stu1 as select id, name, score from stu;(创建一个新的表格,从原有表格中提取指定字段数据)
- drop table stu;(删除原有表格)
- alter table stu1 rename to stu;(将新表格改名成原有表格)
sqlite编程接口
sqlite3 函数接口
打开数据库
int sqlite3_open(const char *filename, sqlite3 **ppDb)
1
功能:打开一个数据库
参数:filename——数据库路径名,ppDB——代表操作句柄。
返回值:成功返回SQLITE_OK。
关闭数据库
int sqlite3_close(sqlite3 *db);
1
功能:关闭一个数据库。
返回值:成功返回SQLITE_OK。
使用示例代码(学生管理):
/************************************************************************* > File Name: student.c > Author: > Mail: > Created Time: 2019年06月01日 星期六 18时48分11秒 ************************************************************************/ #include #include #include #define DATABASE "stu.db" int do_insert(sqlite3 *db){ int id; char name[32] = {0}; int score; char sql[128] = {0}; char *errmsg; printf("please input id\n"); scanf("%d", &id); getchar(); printf("please input name\n"); scanf("%s", name); getchar(); printf("please input score\n"); scanf("%d", &score); getchar(); sprintf(sql, "insert into stu values(%d, '%s', %d);", id, name, score); //使用插入语句,注意字符串类型的数据需要加引号 if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){ printf("%s\n", errmsg); } else{ printf("inset done.\n"); } return 0; } //定义查询的回调函数 int callback(void *para, int f_num, char **f_value, char **f_name){ printf("do->callback\n"); int i = 0; for(i = 0; i < f_num; i++){ printf("%-11s", f_value[i]); } putchar(10); return 0; } int do_query(sqlite3 *db){ int id; char name[32] = {0}; int score; char sql[128] = {0}; char *errmsg; printf("do->query\n"); sprintf(sql, "select * from stu;"); if(sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK){ printf("%s\n", errmsg); } else{ printf("query done.\n"); } return 0; } //使用sqlite3_get_table进行查询 int do_query2(sqlite3 *db){ char sql[128] = {0}; char *errmsg; char **resultp; int nrow; int ncloumn; sprintf(sql, "select * from stu;"); if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncloumn, &errmsg) != SQLITE_OK){ printf("%s\n", errmsg); } else{ printf("Query2 done.\n"); } int i,j; for(j = 0; j< ncloumn; j++){ printf("%-11s", resultp[j]); } printf("\n"); int index = ncloumn; for(i =0; i < nrow; i++){ for(j = 0; j < ncloumn; j++){ printf("%-11s", resultp[index++]); } printf("\n"); } return 0; } //执行修改数据语句 int do_update(sqlite3 *db){ int id; char name[32] = {0}; int score; char sql[128] = {0}; char *errmsg; printf("please input id\n"); scanf("%d", &id); getchar(); printf("please input modify score\n"); scanf("%d", &score); getchar(); sprintf(sql, "update stu set score=%d where id=%d;",score, id); if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){ printf("%s\n", errmsg); } else{ printf("update done.\n"); } return 0; } //删除数据语句 int do_delete(sqlite3 *db){ int id; char name[32] = {0}; int score; char sql[128] = {0}; char *errmsg; printf("please input id\n"); scanf("%d", &id); getchar(); sprintf(sql, "delete from stu where id=%d;", id); if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){ printf("%s\n", errmsg); } else{ printf("delete done.\n"); } return 0; } int main(int argc, const char *argv[]){ sqlite3 *db; char *errmsg; if(sqlite3_open(DATABASE, &db) != SQLITE_OK){ printf("%s\n", sqlite3_errmsg(db)); return -1; } else{ printf("Open DATABASE success!\n"); } //执行指定语句创建数据表 if(sqlite3_exec(db, "create table stu(id Integer, name char, score Integer);", NULL, NULL, &errmsg) != SQLITE_OK){ printf("%s\n", errmsg); } else{ printf("create table stu success.\n"); } int cmd; while(1){ printf("*********************************************\n"); printf("1:insert 2:delete 3:query 4:update 5:quit.\n"); printf("*********************************************\n"); printf("*********************************************\n"); scanf("%d", &cmd); getchar(); switch(cmd){ case 1: do_insert(db); break; case 2: do_delete(db); break; case 3: do_query2(db); // do_query(db); break; case 4: do_update(db); break; case 5: sqlite3_close(db); exit(0); default: printf("Error cmd.\n"); } } return 0; }