赞
踩
什么叫数据,什么叫做数据库?
数据:能够输入计算机并能被计算机程序识别和处理的信息集合
数据库:数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合
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 */
);
功能:执行一条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<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; }
保存->编译->运行
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);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。