linux学习-数据库

发布于:2025-08-30 ⋅ 阅读:(21) ⋅ 点赞:(0)

一、数据存储概述

(一)内存存储(易失性存储)

  • 存储载体:变量、数组、普通数据存储结构都存储在内存中。
  • 特点:数据依赖于程序运行和电力供应,当程序运行结束或者发生掉电情况时,数据会丢失,无法长期保存。

(二)硬盘存储(持久性存储)

  • 存储载体:文件和数据库(专业的数据存储结构)存储在硬盘上。
  • 特点:不受程序运行状态和电力的影响,即使掉电或者程序运行结束,数据依然能够保留,可长期存储。

二、常用数据库分类

(一)关系型数据库

  • 核心特点:采用关系模型,将复杂的数据结构简化为二维表格(行和列组成的表)形式,通过表与表之间的关系(如主键、外键关联)来组织和管理数据,适合处理结构化数据。
  • 典型代表及规模
    • 大型:Oracle、DB2,常用于大型企业级应用,能处理海量数据和高并发操作,具备强大的事务处理和数据管理能力。
    • 中型:MySQL、SQL Server,在中小企业应用广泛,平衡了性能、功能和成本,支持较为复杂的业务逻辑。
    • 小型:SQLite,轻量级数据库,适合嵌入式设备、移动应用等资源有限的场景,无需独立的数据库服务器进程。

(二)非关系型数据库(NoSQL)

  • 核心特点:不采用传统的关系模型,以键值对、文档、列族等灵活的方式存储数据,结构不固定(如常用的JSON格式就是一种键值对形式的半结构化数据),适合处理非结构化或半结构化数据,具有高可扩展性和高性能的特点。
  • 典型代表
    • Redis:基于内存的键值存储数据库,支持多种数据结构(如字符串、哈希、列表等),常用于缓存、消息队列等场景,性能极高。
    • MongoDB:文档型数据库,以BSON(类似JSON的二进制格式)存储数据,适合存储复杂的文档型数据,如社交应用中的用户信息、评论等。

三、SQLite 数据库深入解析

(一)核心特性

  1. 开源免费与开发语言:完全开源且免费使用,采用C语言开发,这使得它能够在多种平台上轻松移植,并且代码的可读性和可维护性较好。
  2. 轻量级:代码量仅约1万行左右,整个库的总大小在10M以内,占用系统资源极少,非常适合嵌入到各种应用程序中,不会给应用带来过多的资源负担。
  3. 文件型数据库:以单个文件的形式存在,这意味着它可以像普通文件一样进行移动、复制等操作,跨平台移植性极佳,在不同操作系统(如Windows、Linux、macOS等)之间切换时,数据库文件能直接使用。
  4. 大容量支持:理论上数据容量最大可达2T,能够满足大多数中小型应用甚至部分大型应用的数据存储需求。

(二)安装与测试(以Linux环境下的SQLite 3.22.0为例)

  1. 安装SQLite 3:使用Linux的包管理工具apt-get执行命令sudo apt - get install sqlite3,该命令会从软件源下载并安装SQLite 3的运行环境。
  2. 安装相关开发库:为了在C/C++等编程语言中使用SQLite的API,需要安装开发库,执行sudo apt - get install libsqlite3 - dev,该库包含了编译和链接SQLite相关程序所需的头文件和库文件。
  3. 测试数据库创建:执行sqlite3 xxx.db(其中xxx.db是自定义的数据库文件名),如果成功,会进入SQLite的命令行交互界面,此时就创建了一个名为xxx.db的数据库文件,可在该界面中进行后续的数据库操作。

(三)支持的数据类型

  • NULL:表示空值,即该字段没有任何有效的数据。
  • INTEGER:整型,用于存储整数数值,如年龄、编号等。
  • REAL:浮点型,用于存储带有小数部分的数值,如成绩、价格等。
  • TEXT:字符串类型,用于存储文本数据,如姓名、描述信息等。
  • BLOB:二进制大对象,根据输入的数据格式进行存储,可用于存储图片、音频、视频等二进制数据。

(四)数据库操作

1. 常用交互命令
  • .help:在SQLite命令行界面中输入该命令,会显示所有支持的命令及其简要说明,方便用户查看和学习如何使用各种命令。
  • .tables:用于查看当前数据库中存在的所有表,能快速了解数据库的表结构情况。
  • .headers on/off:控制查询结果是否显示表头(列名),on表示显示,off表示隐藏,便于根据需求调整查询结果的展示形式。
  • .mode column:设置查询结果的显示模式为列模式,使列左对齐,让查询结果更加整齐、易读。
  • .quit:退出SQLite命令行界面,结束与数据库的交互。
2. SQL语句操作(SQLite不区分大小写,语句以分号结尾)
  • 创建表:使用create table语句,语法为create table 表名(列名1 数据类型, 列名2 数据类型, 列名3 数据类型);。例如create table class1(id INTEGER, name TEXT, age INTEGER, score REAL);,创建了一个名为class1的表,包含id(整型)、name(字符串)、age(整型)、score(浮点型)列。
  • 数据插入:通过insert into语句插入数据,语法为insert into 表名 values(值1,值2,值3);。示例insert into class1 values(1, "zhangsan", 19, 88.5);,向class1表中插入了一行数据,id为1,name为“zhangsan”,age为19,score为88.5。
  • 数据查询
    • 查询所有列:使用select * from 表名;,如select * from class1;,会查询class1表中所有列的所有数据。
    • 查询指定列:语法为select 列名1,列名2,列名n from 表名;,例如select name, score from class1;,只查询class1表中的namescore列数据。
    • 条件查询:通过where子句添加条件,支持关系运算符(> < >= <= == !=)和逻辑运算符(and对应&&or对应||)。比如select * from class1 where score > 90 and age < 20;,查询class1表中score大于90且age小于20的数据。
    • 模糊查找(字符串):使用like关键字,%可模糊匹配多个字符,_只能模糊匹配一个字符。例如select * from 表名 where 列 like "%梅";,查询列中以“梅”结尾的所有数据;select * from 表名 where 列 like "_梅";,查询列中第二个字符是“梅”的所有数据。
    • 排序查询:通过order by子句排序,ASC表示升序(默认,可省略),DESC表示降序。如select * from class1 order by score ASC;,按score升序排列class1表数据;select * from class1 order by age DESC;,按age降序排列。
  • 数据删除:使用delete from语句,语法为delete from 表名 where 删除的条件;。示例delete from class1 where score < 80;,删除class1表中score小于80的数据。
  • 数据修改:通过update语句修改数据,语法为update 表名 set 列=新值 where 条件;。例如update class1 set score=100 where name="wanger";,将class1表中name为“wanger”的记录的score修改为100。
  • 删除表:使用drop table语句,语法为drop table 表名;,如drop table class1;,删除class1表(删除表会同时删除表中所有数据,请谨慎操作)。
  • 主键值自动增长列设置
    • 要求:主键值自动增长列必须是INTEGER类型;创建表时,需为该列添加PRIMARY KEY AUTOINCREMENT约束,示例create table class2(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, score REAL);,创建class2表,id列为主键且自动增长。
    • 插入数据:插入数据时,主键值自动增长列赋值为NULL,使其自动生成增长值,示例insert into class2 values(NULL, "张三", 90);id会自动生成合适的数值。
  • 时间相关操作
    • date("now");:获取当前的年 - 月 - 日格式的日期。
    • datetime("now", "+8 hours");:获取当前时间(考虑时区,这里加8小时),格式为年 - 月 - 日 时:分:秒。
3. 可视化工具
  • 安装:执行sudo apt - get install sqlitebrowser,安装SQLite的可视化工具sqlitebrowser,方便以图形界面的方式查看和操作数据库。
  • 使用:通过sqlitebrowser xxx.db命令,使用sqlitebrowser打开名为xxx.db的数据库文件,可在图形界面中进行表的创建、数据的增删改查等操作,更加直观便捷。
4. C/C++ API 接口
  • sqlite3_open:用于打开一个数据库文件。
    • 参数filename指定数据库名称(包含路径);ppDb是一个指针的指针,用于保存数据库句柄的指针地址,后续对该数据库的操作都通过这个句柄进行。
    • 返回值:成功时返回SQLITE_OK,失败则返回对应的错误码,可根据返回值判断数据库打开是否成功。
  • sqlite3_close:关闭已打开的数据库,释放相关资源,确保数据库操作完成后正确关闭,避免资源泄漏。
  • sqlite3_exec:执行SQL语句。
    • 参数pdb是数据库句柄;sql是要执行的SQL语句字符串;callback是执行select语句时调用的回调函数(用于处理查询结果);arg是传递给回调函数的参数;errmsg用于保存执行过程中的错误信息(若有)。
    • 返回值:成功返回SQLITE_OK,失败返回错误码。
  • 回调函数 int (*callback)(void*arg, int column, char**column_values, char**column_name);:在执行select语句时,每查询到一行数据就会调用一次该回调函数,用于处理查询得到的数据。
    • 参数argsqlite3_exec传递的arg参数;column表示查询到的数据的列数;column_values是指针数组,每个指针指向对应列数据的字符串;column_name是指针数组,每个指针指向对应列的列名。
    • 注意事项:回调函数成功执行必须返回0,否则会导致sqlite3_exec报错(如“sqlite3_exec error: query aborted”);从数据库查询出来的数据,无论原本是什么类型,在回调函数中都以字符串类型呈现;查询到几条数据,回调函数就会被执行几次。