Linux系统编程-数据库-SQLite3

一、数据库基础概念

1. 什么是数据库?

数据库是一个应用程序,可以对数据进行存储、管理和统计,多和服务器搭配使用。

数据组织方式:

  • 数据以**表(table)**的形式组织在一起
  • 一张表可以分为多个记录(行)
  • 一条记录可以分为多个字段(列)

2. 数据库分类

规模 代表产品
大型 ORACLE
中型 MYSQL / MSSQL
小型(嵌入式) SQLite / DBII / powdb

以上都是关系型数据库

3. 常见名词

缩写 全称 含义
DB Database 数据库,select/update/database
DBMS Database Management System 数据库管理系统
MIS Management Information System 管理信息系统
OA Office Automation 办公自动化

4. SQLite3 简介

官网:www.sqlite.org / www.kernal.org(GNU 开源)

特点:

  1. 开源,C 语言开发
  2. 代码量少,1 万行左右,总大小 10M 以内
  3. 绿色软件,无需安装
  4. 文件型数据库 ,可以移动(整个数据库就是一个 .db 文件)
  5. 数据容量最大 2T

二、SQL 语言

SQL 是什么?

SQL(Structured Query Language):结构化查询语言,专门操作关系型数据库。

SQL 细分为三类:

分类 全称 作用 关键字
DDL Data Definition Language 建表、删表 CREATE DROP
DML Data Modify Language 增、删、改一行数据 INSERT DELETE UPDATE
DQL Data Query Language 查询数据 SELECT

三、数据库安装与启动

3.1 安装

cs 复制代码
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev    # C语言编程需要这个开发库

3.2 启动(打开/创建数据库)

cs 复制代码
sqlite3 aaa.db    # 打开aaa.db,不存在则自动创建

3.3 控制台常用指令(以 . 开头的是内置命令)

指令 功能
.database 列出当前库和系统中那个文件在关联
.tables 列出当前数据库中的所有表
.schema xxx 列出当前指定的 xxx 表结构
.headers on 查询数据的时候显示列名
.exit / .quit / .q 退出数据库控制台

四、SQL 语句详解

4.1 DDL --- 建表 / 删表

cs 复制代码
-- 建表语法
create table 表名 (字段名 类型, 字段名 类型, ...);

-- 示例
create table user(id int, name char, age int);

-- 删除一个表
drop table 表名;
drop table user;

常用数据类型:

类型 说明
int 整数
char / text 字符串
datetime 日期时间
INTEGER PRIMARY KEY ASC 自动增长主键

4.2 DML --- 插入数据

cs 复制代码
-- 插入语法(全部字段)
insert into 表名 values (值1, 值2, ...);

-- 插入语法(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2);

-- 示例
insert into user (id, age) values (1, 10);
insert into user values(3, "wang", 11);
insert into user (age) values (12);    -- 其他字段为NULL

4.3 DQL --- 查询数据

cs 复制代码
-- 查询语法
select 列名 from 表名 条件;

-- 查询所有列
select * from user;

-- 查询指定列
select id from user;

-- 带条件查询
select id, name from user where not age < 30;

通配符(用于模糊查询 LIKE):

cs 复制代码
-- 查名字是"张X"(张后面只有一个字)且 id < 5
select * from user where name like '张_' and id < 5;

-- 查名字以"张"开头且 id < 5
select * from user where name like '张%' and id < 5;

4.4 DML --- 修改数据

cs 复制代码
-- 修改语法
update 表名 set 字段名 = 值 [where 条件];

-- 示例
update user set id = 1 where name = 'li';
update user set id = 1 where name = "li" and passwd = "123";
update user set id = 2 where name = "li" or name = "zhao";

⚠️ 不加 where 条件会修改所有行!

4.5 DML --- 删除数据

cs 复制代码
-- 删除语法
delete from 表名 [where 条件];

-- 删除表中所有数据
delete from user;

-- 删除指定条件的数据
delete from user where id = 1;
delete from user where id = 1 and name = "zhang";
delete from user where id = 1 or id = 2;

4.6 高级用法

插入时间列:

cs 复制代码
-- 建表时加 datetime 类型
CREATE TABLE user1(id int, name char, age int, dt datetime);

-- 插入时用 datetime('now', '+8 hours') 获取北京时间
insert into user1 values(2, '张三', 23, datetime('now', '+8 hours'));

自动增长列(主键):

cs 复制代码
-- INTEGER PRIMARY KEY ASC 表示自动增长主键
CREATE TABLE user3(id INTEGER PRIMARY KEY ASC, name char, age int, dt datetime);

-- 插入时 id 填 NULL,数据库自动分配
insert into user3 values(NULL, '李四', 23, datetime('now'));

💡 PRIMARY KEY:主键,唯一性,如果用主键作为搜索条件,比普通字段块。


五、数据库导入导出

5.1 数据导出

cs 复制代码
sqlite3 xxx.db .dump > xxx.sql
# 将数据库名称为xxx的数据库整体导出到脚本中

5.2 数据导入

cs 复制代码
sqlite3 xxx.db < xxx.sql

六、C 语言操作 SQLite3

6.1 编程步骤

cs 复制代码
打开数据库 ==> 读写数据库(增、删、改、查)==> 关闭数据库

6.2 相关函数

3.1 打开数据库:sqlite3_open
cs 复制代码
int sqlite3_open(char *path, sqlite3 **db);
3.2 关闭数据库:sqlite3_close
cs 复制代码
int sqlite3_close(sqlite3 *db);
3.3 执行 SQL 语句:sqlite3_exec

📌 fun(回调函数):如果 sql 语句是查询操作(SELECT) ,需要这个函数来回收查询的结果;非查询操作填 NULL

获取错误信息

6.3 完整示例代码(增删改)

bash 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

int main(int argc, char **argv)
{
    sqlite3 *db = NULL;

    // 1. 打开数据库,获得数据的句柄(相当于linux中的文件描述符)
    int ret = sqlite3_open("aaa.db", &db);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "open db error  %s\n", sqlite3_errstr(ret));
        sqlite3_close(db);
        return 1;
    }

    char *errmsg = NULL;
    // 需要执行的sql语句,不要执行查询语句(select)
    char sql_cmd[512] = "insert into user values(7,'帅哥',20)";

    // 2. 执行sql语句(对数据库的读写)
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);   // 释放错误信息内存
        sqlite3_close(db);
        return 1;
    }

    // 3. 关闭数据,释放资源
    sqlite3_close(db);

    return 0;
}

6.4 编译方式

cs 复制代码
# 需要链接 sqlite3 库(-lsqlite3)
gcc xxx.c -o xxx -lsqlite3

七、总结速查表

相关推荐
路溪非溪2 小时前
wpa_supplicant核心操作总结
linux·网络·arm开发·驱动开发
不剪发的Tony老师2 小时前
SQLite Release 3.52.0发布,有哪些新功能?
数据库·sqlite
历程里程碑2 小时前
Linux 46 HTTPS(协议原理)安全通信全流程解析
linux·网络·c++·网络协议·http·https·排序算法
FreeBuf_2 小时前
利用eBPF与io_uring高级技术的Linux Rootkit演进
linux·运维·服务器
hy____1232 小时前
Linux_多线程
linux·服务器
Z1eaf_complete2 小时前
SQL注入绕过详解与防御机制
数据库·sql
fygfh.2 小时前
Linux开发中进程与线程的创建与生命周期
java·linux·服务器
chushiyunen2 小时前
django数据库配置
数据库·python·django
xiaomin-Michael2 小时前
WSR报告解读
数据库