数据库_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,能够向数据库中增删改查联系人数据。

实现代码:

见绑定资源包

相关推荐
许苑向上10 分钟前
最详细【Elasticsearch】Elasticsearch Java API + Spring Boot集成 实战入门(基础篇)
java·数据库·spring boot·elasticsearch
CodeCraft Studio1 小时前
【实用技能】在 SQL Server 中使用 LIMIT 子句的替代方案
数据库·sql·sqlserver
Mephisto.java1 小时前
【大数据学习 | kafka】kafka的偏移量管理
大数据·sql·oracle·sqlite·json·hbase
jlting1952 小时前
HiveSQL 中判断字段是否包含某个值的方法
数据库·sql
求一个好offer拜托拜托2 小时前
SQL常见语法
数据库·sql
喵手2 小时前
PostgreSQL 增量备份:保护你的数据资产
数据库·postgresql
cliffordl2 小时前
SQLAlchemy 介绍与实践
数据库·python
文军的烹饪实验室2 小时前
sqlalchemy连接mysql数据库
数据库·mysql
安 当 加 密2 小时前
【安当产品应用案例100集】028-实现SQL Server数据库的透明加密
数据库·oracle
zybsjn2 小时前
如何产看SQL 查询的执行时间
数据库·sql