关于linux数据库编程——sqlite3

发布于:2025-09-04 ⋅ 阅读:(22) ⋅ 点赞:(0)

C 数组 
  链表    内存 程序已结束 数据消失 
  ---------------------------------
  文件    硬盘 永久存储设备 
  数据库  :数据的仓库 

一电子化的文件柜 :
数据库是“按照数据结构来组织、存储和管理数据的仓库”。
是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
二、关系型数据库:

关系模型数据的逻辑结构是一张二维表
*每一行是一个一个对象成员
*每一列是对象的一个属性
特点:    
1、每一列中的分量是类型相同的数据。 
2、列的顺序可以是任意的。
3、行的顺序可以是任意的。
4、表中的分量是不可再分割的最小数据项,即: 表中不允许有子表。  

关系数据库采用关系模型作为数据的组织方式
关系数据库因其严格的数学理论、使用简单灵活、数据独立性强等特点,而被公认为最有前途的一种数据库管理系统。

它目前已成为占据主导地位的数据库管理系统自 20 世纪 80 年代以来,作为商品推出的数据库管理系统几乎都是关系型的,例如:Oracle、Sybase 等。

三、常用数据库:

常用的数据库
常用的数据库有:
ORACLE、Mysql、SQL server、Access、 Sybase、SQLite 
1、ORACLE: //大型 
ORACLE 是甲骨文公司开发的一款数据库,
是一种适用于大型、中型和微型计算机的关系数据库管理系统,
它使用 SQL 语言作为它的数据库语言。

2、MySQL: //中小型 
MySQL 是一个开放源码的小型关系型数据库管理系统,
开发者为瑞典 MySQL AB 公司,92HeZu 网免费赠送 MySQL。
目前 MySQL 被广泛地应用在 Internet 上的中小型网站.
提供由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,
许多中小型网站为了降低网站总体拥有成本而选择了 MySQL 作为网站数据库。

3、SQL server: //微软的中型
真正的客户机/服务器体系结构。 微软 Microsoft 出品的一款数据库软件图形化用户界面,使系统管理和数据库管理更加直观/简单
具有很好的伸缩性,可跨越从运行 Windows 95/98 型电脑到运行 Windows 2000 的大型多处理器等多种平台使用。

4、Access:
Access 是由微软发布的关系数据库管理系统。
它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一
Access 是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的, 效率也很高. 但是它的同时访问客户端不能多于 4 个。
access 数据库有一定的极限,如果数据达到 100M 左右,很容易造成服务器 iis 假死,或者消耗掉服务器的内存导致服务器崩溃。

5、Sybase:
sybase 公司 1987 年推出了 Sybase 数据库产品
Sybase 主要有三种版本,
一是 UNIX 操作系统下运行的版本,
二是 Novell Netware 环境下运行的版本, 
三是 Windows NT 环境下运行的版本。

Windows NT:

Microsoft Windows NT(New Technology)是 Microsoft 在 1993 年推出的面向工作站、网络服务器和大型计算机的网络操作系统,也可做 PC 操作系统
Sybase 数据库特点:
1:基于客户/服务器体系结构的数据库。
2:它是真正开放的数据库 ,容易移植。
3:它是一种高性能的数据库。

四、sqlite3数据库介绍:

//学生的信息 
struct stu 
{
    int sno;
    char name[20];
    int age;
};

110   xiaoMing 20 

database
DBMS:    data base management system (数据库管理系统)

甲骨文 -- oracle 认证 

数据库
        sun / java 
        solaris  gnu
1、分类: 大型    中型    小型
         ORACLE   MYSQL/MSSQL   SQLITE  DBII powdb
        关系型数据库  : 数据存储典型的就是 表  //sqlite3     
        非关系型数据库: 类似json数据 键值对    //芒果db 
2、名词:
        DB        数据库 select update database
        DBMS    数据库管理系统
        MIS     管理信息系统
        OA      办公自动化
3、嵌入式数据库:
        sqlite3    www.sqlite.org  www.kernal.org
        
    GNU   
    特点:
          1、开源  C语言开发
          2、代码量少 1万行左右,总大小10M以内
          3、绿色软件无需安装
          4、文件型数据库,可以移动。
          5、数据容量最大 2T        

 1sqlite的介绍

A.sqlite的源代码是C,其源代码完全开放。sqlite第一个Alpha版本诞生于2000年5月。
他是一个轻量级的嵌入式数据库。
B.sqlite有一下特性

<1>零配置,无需安装和配置
<2>储存在单一磁盘文件中的一个完整的数据库
<3>数据库文件可以在不同字节顺序的机器间自由共享
<4>支持数据库大小之2TB
<5>足够小,全部源代码大致3万行C代码,250KB
<6>比目前流行的大多数数据库对数据的操作要快
          
          

          
2学习参考:
http://www.runoob.com/sqlite/sqlite-update.html

3安装:

whereis sqlite3
//安装 sqlite3 
4、sqlite3的安装: LTS long term support 
     1、在线安装 :
                //ubuntu能上网 
                sudo apt-get install sqlite3 
                sudo apt-get install libsqlite3-dev
                
                gcc test.c -lsqlite3 -lpthread
        
    2、验证是否安装成功:
        sqlite3 --version
        sqlite3 --help
        

    3.源码安装:
     a. ./configure   ---配置 编译 规则(makefile)
     b. make   //编译出 安装程序 
     c. make install 


4[简单使用:]
1.数据库

   sqlite3 小型嵌入式数据2.操作:
   [1] $sqlite3 <数据库文件名>
       //如果数据库文件不存在,则创建
       //存在则直接打开
   [2].获得帮助信息
     sqlite3> .help    //注: sqlite3 命令都是以 “.”开头
     
     sqlite3常用命令:
     //进入到sqlite3软件中之后,
     .help ---查看 sqlite3的支持的相关命令 
     .quit ---退出sqlite3 软件 
     .databases --- 查看当前关联的数据库文件 是哪个?


          
2增删改查 

sqlite3 --- 关系型数据库 
表格的结构
  姓名   性别   年龄    电话 
  xxx     x     xxx     xxx  xxx  //一条记录 
 
非关系型数据库:
   key=value; //键值对 
   name="xiaoMing"  //json的数据 


3SQL语言 (Structure Qurey Language)
   //结构化查询语言 -- 用在数据库的操作 
  增删改查

  增:
        创建表
        sqlite3>
        create table <表名> (字段1 数据类型,字段2,.....); 
        
        eg: 
           create table stu (sno,sname ,age);
           create table user (name,sex,age,tel);


           命令: sqlite3> .tables  //查看数据库中表有哪些
                  sqlite3> .schema   //查看表的结构
    

         sqlite3:相关命令
         .tables  //查看已经创建的表 
         .schema  //查看表的结构 --create语句 
         
         
       //插入数据 
       sql: //sql语句(structure qurey language) 需要以分号作为结束表示
         insert into <表名> values (110,'XiaoMing',18); 
      
        
         
        //查询信息  
        sql:
           select 列名  from 表名;
           select * from stu;
       命令:
          sqlite3> .headers on  //开启表头的显示
          sqlite3> .mode column //开启列模式(左对齐的方式显示)
   

        //按条件查询
    sql:
       select * from where <条件>;
       eg:
         //查看学生表中,年龄大于18岁人的信息
         select * from where age > 18;
         //查看学生表中,年龄大于18岁小于25岁的人的信息
         select * from where age > 18 and age < 25;
         
         SELECT column1, column2, columnN FROM table_name WHERE [condition]
          SELECT *  FROM table_name WHERE [condition] 
          
          //数值数据 
          //字符串形式 

    //删除命令
    sql:
        delete  from <表名> where <条件>; 

        eg:
         //删除学生表中的年龄等于18岁的人的信息
         delete from stu where age = 18;

4exe:
    创建学生信息表,
    添加信息
    查询信息
    删除信息
    
   熟悉相关sqlite3 操作命令
    .help
    .quit
    .headers on
    .mode column
    .tables
    .schema
    .databases
    
    sql:
    create
    insert 
    select
 
    
    增加:
      创建表    --create table 
      添加信息  --insert into 
    删除:
      删除一条信息--delete from 
      drop 
    修改:
      修改字段信息 update 
      添加字段     alter 
    查询:
       select  
    5、sqlite3的使用:
            0、启动sqlite3


            sqlite3 xxx.db  
            ===>用sqlite3 来打开一个名称为test.db的本地数据库。

            出现如下提示符:表明数据库管理系统启动。
            sqlite> 

              退出数据库: 
               .q 命令
            
            注意:如果一直出现如下符号:
            ...>   
            则写';'结束。

    以下所有命令必须在 sqlite> 后执行。

    创建一个数据库:
        1、touch  xxx.db
        2、sqlite3 xxx.db

    1、系统维护命令:===> .help
      

  出现所有相关的系统维护命令,都是以 "."开头。
        .database  列出当前库和系统中那个文件在关联
        .tables    列出当期数据库中的所有表
        .schema xxx 列出当前指定的xxx表结构
        .dump user   ===>导出数据库
        重定向
        sqlite3 test.db .dump > 123.sql
        sqlite3 xxx.db < test.sql ===>导入数据库

    2、标准SQL语句:===》通用语法在其他平台可以直接使用。struct query language;
        注意:所有的sql语句都以';'结尾。

        

  //创建一个表:ddl
        //sql语法:
            create table  表名 (表字段1 数据类型,表字段2 数据类型 ,...);
        eg: 
            create table user(id,name,age);         char 
        注意:
             以上表的表字段,支持如下数据类型。
             int 
             text ---文本 (字符串数据) 
             real ---浮点型 
             blob ---二进制 (图片)
             默认是text类型。
             char;
        create table 表名 (表字段 类型,表字段 类型,...);
        eg:
        create table user (id int  ,name char,age int);

        //删除一个表:
        //sql语法:
            drop table  表名;
        eg:
            drop table user;
       数据库常规操作: 增加 删除 修改 查询
       
       
       //插入数据时,某些字段,不给值 
       NULL --- 
       sql 语句--- 空 
       c语言中区分 --- NULL(空指针) //define NULL (void *)0 
       //向表中增加数据:
       //sql语法:
       insert into 表名 (字段名称 ) values (值名称);
       eg:
           insert into user (id,age) values (1,10);
           insert into user values(3,"wang",11);
           insert into user (age) values ( 12);
           
        
       //插入数据写法:
       //全部插入 
       insert into 表名 values(所有字段对应值); //如果某些字段,不想给值,可以写成NULL(空值)
       
       //部分插入 
       insert into 表名(指定字段) values(指定字段对应值);
                    
        

       //查询表中的数据:
       //sql语法:
           select 列名 from 表名  条件;
       eg:
          //方式1:  查询所有信息 
           select * from user ;  //打印表中所有信息 
           //方式2: 查询指定字段的信息
           select id from user;
           select id,name from user where not  age <30
           
           //方式3: 查询指定条件的信息 
           //where条件 (子句)
           where name   like '三一'   % _
                                                                   asc
           select *from user where age>20 or age<50 order by age desc limit 2 ;
           
           //&&  ||   c语言的写法 
           
           
           例子:
             登录一个网站的时候 
             
             用户名 
             密码
             select * from user where name=用户名 and passwd=密码; 
             


用户名:tom 
密  码:123456 
用户名 和 密码 查询了一下                  
select * from user where name=用户名 and passwd=密码;  

        
           
练习:
    用学生这个表,进行条件查询!           
                      
       //修改表中数据:
       //更新
       update 表名 set 表字段 = 值  满足条件:
       eg: 
       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";

     
       删除表中数据:
       delete from 表名  满足条件:
       eg:delete from user ;  ///删除表中所有数据
              delete from user where id  = 1; ///删除id=1 的数据;
           delete from user where id =1 and name = "zhang";
           delete from user where id = 1 or id  = 2;
         
    >2018-1-1 and <2018-12-31
    
    增 ---creat / insert 
    删 ---drop  / delete 
    改 ---alter / update
    查 ---.table(.schema)/select     
    
    
练习:
    新建一个mydb.db数据库,并在库中新建一个student表
    至少不能少3个字段,依次录入5条记录删除其中第一条和
    倒数第二条记录
    
    


6、补充:

6.1插入时间列


    unicode
    CREATE TABLE user1(id int,name char,age int,dt datetime);
eg:
    insert into user1 values (2,'张三',23,datetime('now','+8 hours')); //utc

6.自动增长列 
    
    create table user5 (id INTEGER PRIMARY KEY ASC,name char, age int);  
    //int 需要写成 INTEGER 才能实现自动增长 
    create table user4 (id int   PRIMARY KEY ASC,name char, age int);

    sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime);
    sqlite> insert into user3 (NULL,'李四',23,datetime('now'));


6.3主键: 编号作为主键 
    
    asc  -- 升序 
    desc -- 降序

    where (group by having) order by [desc] limit;
    select * from user where id<10 order by id limit 2;  


6.4其他

[维护命令]:
1、数据的导出:
        sqlite3 xxx.db .dump > xxx.sql
    //将数据库名称为xxx的数据库整体导出到脚本中。

2、数据的导入:
        sqlite3 xxx.db < xxx.sql

3、可视化工具安装:
    sudo apt-get install sqliteman 
    
    NavicatSqlite3  --- windows下 //图形化的操作工具 

   
7编程层面 进行操作?

 APIs (application program interface) --- 编程接口 --函数 
==================================================
sqlite3 数据库编程接口:

1、需要的头文件
        sqlite3.h

2、编译过程
        -lsqlite3

3、编程框架:
打开数据库 ==》读写数据库(增,删,改,查) ==》关闭数据库

sqlite3.h

类比:
  FILE *fp = fopen------->hello.c 
  编程:
    fp 代表就是hello.c 
  sqlite3 ** db qlite3_open ------------>user.db     
3.1 打开数据库: sqlite3_open      

 int sqlite3_open(
          const char *filename,   /* in: Database filename (UTF-8) */
          sqlite3 **ppDb          /* OUT: SQLite db handle */ //句柄 
         );
    sqlite3 * db;
    int sqlite3_open(char * path,sqlite3 ** db);
    功能:
          打开指定path路径+文件名称的数据库,并将
          打开的地址指向db变量的句柄。
    参数:path 要打开的数据库路径+名称
          db   要打开的数据库地址指针
    返回值:
           成功  0
           失败  -1;

   sqlite3* * db  //某个指针变量的地址
   
   注意:
        数据库文件 不存在时,此时 sqlite3_open 会创建该数据库文件 
        如果数据库文件存在,此时,sqlite3_open 默认打开该文件 
        
        
        sudo apt-get install libsqlite3-dev //解决头文件包含出错的问题

3.2 关闭数据库: sqlite3_close

 int sqlite3_close(sqlite3 *db);
    功能:关闭指定的数据库
    参数:要关闭的数据库地址
    返回值:成功  0
            失败  -1;

//增 删 改 查 
//sql 语句 ---执行sql语句,从而影响到数据文件的内容 


3.3 数据库操作:
 

   查询操作:sqlite3_get_table();  ////select 

    int sqlite3_get_table(sqlite3 *db,
                          char *sql,
                          char *** rest, //&p ---> char ** * 
                          int *nrow,
                          int *ncol,
                          char ** errmsg);
                          
                          
    char *a[10] = {};

    a ---> char **      
    
    char **p = a; 
    
    
    char *array[] = {"hello","world"};
    
    
    arrary => char **


    char **p = arrary; 
    
     sqlite3_get_table(sqlite3 *db,
                          char *sql,
                           &p, //&p ---> char ** * 
                          int *nrow,
                          int *ncol,
                          char ** errmsg);

    功能:在db数据库上执行sql查询语句,并将执行的
          结果集返回到rest地址上,同时返回查询的行和列。
    参数:db 要执行查询语句的数据库
          sql  要执行的select查询语句
          rest 查询的结果集是一个三级指针//用来保存 结果的字符串 指针数组的首地址 
          nrow 查询的结果的行数  //保存结果的行数 
          ncol 查询的结果的列数  //保存结果的列数 
          errmsg 如果执行有错误,则存储错误。
    返回值:成功 0
            失败 非0;

    执行sql语句:
    sqlite3_exec();   ////insert delete update

    char *errmsg;
    int sqlite3_exec(sqlite3 *db,
                    char *sql,
                    callback fun,  //回调函数 -- select 
                    void * arg,    //回调函数 第一个参数 
                    char ** errmsg);

    功能:在db数据库上执行sql 非查询语句。
          并将结果返回。
    参数:db 要执行sql的数据库
          sql  要执行的非查询sql语句。
          fun  如果该函数要执行查询语句,则该回调函数
                 用来回收查询的结果。
          arg  回调函数的参数,如果没有回调函数则该参数为NULL;
          errmsg  执行过程中的错误信息。
    返回值:
            执行成功  0
            失败  非0 ;

    int fun(void *arg ,
            int f_num,
            char ** f_value,
            char ** f_name)
    
    功能:该函数用于sqlite3_exec执行select语句的
          结果集返回数据。
    参数:arg     由sqlite3_exec传入的参数
          f_num   执行该命令所返回测结果集的字段个数。
          f_value 查询结果集中的字段的值。
          f_name  查询结果集中的字段的名称。
    返回值:
            成功 0
            失败 非0
    注意:该回调函数必须有返回值,否则可能导致查询异常。
    
    
    
    
    char *value[] = {"1","A","14","2","B","15",NULL};
    char *name [] = {"id","name","age",NULL};
    
    
    
    [name ]->{"id","name","age",NULL}
    [info1]->{"1","A","14"}
    [info2]->{"2","B","15"}
    [info3]-> NULL
    
   

sqlite3_errmsg() //出错信息

练习:1创建一个学生表,最少不能低于3个字段
      最好有一个唯一主键,
      设计程序以代码方式,依次输入5个学生信息
      并存储到数据库中,最终查询显示所有学习信息。

      id(主键,自动),name,age,addr,datetime,recommand;
      
      至少插入5条记录。
      
      修改3处。
      
      删除2条记录。

信息系统:
请输入学生信息:
name : 
sno : 
score: 

    
练习:给数据库表添加主键:
1、sqliteman 设计表过程中选择 ;PK INTER
2、SQL 语句:
   create table user(id int primary key,name text);
    
    新建表
    create table stu_info(id int ,name char ,age int ,phone char ,email char,qq char);
    增加记录
    insert into stu_info values (2,'关二哥',55,'13011112222','gauanerge@163.com','8888888');
    查询记录
    select * from stu_info;
    修改记录
    update stu_info set age = 56
    where id = 2;
    删除
    delete from stu_info where id = 2;
    
    select*from 表明  where
    从句where 
    
    (id int,name char,age int,kind int,salary real);
    
    
    insert into person values(9,'周瑜',39,3,3638.20);
    
    
sqlite3 操作的基本思路:
sqlite3_open 
sqlite3_errmsg(db)
sqlite3_close(db);
sqlite3_exec
sqlite3_free(*) //sqlite3_malloc 
sqlite3_get_table //sqlite3_free_table 配套


sqlite3_exec  //在select时 需要回调来打印结果 
sqlite3_get_table //在select时,不需要回调 
sqlite3_free_table //注意,sqlite3_get_table 如果select有查询结果 
                   //需要,使用sqlite3_free_table 来释放 堆区空间  

练习:查字典 
book  --- 通过查数据库 输出解释 
自动增长列 word explain 时间 
 
sqlite3_open 
sqlite3_exec / sqlite3_get_table 
 


网站公告

今日签到

点亮在社区的每一天
去签到