一、数据库基础概念

1.1 数据库分类

根据规模和应用场景,数据库可分为以下几类:

  • 大型数据库:Oracle(适用于企业级高并发、大容量场景)
  • 中型数据库:MySQL、MSSQL(适用于中小型系统、Web 应用)
  • 小型数据库:SQLite、DB2(适用于嵌入式设备、轻量应用)

1.2 常用核心名词

缩写全称核心作用
DBDatabase(数据库)用于数据的存储、查询和更新,是数据的集合
DBMSDatabase Management System(数据库管理系统)操作和管理数据库的软件,如 SQLite、MySQL
MISManagement Information System(管理信息系统)基于数据库的企业管理系统,如 ERP、CRM
OAOffice Automation(办公自动化)基于数据库的协同办公系统,如考勤、审批

1.3 关系型数据库与 SQL 分类

关系型数据库基于表结构存储数据,通过SQL(Structured Query Language,结构化查询语言) 操作数据,SQL 按功能分为三类:

  • DDL(数据定义语言):用于定义数据库结构,如建表、删表
  • DML(数据操作语言):用于修改数据,如新增、更新、删除数据
  • DQL(数据查询语言):用于查询数据,如条件查询、排序查询

二、SQLite 核心特性

SQLite 是轻量级嵌入式数据库,无需独立服务器,核心特点如下:

  1. 开源免费:基于 C 语言开发,源代码完全开放
  2. 极致轻量:核心代码仅约 1 万行,编译后体积小于 10MB
  3. 无需安装:绿色软件,解压即可使用,无复杂配置
  4. 文件存储:整个数据库存储在单一文件中,便于移动和备份
  5. 容量充足:最大支持 2TB 数据存储,满足中小型应用需求
  6. 跨平台兼容:支持 Windows、Linux、macOS 等主流操作系统

三、SQLite 安装与基本使用

3.1 安装方法(Ubuntu/Debian 系统)

# 安装SQLite命令行工具
sudo apt-get install sqlite3
# 安装开发库(含头文件和静态库,用于C语言开发)
sudo apt-get install libsqlite3-dev
验证安装
# 查看SQLite版本
sqlite3 --version
# 查看帮助信息
sqlite3 --help
编译 C 程序
# 编译时需链接SQLite库和线程库
gcc test.c -lsqlite3 -lpthread -o test

3.2 基本使用(命令行)

1. 启动与退出
# 打开或创建名为test.db的数据库文件(不存在则自动创建)
sqlite3 test.db# 退出SQLite命令行(两种方式)
.q 或 .exit
  • 成功启动后显示 sqlite> 提示符
  • 若出现 ...> 提示符,说明命令未结束,需输入 ; 结束
2. 创建数据库
# 方法1:先创建空文件,再打开
touch test.db
sqlite3 test.db# 方法2:直接通过sqlite3命令创建并打开(推荐)
sqlite3 test.db

3.3 系统维护命令(以.开头)

命令功能描述
.database列出当前数据库及关联文件路径
.tables列出当前数据库中的所有表
.schema [表名]显示指定表的结构(CREATE 语句),无表名则显示所有表
.dump [表名]导出数据库或指定表的 SQL 脚本
.headers on/off开启 / 关闭查询结果的列标题显示
.exit退出 SQLite 程序

3.4 数据库导入与导出

导出数据库(备份)
# 将test.db数据库导出为SQL脚本backup.sql
sqlite3 test.db .dump > backup.sql
导入数据库(恢复)
# 将backup.sql脚本导入到new.db数据库(new.db不存在则创建)
sqlite3 new.db < backup.sql

四、SQL 基本语法

4.1 DDL(数据定义语言)

1. 创建表
-- 方式1:默认字段类型为TEXT
CREATE TABLE user(id, name, age);-- 方式2:指定字段类型(推荐)
CREATE TABLE user(id INT,        -- 整数类型name TEXT,     -- 文本类型age INT,       -- 整数类型dt DATETIME    -- 时间类型
);
  • SQLite 支持的数据类型:INT(整数)、TEXT(文本)、REAL(浮点数)、BLOB(二进制)
  • 若不指定类型,默认按TEXT处理
2. 删除表
-- 删除名为user的表(谨慎操作,数据不可恢复)
DROP TABLE user;

4.2 DML(数据操作语言)

1. 插入数据
-- 插入指定字段的数据(未指定字段值为NULL)
INSERT INTO user(id, age) VALUES(1, 10);-- 插入完整记录(需与表字段顺序一致)
INSERT INTO user VALUES(3, "wang", 11, datetime('now', '+8 hours'));-- 只插入部分字段(其余字段为NULL)
INSERT INTO user(age) VALUES(12);
  • datetime('now', '+8 hours'):获取当前东八区时间
2. 更新数据
-- 单条件更新:修改name为'li'的记录的id为1
UPDATE user SET id = 1 WHERE name = 'li';-- 多条件更新(AND):同时满足两个条件
UPDATE user SET id = 1 WHERE name = "li" AND passwd = "123";-- 多条件更新(OR):满足任一条件
UPDATE user SET id = 2 WHERE name = "li" OR name = "zhao";
3. 删除数据
-- 删除表中所有数据(谨慎操作,无条件删除)
DELETE FROM user;-- 单条件删除:删除id为1的记录
DELETE FROM user WHERE id = 1;-- 多条件删除(AND/OR)
DELETE FROM user WHERE id = 1 AND name = "zhang";
DELETE FROM user WHERE id = 1 OR id = 2;

4.3 DQL(数据查询语言)

1. 基本查询
-- 查询表中所有字段和数据
SELECT * FROM user;-- 查询指定字段
SELECT id FROM user;
SELECT id, name FROM user;
2. 条件查询
-- 逻辑条件查询(NOT):查询age不小于30的记录
SELECT * FROM user WHERE NOT age < 30;-- 模糊查询(LIKE):%匹配0-任意字符,_匹配1个字符
SELECT * FROM user WHERE name LIKE '张%';  -- 匹配姓张的所有记录
SELECT * FROM user WHERE name LIKE '张_';   -- 匹配姓张且名字为2个字的记录-- 排序查询(ORDER BY):ASC升序(默认),DESC降序
SELECT * FROM user ORDER BY id;          -- 按id升序
SELECT * FROM user ORDER BY id DESC;     -- 按id降序-- 限制结果数量(LIMIT):只返回前2条记录
SELECT * FROM user LIMIT 2;-- 组合查询:条件+排序+限制
SELECT * FROM user 
WHERE age > 20 OR age < 50 
ORDER BY age DESC 
LIMIT 2;

4.4 高级特性:自动增长列

SQLite 通过INTEGER PRIMARY KEY实现自动增长,无需AUTOINCREMENT

-- 创建含自动增长列的表
CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,  -- ASC表示升序增长(默认)name TEXT,age INT,dt DATETIME
);-- 插入数据:id传入NULL触发自增(首条记录id=1,后续自动+1)
INSERT INTO user3 VALUES(NULL, '李四', 23, datetime('now'));

五、SQLite C 语言接口

5.1 开发环境准备

  • 头文件:#include <sqlite3.h>
  • 编译命令:gcc test.c -lsqlite3 -lpthread -o test

5.2 核心 API 函数

1. 打开数据库:sqlite3_open
int sqlite3_open(const char *path,  // 数据库文件路径(如"./test.db")sqlite3 **db       // 数据库连接句柄的指针(输出参数)
);
  • 功能:打开指定路径的数据库文件,不存在则创建
  • 返回值:成功返回SQLITE_OK(0),失败返回非 0 错误码
  • 错误处理:通过sqlite3_errmsg(db)获取错误信息
2. 关闭数据库:sqlite3_close
int sqlite3_close(sqlite3 *db);  // db:数据库连接句柄
  • 功能:关闭数据库连接
  • 返回值:成功返回SQLITE_OK,失败返回错误码
  • 注意:关闭前需确保所有 SQL 操作已完成
3. 执行 SQL 语句:sqlite3_exec
int sqlite3_exec(sqlite3 *db,                // 数据库连接句柄const char *sql,            // 要执行的SQL语句int (*callback)(void*,int,char**,char**),  // 回调函数(处理查询结果)void *arg,                  // 传递给回调函数的参数char **errmsg               // 错误信息指针(输出参数)
);
  • 功能:执行 SQL 语句(INSERT/UPDATE/DELETE/SELECT 等)
  • 回调函数:仅 SELECT 查询时需要,用于逐行处理结果;非查询语句可设为NULL
  • 错误处理:错误信息需通过sqlite3_free(errmsg)释放内存

5.3 回调函数定义

回调函数用于处理sqlite3_exec执行 SELECT 后的查询结果:

// 回调函数:逐行处理查询结果
static int callback(void *NotUsed,    // 用户自定义参数(由sqlite3_exec的arg传入)int argc,         // 结果列数char **argv,      // 结果数据数组(argv[i]为第i列的值,NULL表示空值)char **azColName  // 列名数组(azColName[i]为第i列的列名)
) {int i;// 遍历列数据,打印列名和对应值for (i = 0; i < argc; i++) {printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");  // 每行数据后换行return 0;      // 返回0表示继续处理下一行,非0则中断
}

5.4 完整示例代码

示例 1:控制台输出查询结果
#include <stdio.h>
#include <sqlite3.h>// 回调函数:处理并打印查询结果
int show(void* arg, int col, char** result, char** title) {static int flag = 0;  // 标记是否首次调用(仅打印一次列名)int i = 0;// 首次调用:打印列名if (0 == flag) {flag = 1;for (i = 0; i < col; i++) {printf("%s\t", title[i]);}}// 打印当前行数据printf("\n");for (i = 0; i < col; i++) {printf("%s\t", result[i] ? result[i] : "NULL");}return 0;
}int main(int argc, char** argv) {sqlite3* db = NULL;       // 数据库连接句柄char* errmsg = NULL;      // 错误信息指针int ret;// 1. 打开数据库ret = sqlite3_open("./test.db", &db);if (SQLITE_OK != ret) {fprintf(stderr, "打开数据库失败:%s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;}// 2. 执行查询SQLchar sql_cmd[] = "SELECT * FROM user;";ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg);if (SQLITE_OK != ret) {fprintf(stderr, "执行SQL失败:%s(SQL:%s)\n", errmsg, sql_cmd);sqlite3_free(errmsg);  // 释放错误信息内存sqlite3_close(db);return 1;}// 3. 关闭数据库sqlite3_close(db);return 0;
}
示例 2:查询结果写入文件
#include <stdio.h>
#include <sqlite3.h>// 回调函数:将查询结果写入文件
int show(void* arg, int col, char** result, char** title) {FILE* fp = (FILE*)arg;    // 传入的文件指针static int flag = 0;      // 标记是否首次调用int i = 0;// 首次调用:写入列名if (0 == flag) {flag = 1;for (i = 0; i < col; i++) {fprintf(fp, "%s\t", title[i]);}}// 写入当前行数据fprintf(fp, "\n");for (i = 0; i < col; i++) {fprintf(fp, "%s\t", result[i] ? result[i] : "NULL");}return 0;
}int main(int argc, char** argv) {sqlite3* db = NULL;char* errmsg = NULL;int ret;// 1. 打开数据库ret = sqlite3_open("./test.db", &db);if (SQLITE_OK != ret) {fprintf(stderr, "打开数据库失败:%s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;}// 2. 打开文件(用于写入结果)FILE* fp = fopen("result.txt", "w");if (NULL == fp) {perror("打开文件失败");sqlite3_close(db);return 1;}// 3. 执行查询SQL,将文件指针传入回调函数char sql_cmd[] = "SELECT * FROM user;";ret = sqlite3_exec(db, sql_cmd, show, fp, &errmsg);if (SQLITE_OK != ret) {fprintf(stderr, "执行SQL失败:%s(SQL:%s)\n", errmsg, sql_cmd);sqlite3_free(errmsg);sqlite3_close(db);fclose(fp);return 1;}// 4. 关闭资源fclose(fp);sqlite3_close(db);return 0;
}

5.5 运行示例

# 1. 编译代码
gcc query_to_file.c -lsqlite3 -lpthread -o query_to_file# 2. 执行程序(前提:test.db已存在且含user表)
./query_to_file# 3. 查看结果文件
cat result.txt

理想输出(result.txt)

id      name    age     dt
1       张三    23      2024-05-20 15:30:45
2       李四    25      2024-05-20 15:31:20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922144.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922144.shtml
英文地址,请注明出处:http://en.pswp.cn/news/922144.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty 调优篇:实战配置、性能监控与常见坑

&#x1f680; Netty 调优篇&#xff1a;实战配置、性能监控与常见坑前面我们已经深入了 Netty 的 线程模型、Pipeline、EventLoop、内存池、零拷贝和背压机制。 但在实际工作中&#xff0c;很多人踩坑的地方不是“源码没看懂”&#xff0c;而是 调优没做好。 今天我们就从三个…

Linux Node.js 安装及环境配置详细教程

如果您喜欢此文章&#xff0c;请收藏、点赞、评论&#xff0c;谢谢&#xff0c;祝您快乐每一天。 一、Node.js是什么 Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]。 Node.js使用了一个事件驱动、非阻塞式I/O 的模型。 Node.js是一个让JavaScript运行在服务端的开…

呼叫中心系统IVR流程设计的心理学

呼叫中心的 IVR&#xff08;交互式语音应答&#xff09;系统看似是 “机器与用户的对话”&#xff0c;实则暗藏对用户心理的精准把握。其设计需围绕降低焦虑、提升效率、强化信任三大核心目标&#xff0c;背后依托认知心理学、行为心理学、情感心理学等理论支撑。一、认知负荷理…

一些开源或免费的网络管理工具

整理开源及免费网络管理工具推荐,涵盖监控、配置、安全、流量分析等场景,适用于不同规模的网络环境: ​一、网络监控与性能分析​ 1. ​Zabbix​ ​特点​:企业级监控方案,支持SNMP、IPMI、JMX等多种协议,提供实时仪表盘、告警通知和自动化发现功能。 ​适用场景​:服…

谷粒商城项目-P16快速开发-人人开源搭建后台管理系统

1.对脚手架工程进行改造 此项目选用的脚手架工程是人人开源 地址&#xff1a;人人开源 选择的是下图标红的renren-fast作为后端&#xff0c;renren-fast-vue作为前端 克隆上述两个项目 2.后端改造 2.1将renrenfast项目的git文件夹删除后&#xff0c;拖进后端代码文件夹中 2…

V少JS基础班之第八弹:this

文章目录一、 前言二、本节涉及知识点三、重点内容1、从新的角度认识this2、this是函数的参数3、this的值4、函数的调用1- 裸函数调用2- 函数作为构造函数调用3- 函数作为对象的方法调用4- 函数显示调用5- 箭头函数一、 前言 第八弹内容是this。this相对来说难度不大&#xff…

《堆的详解:结构、操作及堆排序算法》

目录 一.堆的概念与结构 1.1 堆的概念 1.2 堆性质&#xff1a; 1.3 堆的结构定义 二.堆的初始化和销毁 2.1 堆的初始化&#xff1a; 2.2 堆的销毁&#xff1a; 三.堆的插入数据(含向上调整算法的实现) 3.1 插入逻辑 3.2 插入函数 3.3 向上调整算法 三. 堆的删除数…

深入解析 Kubernetes 中的 Service 资源:为应用提供稳定的网络访问

什么是 Kubernetes 中的 Service&#xff1f; 在现代微服务架构中&#xff0c;服务之间的通信和负载均衡是至关重要的。尤其是在 Kubernetes 环境中&#xff0c;由于 Pod 是动态创建和销毁的&#xff0c;如何为一组 Pod 提供稳定的访问入口&#xff0c;成为了架构设计中的一个关…

使用Samba网络磁盘作为MacOS时间机器的远程备份磁盘

最近考虑MacOS系统升级&#xff0c;所以需要做磁盘备份&#xff0c;MacOS里有个备份磁盘很方便的工具&#xff1a;时间机器&#xff0c;可以自动定期备份磁盘&#xff0c;但是一般需要一个大点的移动硬盘插在macbook上选择其为备份磁盘&#xff0c;可惜我并没有移动硬盘&#x…

智能头盔实时监控系统设计与实现

智能头盔实时监控系统设计与实现 源码 https://gitee.com/intostars/csdn-demo/tree/master/src/views/smartHelmet 预览 一、功能概述 智能头盔实时监控系统是基于Vue 3和TypeScript开发的一套用于远程监控和控制智能头盔设备的前端应用模块。该系统通过WebSocket与后端服务…

Docker 学习笔记(八):容器运行时工具实践及 OpenStack 部署基础

容器管理工具Containerd nerdctl 实践 nerdctl管理存储 nerdctl命令创建容器的时候&#xff0c;可以使用-v选项将本地目录挂载给容器实现数据持久化 示例&#xff1a; [rootlocalhost ~]# mkdir /data [rootlocalhost ~]# nerdctl run -d -v /data:/data busybox -- sleep infi…

Unity键盘控制角色运动

以下是一个完整的Unity角色移动和跳跃脚本,支持WASD或方向键移动: 使用说明 确保组件设置正确: 确保您的游戏对象有一个CharacterController组件 如果没有,可以通过菜单 "Component -> Physics -> Character Controller" 添加 相机设置: 确保场景中有一…

linux 宏 DEVICE_ATTR

理解 DEVICE_ATTR DEVICE_ATTR 是 Linux 内核中用于创建设备属性的宏&#xff0c;通常用于 sysfs 文件系统。通过 sysfs&#xff0c;用户空间的程序可以读取或修改内核中的设备属性。DEVICE_ATTR 宏定义在 <linux/device.h> 头文件中&#xff0c;用于声明和定义一个设备属…

MCP模型上下文协议以及交互流程

1. MCP 是什么全称&#xff1a;Model Context Protocol定位&#xff1a;让大语言模型&#xff08;LLM&#xff09;能在“上下文”之外&#xff0c;按统一格式访问外部数据、调用插件、持久化状态。动机&#xff1a;以前每家框架&#xff08;LangChain、LlamaIndex 等&#xff0…

MySQLTransactionRollbackException

问题描述mysql部署1主3从&#xff0c;昨天发现主库有大量报警错误&#xff1a;Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ; Deadlock found when trying to get lock; …

Redis环境搭建指南:Windows/Linux/Docker多场景安装与配置

Redis环境搭建指南&#xff1a;Windows/Linux/Docker多场景安装与配置 1. Redis安装方式概览 1.1 安装方式对比 安装方式适用场景优点缺点难度Windows直接安装开发调试安装简单&#xff0c;Windows兼容好性能不如Linux&#xff0c;生产不推荐⭐Linux源码编译生产环境性能最佳…

leetcode.80删除有序数组中的重复项2

题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。…

运动卡新手入门及常见问题处理

1.新手入门1.1 插卡打开包装&#xff0c;拿出PCI板卡&#xff0c;如下图&#xff1a;打开电脑机箱盖&#xff0c;找到PCI插槽&#xff0c;如下图&#xff08;红色框部分是PCI槽&#xff0c;有些主板上PCI槽是白色或其他颜色&#xff09;&#xff1a;插入板卡&#xff0c;如下图…

PRINCE2与PMP项目管理体系对比

在全球范围内&#xff0c;PRINCE2与PMP是两大最具影响力的项目管理体系。PRINCE2注重流程和治理结构&#xff0c;强调“控制”与“规范”&#xff1b;而PMP基于PMBOK指南&#xff0c;强调知识体系和方法论的全面性&#xff0c;更关注“工具”与“实践”。 不同体系的侧重点&…

在UniApp跨平台开发中实现相机自定义滤镜的链式处理架构

以下是进阶方案&#xff1a;架构核心设计分层结构$$Pipeline Capture \otimes Filter_1 \otimes Filter_2 \otimes \cdots \otimes Filter_n \otimes Render$$ 其中&#xff1a;$\otimes$ 表示链式处理操作符$Capture$ 为原始图像采集层$Filter_n$ 为可插拔滤镜单元$Render$ 为…