一、数据库基本概念
1、数据(Data)
- 能够输入计算机并能被计算机程序识别和处理的信息集合;
2、数据库(Database)
- 数据库是在 数据库管理系统 管理和控制之下,存放在存储介质上的数据集合;
二、常用数据库
1、大型数据库
- Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台;目前Oracle关系数据库产品的市场占用率名列前茅。
2、中型数据库
- Server 是微软开发的数据库产品,主要支持windows平台;
3、小型数据库
mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL.AB公司,2008年被Sun公司收购,开放源码;
三、基于嵌入式的数据库
- 基于嵌入式Linux的数据库主要有SQLite,Firebird , Berkeley DB, eXtremeDB;
- Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等;
- SQLite关系型数据库,体积小,支持ACID事物;
- Berkeley DB中并没有数据库服务器的概念,它的程序库直接连接到应用程序中;
- eXtremeDB是存放数据库,运行效率高;
四、SQLite基础
- SQLite的源代码是C,其源代码完全开放。SQLite第一个AIphal版本诞生于2000年5月。他是一个轻量级的嵌入式数据库。
- SQLite有以下特性:
- 零配置 — 无需安装和管理配置;
- 储存在单一磁盘文件中 的一个完整的 数据库;
- 数据库文件可以在不同字节顺序的机器间自由共享;
- 支持数据大小至2TB;
- 足够小,全部源码大概3万行C代码,250KB;
- 比目前流行的大多数数据库对数据的操作要快;
- 数据库一般用来存储 类似 excle表格 的数据,电影等类似的数据存放在 文件系统下;
五、创建数据库
1、Ubuntu 命令行方式操作数据库 — 数据库的安装
- Ubuntu中安装 SQLite数据库有两种方式
- 第一种 是 :本地安装 sudo dpkg –I *.deb(三个安装包)
- 第二种 是 : 在线安装 sudo apt-get install sqlite3
六、数据库常用命令介绍
1、SQLite3基本命令
- 系统命令
- 以’ . ’开头的命令
- .help : 帮助
- .quit : 退出
- .exit : 退出
- .schema :查看表的结构图
- sql命令
- 基本的sql命令,不以 ‘ . ‘开头,但是都要以’ ; ‘结尾;
- 创建一张数据表 stu
- create table stu(id Integer , name char , score Integer);
- 插入一条记录
- insert into stu values (1001, ‘zhangsan’ , 80); // 整条记录内容插入
- insert into stu (name , score)values(1003 , “wangwu”);//记录 的部分内容插入
- 查询记录
- select * from stu ; //查询所有字段的结果;
- select name , score from stu ; //查询数据库中的部分字段的内容;
select * from stu where score = 80; //查讯满足条件score = 80 的记录有哪些;
select * from stu where score = 80 and name = “zhangsan”; 查询满足条件score=80与name=” zhangsan”的记录有哪些;
select * from stu where score = 80 or name = “lisi”;
- 删除一条记录
- delete from stu where score = ‘90’;
- 更新一条记录
- update stu set name = ‘wangwu’ where id = 1001 ; //将id=1001的记录中的name更新为 ‘wangwu’;
- update stu set name = ‘wangwu’ , score = 88 where id = 1001 ;
- 插入一列
- alter table stu add column address char ;//添加新的一列 : address char ;
- 删除一列
- sqlite3 不支持,直接删除一列:可以从以下步骤完成操作
- 1、创建一张新的表
- create table stu1 as select id , name , score from stu;
- 2、删除原有的表
- drop table stu;
- 将新的表名字改成原有的旧表的名字;
- alter table stu1 rename to stu;
- 1、创建一张新的表
- sqlite3 不支持,直接删除一列:可以从以下步骤完成操作
七、SQLite数据库编程接口
- int sqlite3_open(char *path , sqlite3 **db);
- 功能: 打开sqlite数据库;
- path : 数据库文件路径;
- db : 指向sqlite句柄的指针;
- 返回值 : 成功返回0 , 失败返回错误码(非零值);
- int sqlite3_close(sqlite3 * db);
- 功能: 关闭 sqlite数据库;
- 返回值: 成功返回0 ,失败返回错误码;
- const char *sqlite3_errmg(sqlite3 *db);
- 返回值: 返回错误信息;
- Typedef int (*sqlite3_callback)(void *, int,char ** ,char **);
- Int sqlite3_exec(sqlite3 *db ,const char *sql,sqlite3_callback callback , void*, char **errmsg);
- 功能: 执行SQL操作;
- db : 数据库句柄;
- callback : 回调函数;
- errmsg : 错误信息指针的地址;
- 返回值: 成功返回0 , 失败返回错误码;
- typedef int (*sqlite3_callback)(void *para , int f_num , char **f_value , char **f_name);
- 功能: 没找到一条记录自动执行一次回调函数;
- para :传递给回调函数参数;
- f_num : 记录包含的字段数目;
- f_value : 包含每个字段值的指针数组;
- f_name : 包含每个字段名称的指针数组;
- 返回值: 成功返回0 , 失败返回-1;
八、示例 —— 利用数据库 制作一个 关于学生的 成绩管理系统
- 功能:通过 键盘的输入 对 该管理系统进行 增删改查 以及退出系统的操作;
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABACK "stu.db"
int do_insert(sqlite3 * db){
int id = 0;
char name[32] = {0};
int score = 0;
char sql[128] = {0};
char *errmsg;
printf("Input id(输入ID) : ");
scanf("%d",&id);
getchar();
printf("Input name(输入姓名) : ");
scanf("%s",name);
getchar();
printf("Input score(输入成绩) : ");
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);
return -1;
}else{
printf("sqlite3 insert success !!!");
}
return 0;
}
int do_delete(sqlite3 * db){
char sql[128] = {};
int id;
char * errmsg;
printf("Input id(需要删除学生记录 的ID) :");
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);
return -1;
}else {
printf("sqlite3 delete success !!!");
}
return 0;
}
int do_update(sqlite3 * db){
char sql[128] = {};
int id;
int score;
char * errmsg;
printf("Input id(输入需要修改的score学生的ID) :");
scanf("%d",&id);
getchar();
printf("score 修改为 : ");
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);
return -1;
}else {
printf("sqlite3 update success !!!");
}
}
#if 0 //使用回调函数的方式 查询 数据库
int callback(void *para,int f_num , char **f_value,char** f_name){
int i = 0;
for(i = 0;i<f_num; i++){
printf("%-11s",f_value[i]);
}
putchar(10);
return 0;
}
int do_query(sqlite3 * db){
char sql[128] = {0};
char *errmsg;
sprintf(sql,"select * from stu;");
if(sqlite3_exec(db,sql,callback,NULL,&errmsg) !=SQLITE_OK){
printf("%s \n",errmsg);
}
else{
printf("sqlite3 query success !!!\n");
}
}
#else //不使用 回调函数的方式 查询数据库
#endif
int main(int argc, const char *argv[])
{
sqlite3 * db;
char *errmsg;
int cmd = 0;
if(sqlite3_open(DATABACK , &db) != SQLITE_OK){
printf("%s \n",sqlite3_errmsg(db));
return -1;
}else{
printf("sqlite3 open success !!!!\n");
}
if(sqlite3_exec(db,"create table stu (id Integer,name char,score Integer);",NULL,NULL,&errmsg) !=SQLITE_OK){
printf("%s\n",errmsg);
printf("stu 已经存在 !!");
}else {
printf("create sqlite3 stu success !!!\n");
}
while(1){
printf("**************************************\n");
printf("1: insert(插入) 2: delete(删除) 3: query(查询)) 4: update(更新) 5: quit(退出) \n");
printf("**************************************\n");
scanf("%d",&cmd);
getchar();
switch(cmd){
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
do_query(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
default:
printf("Error cmd .\n");
}
}
return 0;
}
— 在编程中使用接口 打开并创建数据库或,除了直接用查询接口查询该表格外;在ubuntu系统命令下 要在 stu.db的路径下使用 sqlite3 stu.db 命令 才能 .table 以及 .schema 查看该表的内容;
— 在打开数据库后,创建表格时,创建的表格的 要事先不存在的表格,不然会报错;
2、不适用回调函数的 查询数据库函数:
int sqlite3_get_table(sqlite3 * db , const char *sql , char **resultp, int *nrow , int *ncolumn , char **errmsg);
— 功能: 执行SQL操作;
— db : 数据库句柄;
— sql : SQL语句;
— resultp :用来指向sql执行结果 的指针;
— nrow :满足条件的记录的数目;
— ncolumn :每条记录包含的字段数目
— errmsg : 错误信息指针 的地址;
— 返回值 : 成功返回0 ,失败返回错误码;
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
void sqlite3_free_table(char **result);
这是一个为向后兼容性而保留的遗留接口。不建议使用此接口。
int do_query1(sqlite3 * db){
char sql[128] = {};
char *errmsg;
char **resultp;
int nrow;
int ncloumn;
int index;
int i,j;
sprintf(sql,"select * from stu;");
if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg) != SQLITE_OK){
printf("%s\n",errmsg);
}else{
printf("Query done. \n");
}
for(j = 0;j<ncloumn;j++){
printf("%-11s ",resultp[j]);
}
putchar(10);
index = ncloumn;
for(i = 0;i<nrow;i++){
for(j = 0;j<ncloumn;j++){
printf("%-11s",resultp[index++]);
}
putchar(10);
}
return 0;
}