Linux下使用SQLite3基本功能
版权声明:
本文为 博主原创文章,遵循 CC 4.0 BY-SA 版权协议
转载请附上原文出处链接和本声明
前言
为了便于更好阅读理解文章,在观看本文章之前,您需要了解什么是数据库,尤其是RDBMS,以及什么是计算机编程语言。
SQLite不需要实际的服务器来运行,应用程序无需与服务器通信到客户端/服务器架构,而是集成到SQLite中。
注意:SQLite不能很好地支持多个用户,如果有两个用户同时尝试写入,那么数据库将会被短暂锁定,功能受限。另外,SQLite不能处理一次大量数据,一旦超过最大容量,其性能将会降低。
介绍
什么是表:表是数据库最基本的组成对象,用来组织和存储数据。表由行和列组成,每个列包含特定类型的数据信息,一个列就是一个字段。一个数据库可以包含一个或多个表。
以excel为例:下面两张图分别代表了两种表(为表取了名字:学生信息、公民信息)
学生信息
公民信息
一个数据库可以包含一个或多个表
在Linux环境下使用SQLite3 创建了一个数据库,库内创建了一个表(学生信息)
下方写了详细的注释 >>> //注释
linux@ubuntu:~/SQL/第一个数据库$ ls //查看当前目录下的文件和目录
linux@ubuntu:~/SQL/第一个数据库$ sqlite3 我的一个数据库.db //使用SQLite3创建了一个数据库
SQLite version 3.11.0 2016-02-15 17:29:24 //SQLite提示成功创建打开数据库
Enter ".help" for usage hints. //SQLite提示
sqlite> create table 学生信息(学号 integer,姓名 text,性别 text,成绩 integer);//在数据库内创建了一个表
sqlite>
sqlite>
sqlite> .database //显示打开的数据库文件位置
seq name file
--- --------------- ----------------------------------------------------------
0 main /home/linux/SQL/第一个数据库/我的一个数据库.d //打开的数据库文件位置
sqlite>
sqlite>
sqlite> .tables //显示当前数据库内所有的表
学生信息 //只有一个表,名叫学生信息
sqlite>
sqlite>
sqlite> .schema //查看表的结构(因为只有一个表所以只会显示 学生信息 的结构)
CREATE TABLE 学生信息(学号 integer,姓名 text,性别 text,成绩 integer);
sqlite>
sqlite>
sqlite> .quit //退出当前数据库
linux@ubuntu:~/SQL/第一个数据库$ ls
我的一个数据库.db
一、使用语句命令SQLite
1、SQLite3 常见命令
.help :显示帮助信息
.quit :退出SQLite3
.database:显示当前打开的数据库文件
sqlite> .database //显示打开的数据库文件位置
seq name file
--- --------------- ----------------------------------------------------------
0 main /home/linux/SQL/第一个数据库/我的一个数据库.d
.tables :显示数据库中所有的表名
sqlite> .tables //显示当前数据库内所有的表
学生信息 //只有一个表,名叫学生信息
.schema :查看表的结构
sqlite> .schema //查看表的结构(因为只有一个表所以只会显示 学生信息 的结构)
CREATE TABLE 学生信息(学号 integer,姓名 text,性别 text,成绩 integer);
2、创建一个数据库表
create table 表的名字(字段1名 其数据类型,字段2名 其数据类型,…);
CREATE TABLE 学生信息(学号 integer,姓名 text,性别 text,成绩 integer);
sqlite> create table 学生信息(学号 integer,姓名 text,性别 text,成绩 integer); //在数据库内创建了一个表
sqlite>
sqlite> .schema //查看表的结构
CREATE TABLE 学生信息(学号 integer,姓名 text,性别 text,成绩 integer);
sqlite>
3、数据类型
4、插入一列表
Insert into 表的名字 values(参数1,参数2,…);
sqlite> insert into 学生信息 values(1,'小李','男',80);//插入数据
sqlite>
sqlite> select * from 学生信息; //显示表(学生信息)的内容
1|小李|男|80 //成功插入
5.0、显示数据
5.1、显示指定表的 全部数据
select 显示区域 from 要显示的表;
//这里省略了创建表和插入表的过程
sqlite>
sqlite> select * from 学生信息;//显示表 学生信息的 全部数据
1|小李|男|80
2|小王|男|70
3|小张|女|90
sqlite>
5.2、显示指定表的 指定数据
where指定从一个表或多个表中获取数据的条件
sqlite> select * from 学生信息 where 性别 = '女';//只查看性别为女的列表
3|小张|女|90
sqlite>
sqlite> select * from 学生信息 where 成绩 >= 80;//只查看成绩大于等于80的列表
1|小李|男|80
3|小张|女|90
sqlite>
6、修改数据
update 表名 set 需要修改的字段 = 修改值 where 指定要统一修改的列表;
sqlite> select * from 学生信息;
1|小李|男|80
2|小王|男|70
3|小张|女|90
sqlite>
sqlite> update 学生信息 set 成绩 = 100 where 姓名 = '小李';//将姓名为小李的列表的成绩修改为100
sqlite>
sqlite> select * from 学生信息;
1|小李|男|100
2|小王|男|70
3|小张|女|90
sqlite>
7、删除指定的数据列表
delete from 表名称 where 要删除列表中的任意一个字段;
sqlite> select * from 学生信息;
1|小李|男|100
2|小王|男|70
3|小张|女|90
sqlite>
sqlite> delete from 学生信息 where 学号 = 3;//删除学号为3的列表
sqlite> select * from 学生信息;
1|小李|男|100
2|小王|男|70
sqlite>
8、表名主键字段的关键字
//当表内存在相同值时,我们只想删除其中一个(实际上很难实现)
sqlite> select * from 学生信息;
1|小李|男|100
2|小王|男|70
2|小王|男|70
sqlite>
sqlite> delete from 学生信息 where 学号 = 2; //删除学号为1的列表
sqlite> select * from 学生信息;
1|小李|男|100 //可以发现将两个学号为2的列表都给删除了
sqlite>
可以看到当存在相同内容的列表时,一旦删除其中一个另外一个也会一起删除
从根本上避免这个问题,设置一个不可重复的字段
当一个字段设置为primary key时,表内同属字段的值就不能重复
sqlite> create table 学生信息(学号 integer primary key,姓名 text,性别 text,成绩 integer);//创建一个表 字段 学号的值不允许重复
sqlite>
sqlite> insert into 学生信息 values(1,'小李','男',100);
sqlite> insert into 学生信息 values(1,'小王','男',70); //违规重复学号
Error: UNIQUE constraint failed: 学生信息.学号 //SQLite3 报错 表 学生信息的学号重复
sqlite>
sqlite> select * from 学生信息; //查看表的所有内容会发现 小王的信息并未成功录入表内
1|小李|男|100
sqlite>
sqlite> insert into 学生信息 values(2,'小王','男',70);//规范插入列
sqlite> select * from 学生信息;
1|小李|男|100
2|小王|男|70
sqlite>
9、删除一个数据库表
drop table 要删除的表名;
sqlite> create table 学生信息(学号 integer ,姓名 text,性别 text,成绩 integer);//创建表 学生信息
sqlite> create table 公民信息(姓名 text,性别 text,电话 integer,地址 text); //创建表 公民信息
sqlite>
sqlite> .tables //查看当前数据库下的所有表
公民信息 学生信息
sqlite>
sqlite> drop table 公民信息; //删除数据库中 表明为公民信息 的表
sqlite>
sqlite> .tables
学生信息
sqlite>
二、使用SQLite提供的API编写C
SQLite3数据库针对不同的语言提供了相应的编程接口
C语言 SQLite3数据库 相关库文件
#include<sqlite3.h>
1、int sqlite3_open()创建一个数据库表
int sqlite3_open(const char *filename, sqlite3 **ppDb)
函数功能:
打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。形参一:const char *filename
形参二: sqlite3 **ppDb返回参数:
sqlite3 * sql_db; //用于存放打开/创建的数据库地址
char * errmsg; //用于存放错误信息
//打开或创建数据库,file_db获得数据库的地址
if (SQLITE_OK != sqlite3_open("学生信息.db",&sql_db))
{
//打印错误信息
fprintf(stderr,"数据库打开失败\n%s\n",sqlite3_errmsg(sql_db));
return -1;
}
2、int sqlite3_exec()写入操作数据库内的数据
int sqlite3_exec(sqlite3 * db,const char * sql,int(* callback)(void*,int,char **,char **),void * arg,char ** errmsg)
函数功能:
一站式查询执行函数,使用该函数可以直接利用C代码实现SQLite3内,对其表、列表的 增删改查形参一:sqlite3 * db
打开的数据库(数据库的地址)
形参二:const char * sql
SQLite 标准语句
形参三:int(* callback)(void*,int,char **,char **)
回调函数
形参四:void * arg
给回调函数传递的第一个参数
形参五:char ** errmsg
获取错误信息存放的地址,内部存放的字符串即为错误信息;
出现错误信息后记得使用 ==sqlite3_free()==将其内存释放;返回参数:
成功返回 0
失败返回错误码
标准代码
sqlite3 * sql_db; //用于存放打开/创建的数据库地址
char * errmsg; //用于存放错误信息
char * file_name = "学生信息.db"; //创建/打开的数据库 名称(标准SQLite 语句)
//打开或创建数据库,file_db获得数据库的地址
//若已打开数据库则无需重复操作执行
if (SQLITE_OK != sqlite3_open(file_name ,&sql_db))
{
//打印错误信息
fprintf(stderr,"数据库打开失败\n%s\n",sqlite3_errmsg(sql_db));
return -1;
}
//SQLite 标准语句,内容 即为 SQLite3标准 语句(插入一行列表)
char * create_table = "insert into 学生信息 values(1,'小李','男',100);";
//执行 create_table 的 SQLite3标准 语句
if (SQLITE_OK != sqlite3_exec(sql_db,create_table,NULL,NULL,&errmsg))
{
//打印错误信息
fprintf(stderr,"数据库操作错误\n%s\n",errmsg);
//释放掉错误区域内存,防止内存溢出
sqlite3_free(errmsg);
return -1;
}
进阶代码
typedef struct
{
int id; //学号
char * name; //姓名
char * gender; //性别
int sock; //成绩
}student;
student S = {1,"小李","男",100}; //要插入的结构体(需要与数据库内的表结构一致)
sqlite3 * sql_db; //用于存放打开/创建的数据库地址
char * errmsg; //用于存放错误信息
//打开或创建数据库,file_db获得数据库的地址
//若已打开数据库则无需重复操作执行
if (SQLITE_OK != sqlite3_open(file_name ,&sql_db))
{
//打印错误信息
fprintf(stderr,"数据库打开失败\n%s\n",sqlite3_errmsg(sql_db));
return -1;
}
char statement[1024] = {0}; //SQLite3标准语句暂存空间
//使用 sprintf函数将数据转换成 SQLite3的标准语句
sprintf(statement,"insert into 学生信息 values(%d,'%s','%s',%d);",S.id,S.name,S.gender,S.sock);
//将封装好的结构体数据 插入到数据库内
if (SQLITE_OK != sqlite3_exec(sql_db,statement,NULL,NULL,&errmsg))
{
//打印错误信息
fprintf(stderr,"数据库操作错误\n%s\n",errmsg);
//释放掉错误区域内存,防止内存溢出
sqlite3_free(errmsg);
return -1;
}
sqlite3_exec 在数据库内创建一个表
//SQLite 标准语句,内容为 在数据库内创建一个表
char * create_table = "create table 学生信息(学号 integer,姓名 text,性别 text,成绩 integer);";
sqlite3_exec(sql_db,create_table,NULL,NULL,&errmsg);
sqlite3_exec 插入一列表
//SQLite 标准语句,内容为插入一列表
char * create_table = "insert into 学生信息 values(1,'小李','男',80);";
sqlite3_exec(sql_db,create_table,NULL,NULL,&errmsg);
sqlite3_exec 修改数据
//SQLite 标准语句,内容为修改数据
char * create_table = "update 学生信息 set 成绩 = 100 where 姓名 = '小李';";
sqlite3_exec(sql_db,create_table,NULL,NULL,&errmsg);
sqlite3_exec 删除指定的数据列表
//SQLite 标准语句,内容为删除指定的数据列表
char * create_table = "delete from 学生信息 where 学号 = 3;";
sqlite3_exec(sql_db,create_table,NULL,NULL,&errmsg);
sqlite3_exec 删除一个数据库表
//SQLite 标准语句,内容为 删除一个数据库表
char * create_table = "drop table 学生信息;";
sqlite3_exec(sql_db,create_table,NULL,NULL,&errmsg);
3、sqlite3_get_table() 读取数据库内的数据
int sqlite3_get_table(sqlite3 * db,const char *zSql,char ***pazResult,int * pnRow,int * pnColumn,char ** pzErrmsg)
函数功能:
获取数据库内的数据:表的结构、表的内容、行、列形参一:sqlite3 * db
打开的数据库(数据库的地址)
形参二:const char *zSql
SQLite 标准语句
形参三:char ***pazResult
获取到的表的内容的首地址
形参四:int * pnRow
获取到的表的 总行数
形参五:int * pnColumn
获取到的表的 总列数
形参六:char ** pzErrmsg
获取错误信息存放的地址,内部存放的字符串即为错误信息;
出现错误信息后记得使用 ==sqlite3_free()==将其内存释放;返回参数:
成功返回 0
失败返回错误码
char * look = "select * from 学生信息";//查看所有的列
char ** paz_result;
int hang;//用于存放获取到的总个数
int lie;//用于存放一列表的个数
//将数据库内容传到C变量里
if (SQLITE_OK != sqlite3_get_table(sql_db,look,&paz_result,&hang,&lie,&errmsg))
{
//打印错误信息
fprintf(stderr,"数据库操作错误\n%s\n",errmsg);
//释放掉错误区域内存,防止内存溢出
sqlite3_free(errmsg);
return -1;
}
printf("一共有%d行,每行参数%d个(列)\n",sum,lie);
printf("参数分别为:");
for (int temp = 0; temp < lie; temp++)
{
printf("%s\t",paz_result[temp]);
}
printf("\n\n详细信息\n");
int i,j,index = 0;
for ( i = 0; i <= hang; i++)//默认会少打印一行,所以 i <= hang
{
for ( j = 0; j < lie; j++)
{
printf("%s\t",paz_result[index]);
index ++;
}
printf("\n");
}