当前位置:   article > 正文

3、Sqlite3的简单应用_sqlite3.exe

sqlite3.exe

什么叫数据,什么叫做数据库?
数据:能够输入计算机并能被计算机程序识别和处理的信息集合
数据库:数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集
Sqlite数据库是轻量级的,源码c,代码大小250KB,2TB大小。
windows用法
1、在路径位置的地方输入sqlite3.exe可以直接进入命令行终端,很方便
在这里插入图片描述

当然也可以设置环境变量的方式,使它在哪个路径都可以找到并且运行sqlite3.exe
(1)此电脑->属性->高级系统设置
(2)第四步是把sqlite.exe所在的位置添加到环境变量里边了(命令行终端重启才能生效)
在这里插入图片描述
注意:可以检查环境变量是否设置成功:echo %PATH%
2、虽然文件在d盘,在c盘也可以操作了
在这里插入图片描述

3、创建数据库的过程
(1)创建数据库liybc.db,这是第一步还不算成功(注意此处是还未进入数据库,在命令行终端下边进入,下边在linux系统下边的的截图正确,此处截图不正确
在这里插入图片描述
(2).tables 查找数据库中的表名字
.schema [表名] 查看表数据结构
产看一下没有表的数据库文件,此时就生成了
在这里插入图片描述
在这里插入图片描述

(3)create table userinfo(username,password)
在这里插入图片描述
(4)查询一下这张表里边有数据没有 ,发现没有数据userinfo是表名
在这里插入图片描述
(5)插入数据
在这里插入图片描述
(6)再次查询
在这里插入图片描述
(7)更新表的数据
update userinfo set password=456 where username=‘zmt111’;
如果没有条件限制语句where,则会把所有的密码都改为456(慎用)
![在这里插入图片描述](https://img-blog.csdnimg.cn/101844dd08734c639f3f44be9a9facd6.png在这里插入图片描述
(8)删除
delete from userinfo where username=‘zmt111’;
delete from userinfo;清空表,数据库删除之前最好要备份
删除了第二行
在这里插入图片描述
关于windows命令行终端命令
1、dir=ls
2、cd … 返回上一级目录
3、进入c d e: D:
4、进入文件夹: cd 文件夹名字

Ubuntu下操作数据库
1、本地安装 sudo dpkg -i *.deb
2、在线安装sudo apt-get install sqlite3
安装成功的标志
命令行终端:sqlite3
在这里插入图片描述

两种命令(以“.”开头命令,系统命令;以“;”结尾的命令)
系统命令:.help
.quit
.exit
.schema 查看表的结构图
在这里插入图片描述

sql命令:(以“;”结尾)
create table stu(id integer,name char,score Integer);
表名:stu
字段名 字段类型:id Integer,name char,score Integer

(1)创建数据库或者打开数据库
在这里插入图片描述

(2)创建表
create table stu(id Integer,name char,score Integer );
在这里插入图片描述

(3)向表格中插入数据(对于字符型数据,类型char和string都可以,所以真值” ” ’ ’都可以)
sqlite> insert into stu values (1001,‘zhangsan’,80);
sqlite> insert into stu values (1001, “zhangsan” ,80);

在这里插入图片描述

(4)查看表格中的数据
在这里插入图片描述

(5)部分插入
在这里插入图片描述

(6)部分查看
select * from stu;
select name,score from stu;
select name,score from stu where score=80 and or ;可以多个条件
在这里插入图片描述

(7)删除一条
delect * from stu;
delect name,score from stu;
delect name,score from stu where score=80 and or ;可以多个条件

(8)更新
update stu set name=‘wangwu’ where id=1001;将1001的名字改成wangwu
update stu set name=‘wangwu’,score = 88 where id=1001;

(9).databases 查看打开的数据库
在这里插入图片描述

.tables 查看当前数据库下有的表格
在这里插入图片描述

(9)插入一列
在这里插入图片描述

(10)删除一列(不支持)
.创建一张新的表
.删除原有的表
.将新的表名改成原有的表名
在这里插入图片描述

Sqlite3 API
(1)使用回调函数查询机制

   int sqlite3_exec(
    	  sqlite3* db,                                  /* An open database */
          const char *sql,                           /* SQL to be evaluated */
          int (*callback)(void*,int,char**,char**),  /* Callback function */
          void * arg,                             /* 1st argument to callback */
          char **errmsg                          /* Error msg written here */
     );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
功能:执行一条sql语句
  • 1
 参数:db 数据库的句柄指针
            sql  将要被执行sql语句
             callback 回调函数, 只有在查询语句时,才给回调函数传参
             arg  为callback 传参的
             errmsg 错误信息的地址
  返回值:成功 SQLITE_OK
         出错 errcode 错误码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
int (*callback)(void* arg ,int ncolumn ,char** f_value,char** f_name)
  • 1
 功能:得到查询结果,每找到一条记录自动执行一次回调函数
  • 1
参数:arg  为回调函数传递参数使用的
          ncolumn  记录中包含的字段的数目(也就是这个表中有多少列)
          f_value  包含每个字段值的指针数组(这个指针数组就可以得到一个结果数值)
          f_name   包含每个字段名称的指针数组(这个是是字段的名字) 返回值:成功 0,出错 非0
  • 1
  • 2
  • 3
  • 4

(2)不用回调函数的机制
上面介绍的 sqlite3_exec 是使用回调来执行 select 操作。还有一个方法可以直接查询而不需要回调。虽然回调显得代码整齐,但有时候你还是想要非回调的 select 查询。这可以通过 sqlite3_get_table 函数做到。

int sqlite3_get_table (sqlite3 *,   // 打开的数据库对象指针
                   const char * sql, // 要查询的 sql 语句
                   char *** resultp, // 查询结果
                   int * nrow,   // 查询出多少条记录(即查出多少行)
                   int * ncolumn, // 多少个字段(多少列)
                   char ** errmsg  // 错误信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

);

第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值
简单例子

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

#define DATABASE "stu.db"

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);
	   printf("xxxxx");

	}
	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;
	char sql[128] = {};
	int score;
	char* errmsg;

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

	printf("Update 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");
	}
	return 0;
}
int callback(void* para, int f_num, char** f_value, char** f_name)//字段数目,字段真值,字段名称
{
	printf(" 111111");
	int i = 0;
	for (i = 0; i < f_num; i++)
	{
		printf(" %s", f_value[i]);
	}
	putchar(10);//ascii中\n=10;所以是换行的意思

	return 0;
}
/*int do_query(sqlite3* db)
{	
	char sql[128] = {};
	char* errmsg;
	printf(sql,"select *  from stu;");
	if (sqlite3_exec(db, sql, callback , NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s\n", errmsg);
		

	}
	else
	{
		printf("Query done.\n");
	}
}*/
int do_query(sqlite3* db)
{
	char sql[128] = {};
	char* errmsg;
	char** resultp;
	int nrow;
	int ncloumn;
	int index;
	int i, j;

	sprintf(sql, "select *  from stu;");
	if (sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg)!=SQLITE_OK)//这个相当于开辟了一块空间在存储查询结果,所以要有空间的释放
	{
		printf("%s\n", errmsg);


	}

	index = 0;
	printf("%d\t", nrow);//4
	printf("%d\n", ncloumn);//2

	for ( i = 0; i < nrow+1; i++)
	{
		for (j = 0; j < ncloumn; j++)
		{
			printf("%-11s", resultp[index++]); // resultp[2]   
		}
		putchar(10);
		
	}
	printf("Query done.\n");
	return 0;
}


int main(int argc,const char *argv[])
{
	sqlite3 * db;//创建句柄
	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 Integer , name char,score Integer);",NULL,NULL,&errmsg)!=SQLITE_OK)
	{
		printf("%s\n",errmsg);

	}
	else
	{
		printf("create table and open success.\n");
	}

	while(1)
   {
	printf("************************************\n");
	printf("1:insert 2:delete 3:query 4:update 5:quit\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("err cmd");

		}
     }
	
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215

保存->编译->运行

gcc test.c -lsqlite3 -o test
./test
  • 1
  • 2

总结:
关于sqlite内datetime()和mysql的时间函数
sqlite3中 datetime()函数的使用

  datetime('now')          //这样会输出时间不正确 
  输出:2022-04-29  06:14:05
  datetime('now','localtime') // 这种是正确的
  输出:2022-04-29 14:14:09   
  看以看出差八个时区
  如果在命令行终端查看打印出来那么:
  select  datetime('now','localtime')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

mysql:思考mysql如何也输出这样的形式

select now();
2022-04-29 14:21:29
  • 1
  • 2

测试是否可以

select name from tb_user where mount ="beidou" and passwd ="bdic03";
输出:BDIC03
select name from tb_user where mount ="beidou" and passwd ="bdic03" and  expire >= now();
Empty set(0.00sec);    
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/492436
推荐阅读
相关标签
  

闽ICP备14008679号