一、数据库的概念
数据库是数据库管理系统管理与控制之下,存放在存储介质上的数据集合。
二、常用的数据库
大型数据库
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\n", errmsg);
33 }
34 else
35 {
36 printf("Insert done.\n");
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\n", errmsg);
59 }
60 else
61 {
62 printf("Delete done.\n");
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\n", errmsg);
89 }
90 else
91 {
92 printf("Update done.\n");
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\n", errmsg);
122 }
123 else
124 {
125 printf("Query done.\n");
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\n", errmsg);
148 }
149 else
150 {
151 printf("Query done.\n");
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\n",sqlite3_errmsg(db));
182 return -1;
183 }
184 else
185 {
186 printf("open DATABASE success.\n");
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\n", errmsg);
193 }
194 else
195 {
196 printf("create table or open success.\n");
197 }
198
199 while(1)
200 {
201 printf("************************************\n");
202 printf("1:insert 2:delete 3:query 4:update 5:quit.\n");
203 printf("************************************\n");
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!!\n");
228 }
229 }
230
231
232 return 0;
233 }
来源:https://www.cnblogs.com/y4247464/p/12241588.html
