什么叫数据,什么叫做数据库?
数据:能够输入计算机并能被计算机程序识别和处理的信息集合
数据库:数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合
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
(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);
(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;
(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 */
);
功能:执行一条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);