Sqlite数据库

tech2024-11-17  6

数据库

Ø数据(**Data)

能够输入计算机并能被计算机程序识别和处理的信息集合

Ø数据库 (**Database) 

数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合

常用的数据库

Ø大型数据库

•Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。

•IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。

Ø中型数据库

•Server是微软开发的数据库产品,主要支持windows平台。

Ø小型数据库

•mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。

基于嵌入式的数据库

Ø基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB

ØFirebird是关系型数据库,功能强大,支持存储过程、SQL兼容等

ØSQLite关系型数据库,体积小,支持ACID事务

ØBerkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中

ØeXtremeDB是内存数据库,运行效率高

SQLite基础

ØSQLite**的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。**

ØSQLite**有以下特性:**

•零配置一无需安装和管理配置;

•储存在单一磁盘文件中的一个完整的数据库;

•数据库文件可以在不同字节顺序的机器间自由共享;

•支持数据库大小至2TB;

•足够小,全部源码大致3万行c代码,250KB;

•比目前流行的大多数数据库对数据的操作要快;

 

4安装方式

    1 本地安装 sudo dpkg -i *.deb

    2 在线安装

            apt-get update

            apt-get install sqlite3               ---》sqlite3数据库软件

            apt-get install libsqlite3-dev    ---》sqlite3数据库开发支持库

            apt-get install sqlite3-doc        ---》sqlite3数据库说明文档

                        说明文档安装在/usr/share/doc/sqlite3目录下,是html文件使用自带浏览器打开

sqlite基础

    1、大小写敏感性

            有个重点值得注意,SQlite一般情况下是不区分大小写。

    2、注释

            可以使用c风格的注释 /*   */

            sqlite注释  --

    3、数据类型

            数据类型是指定任何对象的数据类型的属性

            Sqlite使用一个普遍的动态数据类型系统。

            在sqlite中值的数据类型与值本身相关,而不是与他的容器相关。

    4、存储类

            每个存储在sqlite数据库中的值都具有以下存储类之一

            NULL:值也是NULL值

            INTEGER:值是一个带符号整数

            REAL:值是一个浮点值

            TEXT:值是一个文本字符串

            BLOB:值是一个blob数据,完全根据他的输入存储

 

sqlite3命令语句

创建数据库

 

语法

sqlite3   stu.db(如果未创建表, 数据库将不会生成)

在当前目录下创建一个stu.db数据库

 

系统命令

        以点开头的,称为点命令

 

.help   帮助信息,获取所有的点命令清单

.quit

.exit   结束程序

.table  查看当前数据库表格

.schema 查看表格的结构

    .schema 《表名》

.databases 显示当前打开的数据库文件

 

 

 

sql语句

    以分号结尾的是sql语句

    1、创建表

 

sqlite> create table 表名(字段名 类型,字段名 类型,字段名 类型,········);

例子:sqlite> create table stuinfo(id int,name char, age int, score float);

通过.table点命令查看表格

.schema stuinfo查看表格结构

 

    2、删除表

 

sqlite> drop table 要删除的表名

例如sqlite> drop table test2;

 

    3、插入一条记录

 

方式1:

    sqlite> INSERT INTO 表名 VALUES(数据,数据,数据,······);

    例子sqlite> INSERT INTO stuinfo VALUES(1001,"fawaikuangtu",18,88);

方式2:

    sqlite> INSERT INTO 表名(字段名,字段名,···) VALUES (数据,数据,····);

    例子sqlite> INSERT INTO stuinfo(id,name,score) VALUES (1003,"jiesi",12345);

 

让表格变得好看

.header on

.mode column

.timer on

设置后显示

id          name          age         score     

----------  ------------  ----------  ----------

1001        fawaikuangtu  18          88.0      

1002        geleifusi                 99.0      

1003        cuitesi                   12345.0   

1003        jiesi                     12345.0   

1003        jiesi                     12345.0   

1003        jiesi                     12345.0   

1003        jiesi                     12345.0   

Run Time: real 0.003 user 0.000079 sys 0.000268

 

4、查看数据库记录

 

//查看所有字段

sqlite> SELECT * FROM  表名;

例子sqlite> SELECT * FROM stuinfo ;

//按照条件

sqlite> SELECT * FROM 表名 WHERE 字段 =数值 /and/or ····;

sqlite> SELECT * FROM stuinfo WHERE score =12345;

sqlite> SELECT * FROM stuinfo WHERE score =12345 or id=1003;

sqlite> SELECT * FROM stuinfo WHERE score =12345 and id=1003;

//查询指定字段

sqlite> SELECT 字段 , 字段··· from 表名 ;

例子 sqlite> SELECT id,score FROM stuinfo ;

    sqlite> SELECT id,score FROM stuinfo WHERE score = 99;

    

//查看前n条记录

sqlite> SELECT * FROM stuinfo limit n;

sqlite> SELECT * FROM stuinfo limit 3;查看前三条

//从大到小排序

sqlite> SELECT * FROM stuinfo ORDER BY score DESC ;

 

5、更新一条记录

 

sqlite> UPDATE 表名 SET 更新字段=更新值 where 查找字段 = 查找值 ;

sqlite> UPDATE stuinfo SET age=20 where score = 6789 ;

 

6、删除一条记录

 

 

 

sqlite> DELETE FROM 表名 ;//清空表格中所有记录

sqlite> DELETE FROM 表名 WHERE 字段=数值 /and/or ····;

sqlite> DELETE FROM stuinfo WHERE id=1003;

 

7、设置主键

 

sqlite> create table stu(id int PRIMARY KEY,name char ,score float);

PRIMARY KEY 约束数据库表中记录是唯一标识

加入此标识后,该字段不能有重复数据

每个表中应该有一个主键,并且每一个表只能有一个主键

 

8、增加一列

 

sqlite> ALTER TABLE 表名 add COLUMN 字段 类型;

sqlite> ALTER TABLE stuinfo add COLUMN nu int;

 

 

SQLite3编程接口

API手册

    可以通过安装的手册,说明文档安装在/usr/share/doc/sqlite3目录下,是html文件使用自带浏览器打开

    也可以访问官网查看https://www.sqlite.org/index.html

1、打开数据库(存在就打开,不存在就创建)

 

#include <sqlite3.h>

int sqlite3_open(

  const char *filename,   /* Database filename (UTF-8) */

  sqlite3 **ppDb          /* OUT: SQLite db handle */

);

功能:打开或创建数据库

参数:

    const char *filename :数据库文件路径名

    sqlite3 **ppDb :指向sqlite句柄的指针

                    打开数据库后可以通过第二个参数的一级指针来操作数据库;

                    二级指针,定义一个一级指针,然后取地址传递给函数;

返回值:

    成功:返回0,SQLITE_OK

    失败:返回错误码(非零值)

示例

    sqlite3 * db = NULL;

    sqlite3_open("my.db",&db);

 

2、关闭数据库

 

int sqlite3_close(sqlite3*db);

功能:关闭数据库

返回值:

    成功0,SQLITE_OK

    失败:返回错误码(非零值)

sqlite3_close(db);

 

3、得到错误信息

一般放到打开数据库函数失败后面

 

const char *sqlite3_errmsg(sqlite3*db);

参数:

    sqlite3*db 句柄

返回值:

    返回错误码对应的文字说明 //类似malloc

例:

    fprintf(stderr,"打开数据库:%s",sqlite3_errmsg(db));

注意:

    void sqlite3_free(void *);

    sqlite3_errmsg返回的errmsg必须用此函数释放

        释放存放错误信息的内存空间

例:

    char * err  = sqlite3_errmsg(db);

    fprintf(stderr,"打开数据库:%s",err);        

    sqlite3_free(err);

 

 

4、编译:需要加 -lsqlite3 链接库

5、数据库操作

 

int sqlite3_exec(

  sqlite3*db,                                  /* An open database */

  const char *sql,                           /* SQL to be evaluated */

  int (*callback)(void*arg,int,char**,char**),  /* Callback function */

  void *arg,                                    /* 1st argument to callback */

  char **errmsg                              /* Error msg written here */

);

功能:执行一条sql语句

参数:

    sqlite3*db 数据库句柄

    const char *sql:sql语句

    callback:回调函数,只有在查询时采用

    void *arg:为回调函数传递参数

    char **errmsg:错误消息(需要定义一个char*的指针)

                这个可以直接用printf("%s",errmsg);打印

返回值:

    成功:SQLITE_OK

    失败:返回错误码

    

 

 

回调函数

 

int callback(void*para,int f_num,char**f_value,char**f_name)

功能:每找到一条记录,就会自动执行一次回调函数

参数:

    void*para:exec第四个参数 传递给回调函数的参数

    int f_num:表的列数。记录中 包含的字段数目,标识字段中有多少串(多少列)

    char**f_value:查询结果的指针数组。(包含每个字段的指针数组)

            f_value[0] = "1001"

            f_value[1] = "zhangsan"

            f_value[2] = "18"

            f_value[3] = "66"

    char**f_name:指向字段名的指针数组。

            f_name[0]  = "id"

            f_name[1]  = "name"

            f_name[2]  = "age"

            f_name[3]  = "score"

返回值:

    成功:0

    失败:-1

 

                                           

#include <stdio.h>                                                

#include <sqlite3.h>                                              

#include <string.h>                                               

                                                                  

#define DATABASE "my.db"                                     

                                                                  

static int callback(void*para,int f_num,char ** f_value,char ** f_name)

{                                                                 

    int i =-1,j=-1;                                               

    //打印传入的参数                                              

    printf("para:%s\n",(char*)para);                              

                                                                  

    //打印表头                                                    

    for(j=0;j<f_num;j++)                                          

        printf("%-15s",f_name[j]);                                

    putchar(10);                                                  

                                                                  

    //打印查询到的内容                                            

    for(i=0;i<f_num;i++){                                         

        if(!strncasecmp((char*)para,f_value[2],3))                

            printf("%-15s",f_value[i]);                           

    }                                                             

    putchar(10);                                                  

    return 0;                                                     

}                                                                 

                                                                  

                                                                  

                                                                  

int main(int argc, char **argv)                                   

{                                                                 

    sqlite3* db = NULL;                                           

    char *errmsg = NULL;                                          

                                                                  

    if(sqlite3_open(DATABASE,&db)!=SQLITE_OK){                    

        fprintf(stderr,"open %s\n",sqlite3_errmsg(db));           

        return -1;                                                

    }                                                             

    else {                                                        

        printf("数据库打开成功\n");                               

    }                                                             

                                                                  

    //创建一个表格                                                

    char * create_table =                                         

        "create table if not exists stu(id int,name char,sex char ,score int)";

        //如果表格不存在就创建                                    

    if(sqlite3_exec(db,create_table,NULL,NULL,&errmsg)!=SQLITE_OK){

        fprintf(stderr,"操作出错:%s",errmsg);                    

        sqlite3_close(db);                                        

        return -2;                                                

    }                                                             

    else{                                                         

        puts("创建或打开成功");                                   

    }                                                             

                                                                  

    //插入一条数据                                                

    if( sqlite3_exec(db,"insert into stu values(1001,'zhangsan','man',999)",

            NULL,NULL,&errmsg) != SQLITE_OK){                     

        fprintf(stderr,"open %s\n",sqlite3_errmsg(db));           

        sqlite3_close(db);                                        

        return -3;                                                

    }                                                             

    else{                                                         

        puts("插入成功");                                         

    }                                                             

                                                                  

                                                                  

    if(sqlite3_exec(db,"select * from stu;",callback,"man",&errmsg)!=SQLITE_OK){

        fprintf(stderr,"查询 %s\n",sqlite3_errmsg(db));           

        sqlite3_close(db);                                        

        return -3;                                                

    }                                                             

    else{                                                         

        puts("查询成功");                                         

    }                                                             

                                                                  

                                                                  

                                                                  

                                                                  

                                                                  

                                                                  

    sqlite3_close(db);                                            

    puts("关闭数据库");                                           

    return 0;                                                     

}                                                

 

 

不使用回调函数执行SQL语句

 

int sqlite3_get_table(

  sqlite3 *db,          /* An open database */

  const char *sql,     /* SQL to be evaluated */

  char ***pazResult,    /* Results of the query */

  int *pnRow,           /* Number of result rows written here */

  int *pnColumn,        /* Number of result columns written here */

  char **pzErrmsg       /* Error msg written here */

);

功能:执行sql语句

参数:

    sqlite3 *db:数据库句柄

    const char *sql:sql语句

    char ***pazResult用来指向 存放所有查询到的结果 的指针

            是一个 【((指针)数组)数组】

    int *pnRow:满足条件的个行数(条数)

    int *pnColumn:满足条件的字段(列数)

    char **pzErrmsg:错误信息的地址

返回值

        成功SQLITE_OK

        失败错误码

void sqlite3_free_table(char **result);

 

 

 

 

 

 

 

 

 

最新回复(0)