SQlite3数据库相关相关命令

news2024/11/27 10:26:27

1)系统命令 以 ‘.’ 开头

.help 帮助手册
.exit  退出
.table  查看当前数据库的有的表格名
.databases 
.schema  查看表的结构属性

2)sql语句 以 ';'结尾

1. 创建表格

create table <table-name> (id integer, age integer, name char, score float);

2. 插入数据

insert into <table-name> values(1001, 15, zhangsan, 89);// 标准插入
insert into <table-name> values (id, age, name) values(1002, 18, lisi);//按列名插入

3. 查看数据库记录

select * from <table-name>; //查看全部
select * from <table-name> were age = 15;//按列名的信息 age=15 的查看
select * from <table-name> were age = 15 and name = lisi;//按多个列名的信息查看
select * from <table-name> were age = 15 or name = lisi;//age = 15 或 name = lisi满足一个条件就输出
select name, id from <table-name>;//指定字段查询
select * from <table-name> where score >= 90 and score <= 100;//查询score[90,100] 之间的信息

4. 删除信息

delete from <table-name> where id = 1005 and name = 'zhangsan';//删除id=1005和name=‘张三’的信息(同时满足)
delete from <table-name> where id = 1005 or name = 'zhangsan';//删除id=1005或name=‘张三’的信息(有一个条件满足就执行)

5. 更新数据

update <table-name> set name = 'wangwu' where id = 1002;//将id是1002的行信息中的name全部改成 'wangwu';

6. 增加一列

alter table <table-name> add column score float;//在<table-name>表名后面添加一列名: score属性为:float

7. 删除一列 (sqlite3 不支持直接删除一列)

1-- 创建一张新表
	create table <new-table-name> as select id, name, score from <table-name>;//从<table-name>表名中选择指定的列(id,name,score)为基础创建<new-table-name>新的表
2-- 删除原有的表
	drop table <table-name>;
3-- 将新表的名字改成原有的旧表的名字
	alter table <new-table-name> rename to <table-name>;//将<table-name>新表明改成<table-name>旧表明

3)sqlite3 数据库 C语言 API

1)打开数据库

   int sqlite3_open (
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
    );
    功能:打开数据库
    参数:filename  数据库名称
          ppdb      数据库句柄
    返回值:成功为0 SQLITE_OK ,出错 错误码

2)关闭数据库

 int sqlite3_close(sqlite3* db);
    功能:关闭数据库
    参数:
    返回值:成功为0 SQLITE_OK ,出错 错误码

3)错误信息

 const char *sqlite3_errmsg(sqlite3*db);
    功能:得到错误信息的描述

4)执行一条sql语句

   int sqlite3_exec(
   	    sqlite3* db,                                  /* An open database */
 	    const char *sql,                           /* SQL to be evaluated */
	    int (*callback)(void* arg,int,char**,char**),  /* Callback function */
 	    void * arg,                                    /* 1st argument to callback */
  		char **errmsg                              /* Error msg written here */
  );
  功能:执行一条sql语句
  参数:db  数据库句柄
        sql 		sql语句
        callback    回调函数,只有在查询时,才传参
        arg         为回调函数传递参数
        errmsg      错误消息
  返回值:成功 SQLITE_OK

5)查询回调函数

查询回调函数:
int (*callback)(void* arg,int ncolumns ,char** f_value,char** f_name),  /* Callback function */
功能:查询语句执行之后,会回调此函数
参数:arg   接收sqlite3_exec 传递来的参数
      ncolumns 列数
      f_value 列的值得地址
      f_name   列的名称
返回值:0

6)查询函数

int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);

功能:不需要回调函数的查询函数
参数:
	db  数据库句柄
	zSql 存放sqlite3的语句
	pazResult  存放表中的数据
	pnRow 行
	pnColumn 列
	pzErrmsg 错误信息

小知识:如果结构体中定义的是一级指针,那么你要定义变量取地址的形式,如果是二级指针函数,你要定义一级指针取地址的形式

学生信息实例

student.c

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

#define N 128
#define DATABASE "student.db"
int do_insert(sqlite3 *db);
int do_query(sqlite3 *db);
int do_query_1(sqlite3 *db);
int do_delete(sqlite3 *db);
int do_update(sqlite3 *db);

int main (int argc, char *argv[]) {
	sqlite3 *db;
	char *errmsg;
	int n;

	//打开SQlite数据库文件.db
	if (sqlite3_open(DATABASE, &db) != SQLITE_OK) 
		printf("%s\n", errmsg);
	else 
		printf("open DATABASE success.\n");

	//创建一张数据库的表格 stu
	if (sqlite3_exec(db, "create table stu(id integer, name char, sex char, score integer);", 
															NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("Create of open table success.\n");
	}
	
	while (1) {
		printf("************************************************\n");
		printf("1: insert  2:query  3: delete  4: update 5: quit\n");
		printf("************************************************\n");
		printf("Please select:");
		scanf("%d", &n);
		getchar();

		switch(n) {
		case 1:
			do_insert(db);//插入信息
			break;
		case 2:
			//do_query(db);//查询
			do_query_1(db);
			break;
		case 3:
			do_delete(db);//删除
			break;
		case 4:
			do_update(db);//更新
			break;
		case 5:
			printf("main exit.\n");
			sqlite3_close(db);
			exit(0);
			break;
		default:
			printf("Invalid data n.\n");
		}
	}
	return 0;
}

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

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

	printf("Input name: ");
	scanf("%s", name);
	getchar();//回收掉垃圾字符

	printf("Input sex: ");
	scanf("%c", &sex);

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

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

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

	return 0;
}

int callback(int* arg,int f_num ,char** f_value,char** f_name) {
	int i;

	for (i = 0; i < f_num; i++) {
		printf("%-8s", f_value[i]);
	}

	putchar(10);

	return 0;
}

int do_query(sqlite3 *db)
{
	char sql[N] = {};
	char *errmsg;

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

	if(sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK)
		printf("%s\n", errmsg);
	else 
		printf("Query done.\n");

	return 0;
}

int do_query_1(sqlite3 *db)
{
	char *errmsg;
	char ** resultp;
	int nrow;
	int ncolumn;

	if(sqlite3_get_table(db, "select * from stu", &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
		printf("%s\n", errmsg);
	else
		printf("query done.\n");

	int i = 0;
	int j = 0;
	int index = ncolumn;

	for(j = 0; j < ncolumn; j++)
	{
		printf("%-10s", resultp[j]);
	}
	putchar(10);

	for(i = 0; i < nrow; i++)
	{
		for(j = 0; j < ncolumn; j++)
		{
			printf("%-10s ", resultp[index++]);
		}
		putchar(10);
	}

	return 0;
}

int do_delete(sqlite3 *db)
{
	char sql[N] = {};
	char *errmsg;
	int id;

	printf("Invalid 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)
{
	char *errmsg;
	char sql[N] = {};
	char name[32] = "zhangsan";
	int id;

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

	sprintf(sql, "update stu set name = '%s' where id = %d;",name, id);

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

	return 0;
}

输出结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

夜深人静学32系列18——DMA+ADC单/多通道采集

夜深人静学32系列18——DMAADC单/多通道采集 DMA & ADC (理论篇)DMADMA框图DMA通道与外设对应表 ADC重要知识不同模式组合的作用 为什么要是用DMA ADC&#xff1f;DMA & ADC (实战篇)任务要求原理图CubeMX配置代码实现实验现象 很久没更新了&#xff0c;这次我们浅浅的…

MVSNet、PatchMatchNet环境配置、运行演示

文章目录 1 环境配置要求2 配置流程2.1 创建新环境mvs环境2.2 配置 PatchMatchNet环境3 程序运行演示1 环境配置要求 Ubuntu 18.04 python 3.7 , CUDA 10.1。 requirements.txt torch==1.4.0 torchvision==0.5.0 opencv-python numpy plyfile pillow tensorboard以上环境MV…

Docker 快速搞定 selenium grid 分布式测试

目录 前言&#xff1a; NO.1 搭环境 NO.2 写代码 NO.3 并发 感想 前言&#xff1a; Docker是一个流行的容器化平台&#xff0c;它可以帮助开发人员快速构建、部署和运行应用程序。Selenium Grid是一个用于分布式测试的工具&#xff0c;它可以并行执行多个测试用例&#xf…

做接口测试需要哪些技能、怎么做?

目录 1、什么是接口测试&#xff1f; 2、接口测试需要会什么&#xff1f; 3、如何学这些技能&#xff1f; 4、如何获取接口相关信息&#xff1f; 5、如何进行进行接口测试&#xff1f; 6、自动化接口测试 7、其他 1、什么是接口测试&#xff1f; 定义&#xff1a;测试系…

【ARM Coresight 系列文章 10 - ARM Coresight STM 介绍及使用】

文章目录 ARM System Trace MacrocellSTM FeaturesSTM 与 ETM/PTM的差异STM Master ARM System Trace Macrocell ARM 对STM 的解释是其支持高带宽的"仪器化输出"&#xff0c;仪器化输出其实也就是像 Cortex-M 系列中的 ITM 一样&#xff0c;通过将数据写入 STM 的 s…

(中等)LeetCode 328. 奇偶链表 Java

对于链表中有零个、一个、两个节点的情况&#xff0c;直接返回即可 对于链表的节点数大于两个的情况&#xff0c;需要讨论&#xff0c;看当前节点是第奇数个节点还是第偶数个节点 class Solution {public ListNode oddEvenList(ListNode head) {if (head null || head.next …

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin Glide预加载&#xff0c;加载到磁盘或者内存缓存&#xff0c;然后加载的图片只从缓存&#xff08;磁盘缓存或者内存缓存&#xff09;中取。 private val imageFile File("/storage/emulated/0/DCIM/Ca…

百科创建必看攻略!人物百度百科怎么创建?5分钟教会你创建人物百度百科词条

百度人物百科是一个广受欢迎的在线百科平台&#xff0c;它为用户提供了一个便捷的方式来了解各种各样的人物信息。如果你有一个人物的详细资料&#xff0c;你可以通过创建一个百度人物百科页面来分享这些信息。 下面是分媒互动分享的创建百度人物百科页面的步骤以及需要注意的几…

ConfigMap 补充 和 Secret

对于上一篇文章我们分享了为什么要使用 ConfigMap &#xff0c;我们创建 ConfigMap 的时候可以传入单个或者多个键值对&#xff0c;也可以传入文件&#xff0c;还分享了如何简单的传入 ConfigMap 里面的数据作为环境变量 我们补充一下使用 ConfigMap 一次性传递多个条目吧 一…

直击现场|Sui Builder House巴黎站倒计时0天

Sui Builder House下一站即将在法国巴黎举行&#xff0c;为世界各地的开发人员提供在这座被誉为“City of Light”的城市学习和交流的机会。 Sui Builder House将于7月18–19日在巴黎举行&#xff0c;这是展示Sui突破性技术的绝佳机会。在丹佛Builder House活动之后&#xff0c…

PCIe总线的链路训练

目录 概述 链路训练的目的 几个关键概念 Lane reveral &#xff1a; Polarity inversion&#xff1a; De-skew&#xff1a; link number&#xff1a; Lane number&#xff1a; Bit lock&#xff1a; Symbol lock&#xff1a; 几个特殊序列&#xff1a; TS1和TS2&am…

深度学习系列8——分类模型评估指标

1. 概述 1.1 分类 分类&#xff1a;标签为离散值。 回归&#xff1a;标签为连续值。 2. 混淆矩阵 二分类的混淆矩阵&#xff1a; TP 和 TN 为网络预测正确的部分&#xff0c;FP 和 FN 为网络预测错误的部分。 3. 二级指标 准确率&#xff1a; 针对模型的整体评估&#xf…

Java基础之复习笔记(上)

目录 一、Java是什么&#xff1f; &#x1f496;Java概念 &#x1f496;Java运行机制 二、Java的语言基础 &#x1f496;关键字 &#x1f496;基本数据类型 &#x1f496;运算符 三、Java逻辑控制 &#x1f496;分支结构 &#x1f496;循环结构 四、Java的方法 &#…

嵌入式基础知识-系统调度

系统调度是操作系统重要功能&#xff0c;在嵌入式开发&#xff0c;也要了解系统调度的基本原理。对于嵌入式Linux开发&#xff0c;一般使用多线程和多进程开发&#xff0c;对于运行RTOS的嵌入式系统&#xff0c;一般使用多任务开发。这些线程、进程、任务的调度&#xff0c;有许…

RS232转Profinet网关怎么设置

大家好&#xff0c;今天我要给大家带来一个很有意思的案例分享。你们猜猜&#xff0c;这回我们要用远创智控的一款神奇的网关YC-RSPN-002做什么呢&#xff1f;没错&#xff0c;我们要把一台扫码枪设备通过这个RS232转PROFINET网关&#xff0c;接入到一台西门子S7-1200PLC的Prof…

在这个高度自动化的时代,为什么自动化测试取代不了手功测试?

在这个高度自动化的时代&#xff0c;为什么自动化测试取代不了手功测试&#xff1f;06:1101自动化测试和手工测试的概念 自动化测试和手工测试都是软件测试的两种基本方法。 自动化测试是基于脚本或工具自动执行测试用例的过程。测试人员可以使用自动化测试工具来编写测试脚本…

【美团面试】软件测试面试题

一、设计登录界面测试用例 功能测试(Function test) 0. 什么都不输入&#xff0c;点击提交按钮&#xff0c;看提示信息。&#xff08;非空检查&#xff09; 1.输入正确的用户名和密码&#xff0c;点击提交按钮&#xff0c;验证是否能正确登录。&#xff08;正常输入&#xff0…

C语言 替换gets函数

目录 替换gets函数gets()用处gets()的危险之处gets()的几种替代方法一、用%c循环输入直到遇到换行结束二、用getchar()循环输入直到遇到换行结束三、scanf的另一种用法四、c中的getline()方法五、解决方案使用fgets代替 替换gets函数 gets()用处 gets从标准输入设备读字符串函…

noSQL的小练习

目录 Redis&#xff1a; 1、 string类型数据的命令操作&#xff1a; 2、 list类型数据的命令操作&#xff1a; 3、 hash类型数据的命令操作&#xff1a; MongoDB&#xff1a; 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若…

Redis分片集群有什么作用?怎样读取和存储信息

分片集群主要解决的是&#xff0c;海量数据存储的问题&#xff0c;集群中有多个master&#xff0c;每个master保存不同数据&#xff0c;并且还可以给每个master设置多个slave节点&#xff0c;就可以继续增大集群的高并发能力。同时每个master之间通过ping监测彼此健康状态&…