最近三天搞得我有点头大,接连Linux进程间通信、多线程编程、网络编程和数据库编程,都是Linux这一块的核心;中间还被导师催论文,每天熬到半夜写论文。今天仿佛是个转折点,论文交上去了,接下来的两天都是自习,今晚宿舍就有空调了,终于不用冻得睡不着了。。。想想就觉得很舒服。好了,废话少说,倒着来吧,先从数据库开始整理。
一、基本SQL语句
1、数据库与表
SQLite将每个数据库都保存为一个文件,后缀为.db。
数据库中的数据被组织成表的形式。
表由若干拥有相同字段的记录组成。//废话
字段指的时记录中的数据域,它有不同的类型,可以是一个数值(integer),也可以是字符串(text)
每个表中可以指定一个或多个字段为主键,表中所有记录的主键的值都不能重复。这种不重复是在插入记录时控制的,即如果向一个表中插入记录时,这个表中已有与插入记录相同的主键的记录,则插入失败。

2、创建表
用create语句可以在数据库中创建表
crearte table student(ID integer, name text, sex text,age intger, primary key(ID)); //sql语句以;为结尾,系统定 义命令除外如 .exit为退出
3、删除表
用drop语句可以从数据库中删除指定的表
drop table student;
4、插入记录
用insert语句可以向表中插入一条新记录
insert into student values(1,“ZHANG”, 'M', 18); //text类型既可以用“”也可以用‘’
insert into student (ID, name, sex,age) values (3, "ccc", 'W', 20); //完整插入一条记录的完整方式
insert into srudent(ID, name) values(2, "BBB"); //这种方式可以省略某条记录的某些字段
insert into student values(1,“ZHANG”, 'M', 18),(2, “wang”,‘W’,20);//,隔开一句插入多个数据
5、修改数据
用update语句可以修改表中的记录
update student set Sex = ‘F’ Age = 20 where Name = ‘Zhang’;//where及其后表示过滤条件,如果省略where和后面部分,则语 句的作用为修改表student中所有记录
6、删除记录
用delete语句可以删除表中的记录
delete from student where ID = 2;//没有where语句则表student中的所有记录均被删除。
7、where语句
使用where子句时,需要一个比较表达式,满足这个条件的记录将被操作。常用的比较操作符有:
这里主要注意不等于号是<>.和模式匹配 like
几个表达式还可以用逻辑操作符组合起来形成更复杂的表达式:
8、单表查询 ——重点
查询是对数据库最常用操作。查询的结果可以理解为得到一个新表,只是这个表没有保存在数据库里,而是以某种方式显示给查询者。
用select语句可以对数据库进行查询:
select * from student; //查询表student所有记录
select ID, NAME from student where Sex = ‘F’; //查询student中满足Sex=F的记录的ID和NAME
select * from student where ID between 2 and 4; //查询student中满足ID介于2到4的记录
select distinct * from student; //查询student中没有重复的记录
select * from score order by score asc;
select * from score order by score dasc; //查询结果按某个字段的值进行排序
select student.name from student, score where student.id = score.id and score.score < 60 //上述语句中,from关键字后出现两 个表明student和score,表示对这两个表进行联合查询。
selct A.name from student A, score B where A.id = B.id and B.score < 60; //上述语句中,from关键字后的表明都指定了一个别名
别名只在当前语句中有效
二、SQLite工具
SQLite库包含一个简单的命令行工具:sqlite3,该工具使得用户可以对一个SQLite数据库手动输入并且执行SQL语句。
启动sqlite3工具:
sqlite3 student.db
其中,student.db是要操作的数据库文件,如果它不存在,则会自动创建一个新的空数据库。
.exit //退出sqlite互动模式
.help //列出命令的提示信息
.tables //显示数据库中所有表名
.schema //查看表的结构
.detabase //显示当前打开的数据库文件
三、SQLite编程接口
1、关键数据结构
sqlite里最常用的是sqlite 3 *类型。从数据库打开sqlite就要为这个类型准备好内存,直到数据库关闭。相当于文件操作中的文件描述符。
2、打开数据库
#include<sqlite3.h>
int sqlite3_open(文件名,sqlite3 **);
第一个参数是数据库文件名,如:“student.db”。文件不一定要存在,如果这个文件不存在,sqlite会自动建立它。如果它存在,就尝试把它当数据库文件打开。
第二个参数是类似于文件描述符的关键数据结构。在使用sqlite_open打开数据库后,所有对数据库的操作,都使用这个变量。
函数返回值为SQLITE_OK表示操作正常。
3、关闭数据库
int sqlite3_close(sqlite3 *);
4、SQL语句操作,执行sql语句 ——重点
(1)回调函数查询方式:
int sqlite3_exec(sqlite3 *, const char *sql, sqlite3_callback, void *, char ** errmsg);
第一个参数是前面的关键数据结构。
第二个参数const char * sql是一条是sql语句,以\0结尾。\\用sprintf(char *, " ",参数表)装入
第三个参数sqlite3_callback是回调函数。当这条语句执行后,sqlite3会自动执行你提供的函数。
第四个参数是传参到回调函数。
第五个参数返回出错的信息。执行sqlite_exec之后,执行失败时可以查阅这个这个指针(printf("%s\n", errmsg))得到一串字符信息,会告知出错地方。不需要回调函数时,参数3,4填写NULL。查找数据时,必须进行查找语句。
回调函数形式:
typedef int (*sqlite_callback)(void* para,int columnCount, char** columnValue, char** columnName); //第四个参数的原样。所以用到的回调函数必须定义为这个形式。
para,是从sqlite3_exec()传入的参数指针;
columnCount,查询到的这一条记录有多少个字段(即这条记录有多少列);
columnValue,查询出来的数据都保存在这里,实际上是一个一维数组,每一个元素是一个char*值,是一个字段内容;
columnName,与columnValue是对应的,表示这个字段的字段名称。
(2)不使用回调进行查询的办法:
int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );
第二个参数是sql语句。
第三个参数是查询结果。
第四个参数是查询出多少条记录。多少行。
第五个记录是多少个字段。多少列。
第六个参数是错误信息。
O了,休息会开始下一个,网络编程。