一、数据库概述
1.1 什么是数据库
数据库是对大批量数据进行增删改查管理的软件。它把数据持久化存储在文件中,程序结束后数据依然保留。
1.2 数据库分类
| 类型 | 特点 | 代表产品 |
|---|---|---|
| 关系型数据库 | 数据存在文件中,支持SQL | Oracle、MySQL、SQLite |
| 非关系型数据库 | 数据存在内存中(高速) | Redis、MongoDB |
二、SQLite基本命令
2.1 安装与进入
bash
# 安装
sudo apt-get install sqlite3
# 进入数据库(自动创建文件)
sqlite3 test.db
# 查看所有表
.tables
# 查看表结构
.schema 表名
# 开启/关闭列名显示
.headers on/off
# 设置显示模式
.mode column
2.2 SQLite支持的数据类型
| 类型 | 说明 |
|---|---|
INTEGER |
整型 |
REAL |
浮点型 |
TEXT |
文本字符串 |
BLOB |
二进制大对象(图片、文件等) |
三、SQL语句
3.1 创建表 : CREATE TABLE
sql
CREATE TABLE 表名 (列名1 类型1, 列名2 类型2, ...);
sql
CREATE TABLE student (
id INTEGER,
name TEXT,
sex TEXT,
age INTEGER,
score INTEGER
);
3.2 插入数据 : INSERT
sql
-- 插入完整数据
INSERT INTO student VALUES (1, '张三', '男', 18, 90);
-- 插入部分数据(未指定的字段为NULL)
INSERT INTO student (id, name, sex) VALUES (2, '李四', '女');
-- 插入多条
INSERT INTO student VALUES
(3, '王五', '男', 19, 85),
(4, '赵六', '女', 20, 92);
3.3 查询数据 : SELECT
sql
-- 查询所有列
SELECT * FROM student;
-- 查询指定列
SELECT name, score FROM student;
-- 条件查询(WHERE)
SELECT name, score FROM student WHERE score >= 90;
-- 模糊查询(LIKE,%匹配任意字符)
SELECT name FROM student WHERE name LIKE '张%';
-- 排序(ORDER BY)
SELECT name, score FROM student ORDER BY score DESC; -- 降序
SELECT name, score FROM student ORDER BY score ASC; -- 升序
-- 条件组合
SELECT name, score FROM student
WHERE sex = '男' AND score >= 90;
3.4 更新数据 : UPDATE
sql
UPDATE 表名 SET 列名 = 新值 WHERE 条件;
sql
UPDATE student SET score = 95 WHERE name = '张三';
3.5 删除数据 : DELETE
sql
DELETE FROM 表名 WHERE 条件;
sql
DELETE FROM student WHERE name = '李四';
3.6 删除表 : DROP TABLE
sql
DROP TABLE 表名;
sql
DROP TABLE student;
四、SQLite C语言接口
4.1 sqlite3_open : 打开数据库
c
int sqlite3_open(const char *filename, sqlite3 **ppDb);
| 参数 | 说明 |
|---|---|
filename |
数据库文件名(如 "test.db") |
ppDb |
存放数据库句柄的指针 |
c
sqlite3 *db;
int ret = sqlite3_open("test.db", &db);
if (ret != SQLITE_OK) {
fprintf(stderr, "打开失败: %s\n", sqlite3_errmsg(db));
return -1;
}
4.2 sqlite3_exec : 执行SQL语句
c
int sqlite3_exec(
sqlite3 *db, // 数据库句柄
const char *sql, // SQL语句
int (*callback)(void*, int, char**, char**), // 回调函数(SELECT用)
void *arg, // 回调函数的参数
char **errmsg // 错误信息
);
非查询语句(CREATE、INSERT、UPDATE、DELETE)不需要回调:
c
char *errmsg = NULL;
char *sql = "INSERT INTO student VALUES (1, '张三', '男', 18, 90)";
int ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "执行失败: %s\n", errmsg);
sqlite3_free(errmsg);
}
查询语句(SELECT)需要回调函数:
c
// 回调函数:每查到一行数据就调用一次
int callback(void *arg, int column_count, char **column_value, char **column_name)
{
for (int i = 0; i < column_count; i++) {
printf("%s = %s\n", column_name[i], column_value[i] ? column_value[i] : "NULL");
}
printf("---\n");
return 0; // 返回0继续查询,非0终止
}
char *sql = "SELECT * FROM student";
char *errmsg = NULL;
int ret = sqlite3_exec(db, sql, callback, NULL, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "查询失败: %s\n", errmsg);
sqlite3_free(errmsg);
}
回调函数的参数:
| 参数 | 含义 |
|---|---|
arg |
sqlite3_exec 的第四个参数 |
column_count |
本次查询的列数 |
column_value |
每列的值(字符串形式) |
column_name |
每列的列名 |
4.3 sqlite3_close : 关闭数据库
c
int sqlite3_close(sqlite3 *db);
五、完整示例
c
#include <stdio.h>
#include <sqlite3.h>
int callback(void *arg, int col_count, char **col_value, char **col_name)
{
for (int i = 0; i < col_count; i++) {
printf("%s = %s\n", col_name[i], col_value[i] ? col_value[i] : "NULL");
}
printf("\n");
return 0;
}
int main(void)
{
sqlite3 *db;
char *errmsg = NULL;
// 1. 打开数据库
int ret = sqlite3_open("test.db", &db);
if (ret != SQLITE_OK) {
fprintf(stderr, "打开失败: %s\n", sqlite3_errmsg(db));
return -1;
}
// 2. 创建表
char *create_sql = "CREATE TABLE IF NOT EXISTS student ("
"id INTEGER, name TEXT, score INTEGER)";
ret = sqlite3_exec(db, create_sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "建表失败: %s\n", errmsg);
sqlite3_free(errmsg);
}
// 3. 插入数据
char *insert_sql = "INSERT INTO student VALUES (1, '张三', 90), (2, '李四', 85)";
ret = sqlite3_exec(db, insert_sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "插入失败: %s\n", errmsg);
sqlite3_free(errmsg);
}
// 4. 查询数据
char *select_sql = "SELECT * FROM student";
ret = sqlite3_exec(db, select_sql, callback, NULL, &errmsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "查询失败: %s\n", errmsg);
sqlite3_free(errmsg);
}
// 5. 关闭数据库
sqlite3_close(db);
return 0;
}
编译时需链接 sqlite3 库:
bash
gcc main.c -lsqlite3 -o app
六、今日总结
今天学了数据库基础 和SQLite,核心要点如下:
数据库分类:
-
关系型(MySQL、SQLite):数据持久化,支持SQL
-
非关系型(Redis):内存存储,速度快
SQL语句:
-
CREATE TABLE创建表 -
INSERT INTO插入数据 -
SELECT ... WHERE查询数据 -
UPDATE ... SET ... WHERE更新数据 -
DELETE FROM ... WHERE删除数据 -
ORDER BY排序(ASC升序/DESC降序) -
LIKE模糊查询(%匹配任意字符)
SQLite C接口:
-
sqlite3_open()打开数据库 -
sqlite3_exec()执行SQL语句(非查询无需回调,查询需回调函数) -
sqlite3_close()关闭数据库 -
回调函数每查一行调用一次,返回0继续、非0终止