文章目录
数据库
一、概览
- 涵盖内容:数据库基础概念、SQLite3 常用命令与 SQL 增删改查(CRUD)、SQLite C 语言接口使用示例、工具与编译注意事项、以及课堂项目(学生管理、词典导入、天气查询等)。
二、基础概念
- 数据库(Database):将数据集合化并存放,便于管理与查询。
- 数据库管理系统(DBMS):软件,负责数据存储、管理与访问;相关角色包括数据库管理员、数据库应用软件、操作系统。
- 关系型数据库(RDBMS):以表格(类似 Excel)组织数据,常用字段示例:姓名、性别、年龄、分数。
- 非关系型数据库(NoSQL):如 JSON 格式的键值对(key = value)。
三、常用数据库(举例)
- SQL Server、Oracle、SQLite(轻量级、单文件数据库)等。
四、SQLite CLI(命令行)基础
常见命令:
sqlite3 stu.db -- 打开/创建数据库文件
.tables -- 列出表
.schema -- 查看表结构
.headers on -- 显示查询列名
.mode column -- 以列对齐模式显示查询结果
.quit / .exit -- 退出
.help -- 帮助
注意:SQL 语句必须以分号
;
结尾。
五、SQL 基本操作(CRUD)(以创建学生信息表为例)
1. 创建表(Create)
CREATE TABLE stu (
name TEXT,
sex TEXT,
age INTEGER,
score REAL,
PRIMARY KEY(name) -- 示例主键
);
-- 或者:
CREATE TABLE stu1 (name TEXT, sex TEXT, age INT, score REAL);
说明:PRIMARY KEY
用于唯一标识记录;如果希望实现自增长,字段类型应写为 INTEGER PRIMARY KEY
。
2. 插入(Insert)
-- 插入整行
INSERT INTO stu VALUES ("tom","male",19,99.5);
-- 插入部分列
INSERT INTO stu (name, sex) VALUES ("jack","male");
3. 删除(Delete)
-- 删除记录
DELETE FROM 表名 WHERE 条件;
-- 删除表
DROP TABLE 表名;
4. 更新(Update)
-- 添加字段
ALTER TABLE stu ADD COLUMN sno;
-- 修改数据
UPDATE stu SET sno=110 WHERE name="tom";
5. 查询(Select)
SELECT * FROM stu; -- 显示所有列
SELECT name FROM stu WHERE score>80; -- 查询部分字段
SELECT * FROM stu WHERE age IN (18,19);
SELECT * FROM stu WHERE age>18 AND score>80;
SELECT * FROM stu WHERE name LIKE "%tom%"; -- 模糊匹配
SELECT * FROM user WHERE id<10 ORDER BY id LIMIT 2;
SELECT * FROM user WHERE age BETWEEN 19 AND 20;
常用关键字:IN
, AND
, OR
, BETWEEN ... AND ...
, LIKE
, ORDER BY
, LIMIT
。
六、补充技巧与细节
- 时间列插入:可使用
datetime('now','+8 hours')
(UTC 调整为 +8 小时)。
CREATE TABLE user1 (id INT, name CHAR, age INT, dt DATETIME);
INSERT INTO user1 VALUES (2, '张三', 23, datetime('now','+8 hours'));
- 自动增长列:必须把字段类型写为
INTEGER PRIMARY KEY
才能实现自动增长,例如:
CREATE TABLE user3 (id INTEGER PRIMARY KEY ASC, name CHAR, age INT, dt DATETIME);
INSERT INTO user3 (NULL, '李四', 23, datetime('now'));
ASC
表示升序,DESC
表示降序。
七、SQLite C 接口(编程)
主要函数:
-
int sqlite3_open(const char *filename, sqlite3 **ppDb);
- 打开数据库文件并返回
sqlite3*
句柄。成功返回SQLITE_OK
。
- 打开数据库文件并返回
-
int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *arg, char **errmsg);
-
执行 SQL 语句;若结果集不为空,会调用回调函数处理每一行。
-
callback
函数原型:int callback(void *para, int n_column, char **column_value, char **column_name);
-
errmsg
可用于接收错误信息(执行失败时)。
-
-
int sqlite3_close(sqlite3 *db);
- 关闭数据库并释放资源。
回调函数用于接收每一行的列值与列名,以字符串数组形式传入。
八、编译与依赖
- 在 Linux 下安装开发包:
sudo apt-get install libsqlite3-dev
- 编译示例:
gcc test_sqlite3.c -lsqlite3
附:常用示例命令
-- 打开数据库
sqlite3 stu.db
-- 查看表与结构
.tables
.schema stu
-- 查询并以列样式显示
.headers on
.mode column
SELECT * FROM stu;
-- 创建示例
CREATE TABLE stu1 (name TEXT, sex TEXT, age INT, score REAL);
-- 插入示例
INSERT INTO stu VALUES ("tom","male",19,99.5);
-- 更新示例
ALTER TABLE stu ADD COLUMN sno;
UPDATE stu SET sno=110 WHERE name="tom";
-- 删除示例
DELETE FROM stu WHERE name="tom";
DROP TABLE stu;
习题
读取一个包含单词原型和释义的文件,将其信息录入表中
代码实现:
#include<stdio.h>
#include<string.h>
#include<sqlite3.h>
#include<fcntl.h>
#include<unistd.h>
int main(void){
FILE* fd;
fd = fopen("dict.txt","r");
if(fd == NULL){
printf("fopen fail\n");
return -1;
}
sqlite3 *db = NULL;
int ret = sqlite3_open("word.db",&db);
if(ret != SQLITE_OK){
printf("sqlite3_open fail");
return -1;
}
sqlite3_exec(db,"create table word(id INTEGER PRIMARY KEY ASC,word,meaning);",NULL,NULL,NULL);
char buf[1024];
char word[64] = {0};
char meaning[512] = {0};
char *p = NULL;
while(fgets(buf,sizeof(buf),fd) != NULL){
buf[strlen(buf)-1] = '\0';
p = strchr(buf,' ');
int len = p - buf;
strncpy(word,buf,len);
word[len] = '\0';
while(*p == ' '){
p++;
}
strcpy(meaning,p);
meaning[strlen(meaning)-1] = '\0';
char sql[2048] = {0};
sprintf(sql,"insert into word values(NULL,\"%s\",\"%s\");",word,meaning);
char *errmsg = NULL;
ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(ret != SQLITE_OK){
printf("sqlite3_exec fail :%s\n",errmsg);
return -1;
}
}
sqlite3_close(db);
return 0;
}