Linux下使用SQLite3基本功能


版权声明:
本文为 博主原创文章,遵循 CC 4.0 BY-SA 版权协议
转载请附上原文出处链接和本声明

前言

在这里插入图片描述
为了便于更好阅读理解文章,在观看本文章之前,您需要了解什么是数据库,尤其是RDBMS,以及什么是计算机编程语言。

SQLite不需要实际的服务器来运行,应用程序无需与服务器通信到客户端/服务器架构,而是集成到SQLite中。

注意:SQLite不能很好地支持多个用户,如果有两个用户同时尝试写入,那么数据库将会被短暂锁定,功能受限。另外,SQLite不能处理一次大量数据,一旦超过最大容量,其性能将会降低。

linux下安装使用 SQLite3 >>>

介绍

什么是表:表是数据库最基本的组成对象,用来组织和存储数据。表由行和列组成,每个列包含特定类型的数据信息,一个列就是一个字段。一个数据库可以包含一个或多个表

以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");
    }
    
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值