数据库
数据
- 能够输入计算机并能被计算机程序识别和处理的信息集合。
数据库
- 数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合。
常用数据库
- 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)
功能:打开一个数据库
参数:filename——数据库路径名,ppDB——代表操作句柄。
返回值:成功返回SQLITE_OK。
关闭数据库
int sqlite3_close(sqlite3 *db);
功能:关闭一个数据库。
返回值:成功返回SQLITE_OK。
使用示例代码(学生管理):
/*************************************************************************
> File Name: student.c
> Author:
> Mail:
> Created Time: 2019年06月01日 星期六 18时48分11秒
************************************************************************/
#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
#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;
}