一、数据库的概念
数据库是数据库管理系统管理与控制之下,存放在存储介质上的数据集合。
二、常用的数据库
大型数据库
Oracle关系数据库、sun公司的DB2数据库
中型数据库
Server数据库,微软
小型数据库
MySQL,sun公司
三、基于嵌入式的数据库
基于嵌入式的数据库主要有:SQLite 、Firebird、Brekeley DB、 eXtremeDB
SQLite关系型数据库,体积小,支持ACID事务
Firebird是关系型数据库,功能强大,支持存储过程,SQL兼容等
Berkeley中无数据库服务器概念,它的程序直接连接到应用程序中
eXTREmeDB是内存数据库,运行效率高
四、SQLite基础
五、创建数据库
安装:sudo apt-get install sqlite3
六、数据库常用命令
1、系统命令
以‘ . ’开头的命令
.help 帮助 .quit 退出 .exit 退出 .databases 查看打开的数据库
.table 查看当前数据库下的表格
2、SQL命令
以分号结尾
1、创建一张数据库表 stu
create table stu(id integer , name char , score integer);
2、查看所有表的创建语句:
.schema
3、完全插入数据
insert into stu values(1001, 'zhuguo', 10);
部分插入数据
insert into stu (name, score)values('yitong', 100);
4、查询记录
select name from stu; //查部分字段
select * from stu; //查所有字段
select * from stu where score=100 and name='yitong'; //按条件与查询
select * from stu where score = 100 or score = 10; //按条件或查询
5、删除记录
delete from stu; //删除整个记录表
delete from stu where id = 1001; //按条件删除记录
6、更新表
update stu set name='wangba' where score=50;
update stu set name='yitong' , score = 20 where id=1001;
7、增加字段
alter table stu add column address char; //增加列 address
8、删除一列
sqlite3不支持直接删除一列
1)---创建一张新的表
create table stu1 as select id, name, sex from stu;
2 )---删除原有的表
drop table stu;
3)---将新的表名改为原有的旧表名
alter table stu1 rename to stu;
七、SQLite编程接口
int sqlite3_open(char *path, sqlite3 **db); //功能:打开sqlite3数据库 //path:数据库文件路径 //db :返回sqlite句柄的指针 //返回值:成功--0-SQLITE_OK, 失败--错误码 int sqlite3_close(sqlite3 *db); //关闭数据库,成功0,失败错误码 const char *sqlite3_errmg(sqlite3 *db); //返回值:返回错误信息的首地址
功能:执行一条SQL语句
int sqlite3_exec( sqlite3*, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */ );
参数:
db 数据库操作句柄
sql 一条sql语句
callback 回调函数,只要sql为查询语句时才会执行
void * 给回调函数传参
errmsg 错误信息
返回值: 成功 SQLITE_OK
int (*callback)(void*,int,char**,char**);
功能:查询的结果,是一个函数指针类型,填函数名即可
回调函数
typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name); //--功能--每找到一条记录自动执行一次回调函数 //--para :传递给回调函数的参数 //--f_num :记录中包含的字段数目 //--f_value :包含每个字段值得指针数组 //--f_name :包含每个字段名称的指针数组 //--返回值---成功返回0,失败返回-1
不使用回调函数执行SQL语句
//功能:执行SQL语句
int sqlite3_get_table( sqlite3 * db, / *打开的数据库* / const char * zSql, / *SQL语句 * / char *** pazResult, / *指向执行结果的指针* / int * pnRow, / *结果行数:满足条件的记录数* / int * pnColumn, / *结果列数:每条记录的字段数* / char ** pzErrmsg / *错误信息指针的地址* / ); void sqlite3_free_table(char ** result); //功能:
As an example of the result table format, suppose a query result is as follows:
Name | Age ----------------------- Alice | 43 Bob | 28 Cindy | 21
有两列(M == 2)和三行(N == 3)。因此,结果表具有8个条目。假设结果表存储在名为azResult的数组中。然后azResult保留以下内容:
azResult[0] = "Name"; //二级指针数组存放每个内容的首地址 azResult[1] = "Age"; azResult[2] = "Alice"; azResult[3] = "43"; azResult[4] = "Bob"; azResult[5] = "28"; azResult[6] = "Cindy"; azResult[7] = "21";
示例代码:
1 #include <stdio.h> 2 #include <sqlite3.h> 3 #include <stdlib.h> 4 5 #define DATABASE "stu.db" 6 7 /*插入 */ 8 int do_insert(sqlite3 *db) 9 { 10 int id; 11 char name[32]={}; 12 int score; 13 char sql[128]={}; 14 char *errmsg; 15 16 printf("Intput id:"); 17 scanf("%d",&id); 18 getchar(); //回收垃圾字符 19 20 printf("Intput name:"); 21 scanf("%s",name); 22 getchar(); 23 24 printf("Intput score:"); 25 scanf("%d",&score); 26 getchar(); 27 28 /*使用sprintf进行字符拼接*/ 29 sprintf(sql,"insert into stu values(%d, '%s', %d);",id, name, score); 30 if(sqlite3_exec(db,sql, NULL, NULL, &errmsg) != SQLITE_OK) 31 { 32 printf("%s ", errmsg); 33 } 34 else 35 { 36 printf("Insert done. "); 37 } 38 39 return 0; 40 41 } 42 43 /*删除 */ 44 int do_delete(sqlite3 *db) 45 { 46 int id; 47 char sql[128]={}; 48 char *errmsg; 49 50 printf("Intput id:"); 51 scanf("%d",&id); 52 getchar(); //回收垃圾字符 53 54 /*使用sprintf进行字符拼接*/ 55 sprintf(sql,"delete from stu where id=%d",id); 56 if(sqlite3_exec(db,sql, NULL, NULL, &errmsg) != SQLITE_OK) 57 { 58 printf("%s ", errmsg); 59 } 60 else 61 { 62 printf("Delete done. "); 63 } 64 65 return 0; 66 67 } 68 69 /*更新 */ 70 int do_update(sqlite3 *db) 71 { 72 int id; 73 int score; 74 char sql[128]={}; 75 char *errmsg; 76 77 printf("Intput id:"); 78 scanf("%d",&id); 79 getchar(); //回收垃圾字符 80 81 printf("Intput score:"); 82 scanf("%d",&score); 83 84 /*使用sprintf进行字符拼接*/ 85 sprintf(sql,"update stu set score=%d,where id = %d",score,id); 86 if(sqlite3_exec(db,sql, NULL, NULL, &errmsg) != SQLITE_OK) 87 { 88 printf("%s ", errmsg); 89 } 90 else 91 { 92 printf("Update done. "); 93 } 94 95 return 0; 96 97 } 98 99 //定义回调函数,每找到一条记录自动执行一次回调函数 100 int callback(void *para, int f_num, char **f_value, char **f_name) 101 { 102 int i = 0; 103 104 for(i=0; i<f_num; i++) 105 { 106 printf("%-11s", f_value[i]); 107 } 108 putchar(10); 109 110 return 0; 111 } 112 /*查询 */ 113 int do_query(sqlite3 *db) 114 { 115 char sql[128]={}; 116 char * errmsg; 117 sprintf(sql,"select * from stu;"); 118 119 if(sqlite3_exec(db,sql, callback, NULL, &errmsg) != SQLITE_OK) 120 { 121 printf("%s ", errmsg); 122 } 123 else 124 { 125 printf("Query done. "); 126 } 127 128 return 0; 129 } 130 131 /*不使用回调函数执行SQL语句---查询 */ 132 int do_query_1(sqlite3 *db) 133 { 134 char sql[128]={}; 135 char * errmsg; 136 char **resultp; 137 int nrow; 138 int ncolumn; 139 int index; 140 141 int i,j; 142 143 sprintf(sql,"select * from stu;"); 144 145 if(sqlite3_get_table(db,sql, &resultp,&nrow,&ncolumn, &errmsg) != SQLITE_OK) 146 { 147 printf("%s ", errmsg); 148 } 149 else 150 { 151 printf("Query done. "); 152 } 153 154 for(j=0; j<ncolumn; j++) 155 { 156 printf("%-11s",resultp[j]); 157 } 158 putchar(10); 159 160 index = ncolumn; 161 for(i=0; i<nrow; i++) 162 { 163 for(j=0; j<ncolumn; j++) 164 { 165 printf("%-11s",resultp[index++]); //第一行的列都不打印 166 } 167 putchar(10); 168 } 169 return 0; 170 } 171 172 173 int main(int argc, const char *argv[]) 174 { 175 sqlite3 *db; 176 char *errmsg; //定义一级指针存放错误号的地址 177 int cmd; 178 179 if(sqlite3_open(DATABASE, &db) != SQLITE_OK) 180 { 181 printf("%s ",sqlite3_errmsg(db)); 182 return -1; 183 } 184 else 185 { 186 printf("open DATABASE success. "); 187 } 188 189 //创建一张数据库的表格 190 if(sqlite3_exec(db,"create table stu (id integer, name char, score integer);", NULL, NULL, &errmsg) != SQLITE_OK) 191 { 192 printf("%s ", errmsg); 193 } 194 else 195 { 196 printf("create table or open success. "); 197 } 198 199 while(1) 200 { 201 printf("************************************ "); 202 printf("1:insert 2:delete 3:query 4:update 5:quit. "); 203 printf("************************************ "); 204 205 printf("Intput CMD:"); 206 scanf("%d",&cmd); 207 getchar(); 208 209 switch(cmd) 210 { 211 case 1: 212 do_insert(db); 213 break; 214 case 2: 215 do_delete(db); 216 break; 217 case 3: 218 do_query_1(db); 219 break; 220 case 4: 221 do_update(db); 222 break; 223 case 5: 224 sqlite3_close(db); 225 exit(1); 226 default: 227 printf("ERROR CMD!! "); 228 } 229 } 230 231 232 return 0; 233 }