数据库基本概念
能够输入计算机并能被计算机程序识别和处理的信息集合数据库 (Database)
数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合
常用的数据库
1)大型数据库Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。中型数据库Server是微软开发的数据库产品,主要支持windows平台。
2)小型数据库mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。
3)基于嵌入式的数据库
基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是关系型数据库,功能强大,支持存储过程、SQL兼容等SQLite关系型数据库,体积小,支持ACID事务Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中 eXtremeDB是内存数据库,运行效率高
sqlite3命令语句
sqlite数据库创建
sqlite3 xxxxx.db
如果sq.db存在则直接打开sq.db数据库,如果不存在则先创建再打开;
系统命令
系统命令,需要以 . 开头,不需要以 ; 结尾
.quit 退出数据库
.exit 退出数据库
.help 显示帮助信息,获取所有系统命令; 
.table 查看当前数据库下的所有表格;
.schema 查看表的结构
sql语句
以分号(;)结尾;不区分大小写;
没有char*类型,用char类型代替
记录:是某一行信息
字段:某一列信息
创建表格
create table 表名 (字段名 数据类型, 字段名 数据类型);
create table if not exists 表名 (字段名 数据类型, 字段名 数据类型); 
eg: CREATE TABLE stu (id int, name char, score float);
CREATE TABLE if not exists stu1 (id int, name char, score float); 
注意:数据库不支持严格的数据类型检查,数据类型写错了,创建是能够成功的,不会有错误提示;
删除表格
drop table 表名; 
eg: drop table stu1;
插入记录
字符串类型可以使用单引号,也可以使用双引号 
1) 全字段插入 insert into 表名 values (数据1, 数据2, 数据3);
eg: INSERT INTO stu VALUES (2, 'ls', 99);
INSERT INTO stu VALUES (1, "zs", 59);
注意: 1.数据输入的顺序要与创建时候字段的顺序一致;
2) 部分字段插入 insert into 表名 (字段名1, 字段名2) values (数据1, 数据2);
eg: INSERT INTO stu (id, name) values (9, 'ww');
注意: 1.数据的顺序要与指定的字段名1,字段名2对应;
查看记录
1) 查看所有记录
     select * from 表名;
     eg:
         SELECT * FROM stu;
         
 2) 查看某几行
     select * from 表名 where 限制条件;
     逻辑与 and     逻辑或 or
     eg:
         SELECT * FROM stu WHERE id<3 AND score>90;
         SELECT * FROM stu WHERE id<2 OR id>3;
     
 3) 查看某几列
     select 字段1, 字段2 from 表名;
     select 字段1, 字段2 from 表名 where 限制条件;
     eg:
         SELECT id, name FROM stu;
         SELECT id, name FROM stu WHERE score>90;
修改记录
update 表名 set 字段=数值 where 限制条件;
 
 eg:
     UPDATE stu SET score=60 WHERE id=1;
 注意:该语句中的where表明去修改指定的记录,如果没有加where,则表明将所有记录的该值都更新
删除记录
delete from 表名 where 限制条件;
 
 eg:
     DELETE FROM stu WHERE id=1;
     delete from stu;    删除表格中的所有数据;
主键(primary key)
primary key 主键;
 create table 表名(字段名 数据类型 primary key, 字段名 数据类型 );
 primary key主键:唯一标识表格中的每一条记录;
             例如:id字段为主键,当表格中有id==1的记录时,不允许再插入id为1的记录了;
 eg:
     CREATE TABLE stu (id int PRIMARY KEY, name char, score float);
 
 注意:主键的值必须唯一。每一张表格都应该设置一个主键,而且只能设置一个。
拷贝
从a中拷贝所有数据到b中:
     create table b as select * from a;
 从a中拷贝指定字段到b中:
     create table b as select 字段,字段,字段 from a;
 
  CREATE TABLE stu1 AS SELECT * FROM stu;
  CREATE TABLE stu2 AS SELECT id, name, score FROM stu;
增加列
alter table 表名 add column 字段名 数据类型;
 alter table stu add column score int;
修改表名
alter table 旧表名 rename to 新表名;
alter table stu rename to stuinfo;
修改字段名(列名)
不支持直接修改列名
 1.将表重新命名(a改成b)
     alter table stuinfo rename to stu;
 2.新建修改名字后的表(新建一个a)
     create table stuinfo (name char, age1 int, sex char, score int);
 3.从旧表b中取出数据,插入到新表a中;
     insert into stuinfo select * from stu;
删除列
不支持直接删除列;
 1.创建一个新表b,并复制旧表a需要保留的字段信息;
     create table stu as select name, age1, sex from stuinfo;
 2.删除旧表a;
     drop table stuinfo;
 3.修改新表b的名字a;
     alter table stu rename to stuinfo;
sqlite3 API
头文件: #include <sqlite3.h>
编译时候要加上-lsqlite3
gcc a.c -lsqlite3
sqlite3_open
int sqlite3_open(
   const char *filename,   /* Database filename (UTF-8) */ 
   sqlite3 **ppDb          /* OUT: SQLite db handle */
 );
 功能:打开一个数据库,如果数据库不存在,则创建一个数据库
 参数1:要打开的数据库的名字,是一个字符串
 参数2:数据库操作句柄,是一个二级指针,需要我们传入一级指针的地址,如果打开数据库成功,则数据库指针由该参数返回
 返回值:成功返回SQLITE_OK,失败返回一个错误码(非linux的错误码),可以使用sqlite_errmsg来获取错误信息,由sqlite3_errcode返回错误码值
 注意:无论打开数据库是否成功,在不使用数据库时都应该使用sqlite3_close将其关闭
sqlite3_close
int sqlite3_close(sqlite3*);
功能:关闭数据库,断开句柄所拥有的资源
参数:数据库指针
返回值:成功返回SQLITE_OK,失败返回其他错误码
sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3*);
功能:通过出错的句柄返回错误信息
参数:出错的句柄
返回值:对应的错误信息,是一个字符串
sqlite3_errcode
int sqlite3_errcode(sqlite3 *db)
功能:通过错误句柄返回错误码
参数:错误句柄
返回值:错误码
sqlite3_exec
int sqlite3_exec(
   sqlite3* db,                                  /* An open database */
   const char *sql,                           /* SQL to be evaluated */
   int (*callback)(void*,int,char**,char**),  /* Callback function */
   void *arg,                                    /* 1st argument to callback */
   char **errmsg                              /* Error msg written here */
 );
 功能:调用该函数,执行sql语句
 参数1:已经被打开的数据库句柄
 参数2:要执行的sql语句
 参数3:回调函数,主要用于数据库查找时,处理查找的结果集的函数,如果不需要处理sql语句的结果,则填NULL即可
 参数4:参数3的第一个参数
 参数5:错误信息
 返回值:成功返回SQLITE_OK,失败返回其他错误码
回调函数
int callback(void* arg,int cols,char** value_text,char** value_name)
 功能:对执行sql语句后的每一条记录,执行该函数,函数功能可以由用户自定义
 参数1:主调函数传递的参数,就是sqlite3_exec的第四个参数,该参数可以用于主调函数和回调函数之间数据交流
 参数2:记录查询结果的列的个数
 参数3:查询结果数据的起始地址
 参数4:查询结果的表头的起始地址
 返回值:成功返回0,失败返回错误码