3、Sqlite3的简单应用

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

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

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

(3)create table userinfo(username,password)
在这里插入图片描述
(4)查询一下这张表里边有数据没有 ,发现没有数据userinfo是表名
在这里插入图片描述
(5)插入数据
在这里插入图片描述
(6)再次查询
3、Sqlite3的简单应用_第6张图片
(7)更新表的数据
update userinfo set password=456 where username=‘zmt111’;
如果没有条件限制语句where,则会把所有的密码都改为456(慎用)
![在这里插入图片描述](https://img-blog.csdnimg.cn/101844dd08734c639f3f44be9a9facd6.png3、Sqlite3的简单应用_第7张图片
(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
3、Sqlite3的简单应用_第8张图片

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

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

(1)创建数据库或者打开数据库
3、Sqlite3的简单应用_第9张图片

(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)查看表格中的数据
3、Sqlite3的简单应用_第10张图片

(5)部分插入
3、Sqlite3的简单应用_第11张图片

(6)部分查看
select * from stu;
select name,score from stu;
select name,score from stu where score=80 and or ;可以多个条件
3、Sqlite3的简单应用_第12张图片

(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)插入一列
3、Sqlite3的简单应用_第13张图片

(10)删除一列(不支持)
.创建一张新的表
.删除原有的表
.将新的表名改成原有的表名
3、Sqlite3的简单应用_第14张图片

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 */
     );
功能:执行一条sql语句
 参数:db 数据库的句柄指针
            sql  将要被执行sql语句
             callback 回调函数, 只有在查询语句时,才给回调函数传参
             arg  为callback 传参的
             errmsg 错误信息的地址
  返回值:成功 SQLITE_OK
         出错 errcode 错误码
int (*callback)(void* arg ,int ncolumn ,char** f_value,char** f_name)
 功能:得到查询结果,每找到一条记录自动执行一次回调函数
参数:arg  为回调函数传递参数使用的
          ncolumn  记录中包含的字段的数目(也就是这个表中有多少列)
          f_value  包含每个字段值的指针数组(这个指针数组就可以得到一个结果数值)
          f_name   包含每个字段名称的指针数组(这个是是字段的名字) 返回值:成功 0,出错 非0

(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  // 错误信息

);

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

#include
#include
#include

#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;
}

保存->编译->运行

gcc test.c -lsqlite3 -o test
./test

总结:
关于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')

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

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

测试是否可以

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);    

你可能感兴趣的:(计算机使用,sqlite,数据库,database)