sqlite3操作语句

sqlite3 关系型数据库,体积小。
特性:轻量级数据库,体积小,占用资源少,无需安装和管理配置。
缺点:不会进行严格的类型检查

多表联合查询:https://www.jianshu.com/p/053488e520e7

sqlite3基本命令:

创建数据库:sqlite3  student.db

(参考原文:https://blog.csdn.net/sinat_36184075/article/details/80587796

eg:
 创建一个公司员工信息表company,
 列包含:ID、姓名、年龄、地址、薪资
 sqlite> CREATE TABLE company(
 ...> id INT PRIMARY KEY NOT NULL,
 ...> name TEXT NOT NULL,
 ...> age INT NOT NULL,
 ...> address TEXT,
 ...> salary REAL NOT NULL);
 sqlite> .table       ---> '  .table  ' // 查看表的名字 .ta
 company
 sqlite> .schema      ---> '  .schema  ' // 查看创建表详细信息 .sc
 CREATE TABLE company(
 id INT PRIMARY KEY NOT NULL,
 name TEXT NOT NULL,
 age INT NOT NULL,
 address TEXT,
 salary REAL NOT NULL);
 '[约束]':
  PRIMARY KEY   // 主键约束,数据唯一,并且可以加快数据访问
  NOT NULL    // 非空,限制插入数据不能为空
 '类型关键字':
  INT  整型
  TEXT 文本字符串
  REAL 浮点数

以下参考原文:https://www.bilibili.com/video/av35056774/

	1-  系统命令
	     以 ‘ . ’开头的命令
	     .help   帮助
	     .quit    退出
	     .exit    退出
	     .schema    查看表结构
	     .databases    查看打开的数据库
	     .table     查看数据库中的表

	2- sql命令
	    基本sql命令不以 ' . ' 开头 , 以 ; 结尾

	    创建一张数据库表:   create  table  表名  (字段  类型) ;
			create  table  stu(id  Integer,  name  char,  score Integer) ;

	    插入一条记录:  insert  into  表名  values(数据)
			insert  into  stu  values  (1001,  'zhangsan',  80) ;	//全字段对应插入
			insert  into  stu  (id,  name)values(1002,  'wangwu') ;	//部分字段插入

	    查询记录:  select  字段  from  表名  where  限制条件 ;
	    	select  *  from  stu;	//查询表中所有字段的结果
	    	select  name,  score  from  stu;	//查询表中部分字段的结果

			select  *  from  stu  where  score = 80;
			select  *  from  stu  where  score = 80  and  name = 'zhangsan' ;
			select  *  from  stu  where  score = 80  or  name = 'wangwu' ;

	    删除一条记录:delete  from  表名  where  条件限制  ;
			delete  from  stu  where  score = 80 ;

	    更新一条记录:update  表名  set  修改的字段 = 修改后的值  where  条件限制 ;
			update  stu  set  name = 'lisi'  where  id = 1001 ;
			update  stu  set  name = 'wangwu',  score = 88  where  id  = 1002 ;

	    插入一列:alter  table  表名  add  column  字段名  类型  ;
			alter  table  stu  add  column  address  char ;

	    删除一列
	    sqlite3 不支持直接删除一列,采用以下步骤
		1-- 创建一张新表: create  table  新表名  as  select  字段  from  旧表名 ;
			create  table  stu1  as  select  id,  name,  score  from  stu ;

		2-- 删除旧表: drop  table  表名 ;
			drop  table  stu ;
		
		3-- 将新表名改为原有的旧表名:alter  table  表名  rename  to  新表名 ;
	     	alter  table  stu1 rename  stu ;


查询数据库时,也可以将多个表的内容放在一起进行查询
	select student.name from student, score where student.id = score.id and score.score < 60;
		上述语句中,from关键字后出现了两个表名student和score,表示对这两个表进行联合查询。    

可以使用表的别名以避免多次输入较长的表名,使代码更清晰
	select A.name from student A, score B where A.id = B.id and B.score < 60;
    		上述语句中,from关键字后的表名都指定了一个别名。

注意:别名只在当前语句中有效。    

sqlite3 API 接口

int  sqlite3_open (char *path,  sqlite **db);
	功能:打开sqlite数据库
	参数:	path:数据库路径
			db:指向数据库的句柄
	返回值:成功返回SQLITE_OK,失败返回错误码

int  sqlite3_close (sqlite *db);
	功能:关闭sqlite数据库
	返回值:成功返回SQLITE_OK,失败返回错误码

const char *sqlite3_errmg (sqlite3 *db);
	功能:通过db获取返回的错误信息
	返回值:错误信息的首地址

int sqlite3_exec(sqlite *db, const char *sql, int (*callback)(void *arg,  char **,  char  **), void *arg,  char **errmg);
	功能:执行一条sql语句
	参数:	db 数据库操作句柄
	        sql 一条sql语句
			callback 回调函数(只有sql为查询语句的时候才执行此语句)
			arg 表示给回调函数传参 
			errmsg 错误消息

int (*callback)(void *para,  int f_num,  char **f_values,  char  **f_name)
	功能:每找到一条记录自动执行一次回调函数
	参数:	para:传递给回调函数的参数
			f_num:记录中包含的字段数目
			f_values:包含每个字段值的指针数组
			f_name:包含每个字段名称的指针数组
	返回值:成功返回SQLITE_OK,失败返回-1

int sqlite3_get_table(sqlite3 *db,  const  char *sql,  char  ***resultp,  int  *nrow,  int  *ncolumn,  char **errmsg)
	参数:	db:句柄
			sql:sql语句
			resultp:存储查询到的结果,格式:全部字段名紧跟着每个为字段的值
			nrow :查询出多少记录,即行的数目
			ncolumn:字段数目,即列的数目
			errmsg:错误信息指针地址
	返回值:成功返回0,失败返回失败码

简单的sqlite3数据库操作程序(编译时链接库 -lsqlite3

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

#define DATABASE "sqlite_test.db"

int callback(void *para, int f_num, char **f_values, char **f_name)
{
    int i;

    for(i = 0; i < f_num; i++)
    {
        printf("%s:%-11s", f_name[i], f_values[i]);
    }
    printf("\n");
    
    return 0;
}

int do_insert(sqlite3 *db)
{
    int id;
    char name[32] = {};
    int score;
    char sql[128] = {};
    char *errmsg;

    printf("Input id:");
    scanf("%d", &id);
    getchar();

    printf("Input name:");
    scanf("%s", name);
    getchar();
    
    printf("Input score:");
    scanf("%d", &score);
    getchar();

    sprintf(sql, "insert into stu values(%d, '%s', %d);", id, name, score);

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }
    else
    {
        printf("insert done\n");
    }

    return 0;
}

int do_delete(sqlite3 *db)
{
    int id;
    char sql[128];
    char *errmsg;

    printf("Input id:");
    scanf("%d", &id);
    getchar();

    sprintf(sql, "delete from stu where id = %d;", id);

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }
    else
    {
        printf("delete done\n");
    }

    return 0;
}

int do_update(sqlite3 *db)
{
    int id;
    int score;
    char sql[128];
    char *errmsg;

    printf("input id:");
    scanf("%d", &id);
    getchar();

    printf("input score:");
    scanf("%d", &score);
    getchar();

    sprintf(sql, "update stu set score = %d where id = %d;", score, id);

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }
    else
    {
        printf("update done\n");
    }
}
/*
int do_query(sqlite3 *db)
{
    char sql[128] = {};
    char *errmsg;

    sprintf(sql, "select * from stu");

    if(sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }

    return 0;
}
*/
int do_query(sqlite3 *db)
{
    char sql[128] = {};
    char **resultp;
    int nrow;
    int ncolumn;
    char *errmsg;
    int i, j, k;

    sprintf(sql, "select id from stu");

    if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }

    for(i = 0; i < ncolumn; i++)
    {
        printf("%s\t", resultp[i]);
    }
    printf("\n");

    j = nrow;
    k = 1;
    while(j-- > 0)
    {
        for(i = k * ncolumn; i < (k + 1) * ncolumn; i++)
        {
            printf("%s\t", resultp[i]);
        }
        printf("\n");

        k++;
    }
}

int main()
{
    sqlite3 *db;
    char *sql;
    char *errmsg;
    int cmd;

    if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
    {
        printf("%s\n", sqlite3_errmsg(db));
        return -1;
    }
    else
    {
        printf("Open DATABASE success\n");
    }

    if(sqlite3_exec(db, "create table stu (id Int Primary key, name Text, score Int);", NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }
    else
    {
        printf("create or open success\n");
    }

    while(1)
    {
        printf("******************\n");
        printf("1:insert    2.delete    3.query     4.update    5.exit\n");
        printf("******************\n");

        printf("input CMD:");
        scanf("%d", &cmd);
        getchar();

        switch(cmd)
        {
            case 1:
                do_insert(db);
                break;
            case 2:
                do_delete(db);
                break;
            case 3:
                do_query(db);
                break;
            case 4:
                do_update(db);
                break;
            case 5:
                sqlite3_close(db);
                exit(0);
            default:
                printf("input Error\n");
        }
    }

    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值