数据库编程

目录

[1. 数据库概述](#1. 数据库概述)

2.分类:

[3. SQLite数据库的安装(Linux环境)](#3. SQLite数据库的安装(Linux环境))

[4. 运行sqlite3软件​编辑](#4. 运行sqlite3软件编辑)

[5. SQLite基本操作](#5. SQLite基本操作)

[6. SQL核心操作](#6. SQL核心操作)

[7. SQLite编程接口(C语言)](#7. SQLite编程接口(C语言))

[8. 应用场景](#8. 应用场景)


数据库是一种用于集中存储、高效统计及规范化管理数据(包含新增、查询、修改、删除等操作)的系统。其核心价值在于解决数据分散存储、管理效率低、一致性差的问题,不仅适用于服务器级别的业务系统,也能部署在智能手环、智能家居等嵌入式设备中,实现本地数据的轻量化管理。

1. 数据库概述

本质:一种高效对大批量数据做管理(如增删改查操作)的软件。

管理对象:上百万,上亿的数据

机制:运用了高效的算法和结构

与传统存储方式的对比

  • 内存存储(链表、数组):数据存于内存,掉电丢失

  • 文件存储:数据存于磁盘,掉电不丢失

  • 数据库存储:结合磁盘持久化与高效管理机制,支持结构化存储和复杂查询

学习目标:在本地布局小数据库

2.分类:

关系型数据库

Oracle

Mysql

SQLServer

SQLite------所有数据库支持:SQL编程语言

非关系型数据库

Redit

3. SQLite数据库的安装(Linux环境)

  1. 虚拟机网络连通: ping 8.8.8.8

  2. apt-get工具集配置成功

  3. 安装SQLite及相关工具

sudo apt-get install sqlite3 ------装软件

sudo apt-get install libsqlite3-dev------安装开发依赖库

sudo apt-get install sqlitebrowser------装可视化软件(Windows中常用Navicat)

4. 运行sqlite3软件

5. SQLite基本操作

SQL类型

  1. INTEGER 整型

  2. REAL 实型

  3. TEXT 文本类型

常用命令

  • .database:查看当前连接的数据库文件路径(查看数据库中的表信息)

  • .tables:列出所有表

  • .schema 表名:查看表结构

  • .quit/.exit:退出SQLite环境

  • .header(s)ON OFF :开启/关闭头部显示

  • .mode MODE : 设置数据的显示格式

    CSV

    column

    html

    insert

    line

    list

    tabs

    tcl

  • .schema ?TABLE?: 显示创建表时的格式

注意:SQL 语句是操作数据库的标准语言,在 SQLite 中需以分号结尾

6. SQL核心操作

数据操作语言(DML)

  • 创建表:create table

    CREATE TABLE 表名称
    {
    列名称1 数据类型,
    列名称2 数据类型,
    列名称3 数据类型,
    }

示例

cpp 复制代码
CREATE TABLE  if not exists student(
   学号 INTEGER PRIMARY KEY,
   姓名 TEXT,
   性别 TEXT,
   年龄 INTEGER,
   成绩 INTEGER
);
  • 插入数据------INSERT INTO

    复制代码
    INSERT INTO 表名称 VALUES (值1, 值2,....)
    
    INSERT INTO student VALUES(1, '张三', '男', 18, 90);
    insert into student values (1002, "李四", "女", 13, 80);
    insert into student (学号,姓名,性别) values (1009, "熊大", "男");
  • 删除表------ drop table(需谨慎操作,数据将被清空)

    drop table 表名称;
    drop table student;

  • 删除表元素------delete from

    DELETE FROM 表名称 WHERE 列名称 = 值
    delete from student where 姓名 = "赵五";

  • 更新数据(添加功能)------update

    复制代码
    UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
    
    UPDATE student SET 年龄=16, 成绩=85 WHERE 姓名="熊大";
    update student set 年龄=16,成绩=85 where 姓名="熊大";
  • 查询数据------select

    复制代码
    SELECT 列名称 FROM 表名称
    
    SELECT 学号, 姓名 FROM student WHERE 成绩 > 60 ORDER BY 成绩 DESC;
    select * from student;
    select 学号,成绩 from student;
    select 姓名 from student where 成绩<60 and 性别="男";
    select 姓名 from student where 姓名 like "%田%";
    
    模糊查询(使用LIKE操作符):
    通过通配符匹配字符串,常用通配符包括:
    _:代表一个任意字符;
    %:代表任意多个任意字符;
  • 排序------order by

多表联合查询

复制代码
//cross join 
select 学生信息.姓名 as 姓名, 学生课程.名称 as 课程 from 学生信息 cross join
学生课程;

//inner join 
select 学生信息.姓名 as 姓名, 学生成绩.成绩 as 成绩 from 学生信息 inner join
学生成绩 on 学生信息.学号 = 学生成绩.学号;

//outer join 
select 学生信息.姓名 as 姓名, 学生成绩.成绩 as 成绩 from 学生信息 left outer
join 学生成绩 on 学生信息.学号 = 学生成绩.学号;

//三表联合查询
select 学生信息.姓名 as 姓名, 学生课程.名称 as 课程, 学生成绩.成绩 as 成绩
from 学生信息
left outer join 学生成绩 on 学生信息.学号 = 学生成绩.学号
left outer join 学生课程 on 学生成绩.课程编号 = 学生课程.编号
where 成绩 > 60
order by 成绩 desc;

7. SQLite编程接口(C语言)

通过 C 语言操作 SQLite 的核心流程为:

sqlite3_open------打开数据库

原型: int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能:
打开数据库获得操作数据库的句柄
参数:
filename:打开文件的路径
ppDb:存放数据库句柄空间的首地址
返回值:
成功返回SQLITE_OK
失败返回错误码,可以通过sqlite3_errmsg 来获得其对应的英文描述
sqlite3_errmsg[功能类似 perror]
原型:const char *sqlite3_errmsg(sqlite3*);
功能:
传入sqlite3 的句柄,返回句柄出错的英文字符串

sqlite3_exec------执行 SQL 语句
原型:int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
原型:int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* lst argument to callback */
char **errmsg /* Error msg written here */
);
功能:
执行一条SQL语句
参数:
数据库句柄
要执行的sql语句
callback:只有 select 才会用到,执行找到匹配的数据后的操作
对callback 回调函数的传参
errmsg:存放出错字符串空间的首地址
返回值:
成功返回SQLITE_OK
失败返回错误码
void sqlite3_free(void*);
功能:
释放申请的空间

sqlite3_close------关闭数据库
原型:int sqlite3_close(sqlite3*);
功能:
关闭sqlite3 连接句柄

复制代码
int sqlite3_open(const char *filename, sqlite3 **ppDb);  // 打开数据库
int sqlite3_exec(sqlite3*, const char *sql, callback, void*, char **errmsg);  // 执行SQL
void sqlite3_close(sqlite3*);  // 关闭连接

示例

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

typedef struct student 
{
    char name[32];
    char sex[4];
    int age;
    int score;
}stu_t;

/***************************************************
 * 注意:该回调函数可能多次被执行,每找到一条符合条件的数据就会执行一次回调函数
 * 
 * parg:回调函数的参数,可以通过sqlite3_exec第4个参数传递
 * columno:select命令生成新表的列数
 * pcontents:所有列数据字符串的指针数组名
 * pheaders:所有列名称字符串的指针数组名
 ***************************************************/
int pcallbackfun(void *parg, int columno, char **pcontents, char **pheaders)
{   
    int i = 0;

    printf("=========================\n");
    for (i = 0; i < columno; i++)
    {
        printf("%s:%s\n", pheaders[i], pcontents[i]);
    }
    printf("=========================\n");

    return 0;
}

int main(void)
{
    sqlite3 *pdb = NULL;
    int ret = 0;
    int i = 0;
    char cmdbuf[1024] = {0};
    char *perrmsg = NULL;
    stu_t s[4] = {
        {"张三", "男", 16, 50},
        {"李四", "女", 15, 80},
        {"王二", "男", 14, 80},
        {"赵五", "女", 13, 60},
    };

    ret = sqlite3_open("student.db", &pdb);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "fail to sqlite3_open:%s\n", sqlite3_errmsg(pdb));
        return -1;
    }

    sprintf(cmdbuf, "create table if not exists student (id integer primary key asc, name text, sex text, age integer, score integer);");
    ret = sqlite3_exec(pdb, cmdbuf, NULL, NULL, &perrmsg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "fail to sqlite3_exec:%s\n", perrmsg);
        sqlite3_free(perrmsg);
        sqlite3_close(pdb);
        return -1;
    }

#if 0
    for (i = 0; i < 4; i++)
    {
        sprintf(cmdbuf, "insert into student values(NULL, \"%s\", \"%s\", %d, %d);", s[i].name, s[i].sex, s[i].age, s[i].score);
        ret = sqlite3_exec(pdb, cmdbuf, NULL, NULL, &perrmsg);
        if (ret != SQLITE_OK)
        {
            fprintf(stderr, "fail to sqlite3_exec:%s\n", perrmsg);
            sqlite3_free(perrmsg);
            sqlite3_close(pdb);
            return -1;
        }
    }
#endif

    sprintf(cmdbuf, "select name,score from student;");
    ret = sqlite3_exec(pdb, cmdbuf, pcallbackfun, NULL, &perrmsg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "fail to sqlite3_exec:%s\n", perrmsg);
        sqlite3_free(perrmsg);
        sqlite3_close(pdb);
        return -1;
    }

    sqlite3_close(pdb);

    return 0;
}

注意 :编译时加上库链接

8. 应用场景

SQLite特别适合以下场景:

  • 移动应用(Android/iOS本地存储)

  • 嵌入式设备(智能家居、工业控制器)

  • 小型工具软件(本地笔记、轻量级管理系统)

其核心优势包括:

  • 单文件存储,便于迁移

  • 无需服务器,零配置

  • 支持标准SQL语法

  • 跨平台兼容性强

相关推荐
吾诺2 小时前
【MySQL 的数据目录】
数据库·mysql·adb
拍客圈2 小时前
在 Discuz! 后台设置 SEO 参数(如标题、关键词、描述)后无法保存
服务器·数据库·php
_OP_CHEN2 小时前
【MySQL数据库基础】(五)MySQL 数据类型深度解析:选对类型 = 性能拉满!
linux·开发语言·数据库·sql·mysql·数据类型·c/c++
J.Kuchiki2 小时前
【PostgreSQL内核学习:修复 WindowAgg Run Condition 判断逻辑错误的优化】
数据库·学习·postgresql
chuxinweihui2 小时前
MySQL复合查询
数据库·mysql
被AI抢饭碗的人2 小时前
MYSQL基础(二)
数据库·mysql
优秀的老黄2 小时前
MySQL配置从库
linux·数据库·mysql
修行者Java2 小时前
(六)从“缓存混乱难管控”到“Redis高效赋能”——Redis实战进阶指南
数据库·redis·缓存
onebyte8bits2 小时前
NestJS 系列教程(十五):缓存体系设计 —— Redis、接口缓存与缓存三大问题解决方案
数据库·redis·后端·缓存·nestjs