数据库_SQLite3

下载

1、更新软件源:

sudo apt-get update

2、下载SQLite3:

sudo apt-get install sqlite3

3、验证:

sqlite3启动数据库,出现以下界面代表运行正常。输入 .exit 可以退出数据库

4、安装sqlite3的库

sudo apt-get install libsqlite3-dev,之后编译c代码时需要加上 -l sqlite3

5、打开数据库

sqlite3 <数据库文件名>

命令

回车可以换行输入,但本命令并不结束。输入 " ; " 后,本命令结束

1、以.开头的命令

.help:显示所有以.开头的命令

.exit:退出sqlite3

.table:显示当前已存在的表格

.headers on:开启显示表头

.mode column:查询时以列的形式显示结果

2、SQL语句

2.1 创建表格

语法:

sql 复制代码
CREATE TABLE table_name (
  column_1 data_type constraints,
  column_2 data_type constraints,
  ...,
  column_n data_type constraints
);

CREATE TABLE:创建表格的语句

table_name:表格的名字

column_1:表格的第一个参数

data_type:参数类型

|------------|--------|
| data_type值 | 含义 |
| INTEGER | 整型 int |
| TEXT | 存储大量文本 |
| REAL | 双精度浮点数 |

constraints:参数约束

|---------------|---------------|
| constraints值 | 含义 |
| PRIMARY KEY | 主键,这具有唯一性的特点 |
| NOT NULL | 非空,这代表该参数必须填写 |
| AUTOINCREMENT | 自动增加 |

示例:

创建一个名为"students"的学生信息表。该表将包含以下列:ID,姓名,年龄,性别和成绩。

sql 复制代码
CREATE TABLE students (
    ID INTERGER PRIMARY KEY NOT NULL,
    name TEXT NOT NULL,
    age INTEGER NOT NULL,
    gender TEXT NOT NULL,
    score REAL NOT NULL
);

students:表格名为students

ID:第一个参数是ID

INTERGER:参数类型是int型

PRIMARY KEY:主键,这具有唯一性的特点

NOT NULL:非空,这代表该参数必须填写

2.2 删除表

语法:

sql 复制代码
DROP TABLE table_name

table_name:要删除的表的名字

示例:

sql 复制代码
DROP TABLE students;

2.3 插入数据

语法:

sql 复制代码
INSERT INTO table_name (column_1, column_2, ..., column_n)
VALUES (value_1, value_2, ..., value_n);

table_name:表名

column_1:第一个参数的名字,与创建表时的名字一致

value_1:第一个参数的值

示例:

向students表中插入一条数据,ID=1,name=张三,age=18,gender=男,score=90.0

sql 复制代码
INSERT INTO students (ID, name, age, gender, score)
    values(1,'张三', 18, '男', 90.0);

2.4 查询数据

语法:

sql 复制代码
//查询
SELECT column_1, column_2, ..., column_n 
FROM table_name;
//条件查询
SELECT column1, column2 FROM table_name WHERE condition;

column_1:参数名,写*代表全部参数

table_name:表名

示例:

查询 students表中的全部参数

sql 复制代码
SELECT * FROM students;

2.5 更新表格

语法:

sql 复制代码
UPDATE table_name
SET column_1 = value_1, column_2 = value_2, ..., column_n = value_n
WHERE condition;

table_name:表名

column_1 = value_1:将参数column_1的值更新为value_1

condition:条件,只有满足条件时更新这个内容

示例:

将表students中id=1的内容更新为名字=no哈哈,分数=50

sql 复制代码
UPDATE students
SET name = 'no哈哈',score = 50
WHERE id = 1;

2.6 删除数据

语法:

sql 复制代码
DELETE FROM table_name WHERE condition;

table_name: 表名

condition:条件,只有满足条件时删除这个内容

示例:

删除表students中id = 1的数据

sql 复制代码
DELETE FROM students WHERE id = 1;

3、常用API

3.1 打开数据库

cpp 复制代码
int sqlite3_open(
    const char *filename,   /* 数据库文件的路径 */
    sqlite3 **ppDb          /* 用于存储数据库连接的指针 */
);

返回值:成功返回SQLITE_OK

filename:数据库文件的路径,当filename不存在时,会自动创建一个数据库文件。

ppDb:用于存储数据库连接的指针

3.2 关闭数据库

cpp 复制代码
int sqlite3_close(sqlite3 *db);

返回值:成功返回SQLITE_OK

db:sqlite3_open传入的参数ppDb

3.3 打印错误

cpp 复制代码
const char *sqlite3_errmsg(sqlite3 *db);

返回值:错误信息,没有错误时不打印信息。

db:sqlite3_open传入的参数ppDb

3.4 执行SQL语句

cpp 复制代码
int sqlite3_exec(
    sqlite3 *db,                                /* 数据库连接 */
    const char *sql,                            /* 要执行的 SQL 语句 */
    int (*callback)(void*,int,char**,char**),   /* 回调函数 */
    void *arg,                                  /* 传递给回调函数的参数 */
    char **errmsg                               /* 用于存储错误消息的指针 */
);

返回值:成功返回SQLITE_OK

db:sqlite3_open传入的参数ppDb

sql:sql语句

callback:执行查询语句时会用到该函数,其余时候写NULL即可。参数含义如下:

|---------------|------------------------|
| 参数 | 含义 |
| void* | sqlite3_exec中的arg参数值 |
| int | 查询结果所返回的列数,有多少个字段就有多少列 |
| char**(第一个) | 每个字段的值 |
| char**(第二个) | 每个字段的名称 |

注意:callback函数必须return 0,否则会报错query aborted

3.5 释放空间

cpp 复制代码
void sqlite3_free(void *p);

功能与free一样,释放malloc申请的空间。

sqlite3_exec的参数errmsg实际上申请了一个空间,使用之后应该调用sqlite3_free释放空间。

实验代码

使用c语言,编程实现"SQL语句"章节的相关功能。

具体代码实现如下:

cpp 复制代码
#include <stdio.h>
#include <sqlite3.h>

/*
 * callback:sqlite3_exec的回调函数
 * param arg:sqlite3_exec函数中传入的arg参数的值
 * param argc:有多少个字段 (比如该代码中argc就是5) 
 * param argv:字段的值 (比如第一个ID的值就是1,2,3.....)
 * param azColName:字段的名字 (比如该代码中就是ID, name, age, gender,score这几个字段) 
 * */
int callback(void* arg,int argc,char** argv,char** azColName){
	int i;

	//printf("get callback,arg = %d,argc = %d\n",(int)arg,argc);

	for(i=0;i<argc-1;i++){
		printf("%s = %s\n",azColName[i], argv[i] ? argv[i] : "NULL" );
	}
	return 0; //这里必须返回0
}

int main(){
	sqlite3 *db;
	char* errmsg = NULL;
	char* sql_create = "CREATE TABLE students 	 ( 			\
				  		ID INTERGER PRIMARY KEY NOT NULL, 	\
				 		name TEXT NOT NULL, 				\
				  		age INTEGER NOT NULL, 				\
				  		gender TEXT NOT NULL, 				\
				  		score REAL NOT NULL 				\
				  		);";
	char* sql_insert = "INSERT INTO students (ID, name, age, gender, score) values(1,'张三', 18, '男', 90.0);\
						INSERT INTO students (ID, name, age, gender, score) values(2,'李四', 19, '女', 91.0);\
						INSERT INTO students (ID, name, age, gender, score) values(3,'王五', 20, '男', 92.0);\
						";
	char* sql_select = "SELECT * FROM students;";

	//1.打开数据库
	if(sqlite3_open("./mydatabase.db",&db) != SQLITE_OK){
		sqlite3_errmsg(db);
		return -1;
	}
	//2.执行sql语句
	if(sqlite3_exec(db,sql_create,NULL,NULL,&errmsg) != SQLITE_OK){
		printf("sqlite3_exec err:%s\n",errmsg);
		sqlite3_free(errmsg);
		return -1;
	}
	if(sqlite3_exec(db,sql_insert,NULL,NULL,&errmsg) != SQLITE_OK){
		printf("sqlite3_exec err:%s\n",errmsg);
		sqlite3_free(errmsg);
		return -1;
	}
	if(sqlite3_exec(db,sql_select,callback,NULL,&errmsg) != SQLITE_OK){
		printf("sqlite3_exec err:%s\n",errmsg);
		sqlite3_free(errmsg);
		return -1;
	}

	//3.关闭数据库
	sqlite3_close(db);

	return 0;
}

代码运行结果如下:

练习:联系人管理系统

实现功能:

数据库名为test.db,能够向数据库中增删改查联系人数据。

实现代码:

见绑定资源包

相关推荐
KELLENSHAW24 分钟前
MySQL45讲 第三十七讲 什么时候会使用内部临时表?——阅读总结
数据库·mysql
小刘鸭!2 小时前
Hbase的特点、特性
大数据·数据库·hbase
凡人的AI工具箱2 小时前
每天40分玩转Django:Django表单集
开发语言·数据库·后端·python·缓存·django
奔跑草-2 小时前
【数据库】SQL应该如何针对数据倾斜问题进行优化
数据库·后端·sql·ubuntu
Elastic 中国社区官方博客2 小时前
如何通过 Kafka 将数据导入 Elasticsearch
大数据·数据库·分布式·elasticsearch·搜索引擎·kafka·全文检索
P.H. Infinity2 小时前
【Redis】配置序列化器
数据库·redis·缓存
猛男技术控2 小时前
Milvus矢量数据库 麒麟v10安装
数据库·milvus
别致的影分身2 小时前
MySQL 常用程序介绍
数据库·mysql
HD2436088363 小时前
【mysql】id主键列乱了之后,重新排序(可根据日期顺序)
数据库·sql·mysql
皓木.3 小时前
苍穹外卖——准备工作
java·数据库·mybatis