MySQL小试——数据库检索小案例

3 篇文章 0 订阅
/*********
代码功能:
建立一个简单数据库并进行检索。
数据库字段分别为:a(int), b(int), res(int)。
其中特征1: b = a + 1, 特征2: res = a + b。
数据库检索:用户随意输入一个整数a,检索其放入数据库得到的特征res值
与数据库中已存的res值相差不超过5的结果并打印输出。

可改进之处:
设置超参数,决定检索的数据是否放入数据库中。
如果直接放入数据库中,打印结果并存放相关数据内容到数据库中,否则只打印相差结果。
**********/


#include<iostream>
#include<mysql.h>
#include<string>

using namespace std;

const string TABLE_NAME = "test";//表名

MYSQL mysql;
MYSQL_RES *res; //这个结构代表返回行的一个查询结果集

bool ConnectDatabase()
{
	//初始化mysql  
	mysql_init(&mysql);  //连接mysql,数据库  //初始化一个MySQL结构
	const char host[] = "localhost"; //主机名
	const char user[] = "root"; //用户名
	const char psw[] = "123456";
	const char db[] = "video"; //数据库名
	const int port = 3306; //端口名
	//返回false则连接失败,返回true则连接成功  
	if (!(mysql_real_connect(&mysql, host, user, psw, db, port, NULL, 0)))
		//中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去  
		return false;
	else
		return true;
}
void FreeConnect()//释放资源并关闭数据库连接
{
	mysql_free_result(res);
	mysql_close(&mysql);
}

int get_b(int a)//获取特征1:b
{
	return a + 1;
}

int get_res(int a)//获取特征2:res
{
	int b = get_b(a);
	return a + b;
}

string get_insert_query(int a)//获取插入数据语句
{
	char s[100]; 
	int b = get_b(a);
	sprintf_s(s, "insert into %s (a,b,res) values(%d,%d,%d);", TABLE_NAME, a, b, get_res(a));
	return s;
}

void operate_status(string query)//语句执行
{
	if (mysql_query(&mysql, query.c_str()))
		printf("语句%s操作失败, ERROR: %s", query.c_str(),mysql_error(&mysql));
	else
		return;
}

void writetoDB(int a)//写进数据库
{
	string query = get_insert_query(a);
	operate_status(query);
}

bool in_threshold(int a, int b, int threshold)//与阈值比较
{
	if (abs(a - b) < threshold)
		return true;
	else
		return false;
}

MYSQL_RES* get_res_from_mysql(string query)//返回运行某语句后的结果集
{
	operate_status(query);
	MYSQL_RES *res;
	res = mysql_store_result(&mysql);
	return res;
}



int main()
{
	if (ConnectDatabase()){
		cout << "数据库连接成功" << endl;
	}
	else
		return -1;
	//====================建立数据库==========================//
	/*string query1 = "create table if not exists " + TABLE_NAME + "(id int primary key auto_increment,\
					a int not null,b int,res varchar(20)); ";
	operate_status(query1);
	
	writetoDB(2);
	writetoDB(3);
	writetoDB(6);
	writetoDB(5);
	writetoDB(3);
	writetoDB(4);*/
	//=======================================================//
	cout << "数据库建立完毕......" << endl;
	cout << "进行数据库检索......" << endl;
	//====================数据库检索==========================//
	
	//增加检索结果字段retrieval_res
	/*string add_column = "alter table " + TABLE_NAME + " add retrieval_res varchar(100);";
	operate_status(add_column);*/
	cout << "请输入一个int型整数: " ;
	int input;
	cin >> input;
	int obj = get_res(input);

	string get_result_query = "select * from " + TABLE_NAME +";";
	operate_status(get_result_query);//获取数据库所有数据
	MYSQL_RES *res = mysql_store_result(&mysql);//获得结果集

	int columns;
	string ret = "";//输出结果
	MYSQL_ROW row;
	while (row = mysql_fetch_row(res))//遍历结果集的行
	{
		string id = row[0];
		string data = row[3];
		int data_int = atoi(data.c_str());
		if (in_threshold(obj, data_int, 5))
			ret += "与id = " + id + "的记录res值相差" + to_string(abs(obj - data_int)) + ";\n";
	}

	if (ret.length() <= 0)
		cout << "数据库中无符合条件的记录!" << endl;
	else
	{
		ret = "有以下数据与检索数据的res特征值差值小于5:\n" + ret;
		cout << ret << endl;
	}

	//=======================================================//
	FreeConnect();
	system("pause");
	return 0;
}

数据库信息:

数据库检索:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sakila是MySQL官方提供的一个样例数据库,用于演示和练习MySQL数据库的使用。数据库包含了一个虚构的DVD租赁店的数据,其中包括客户、电影、租赁记录等等。 Sakila数据库包含16张表,包括: 1. `actor`:演员表,包含演员的ID、名字和最后更新时间。 2. `address`:地址表,包含地址的ID、地址、邮编、电话和最后更新时间。 3. `category`:电影类别表,包含类别的ID和名称以及最后更新时间。 4. `city`:城市表,包含城市的ID、城市名称、国家ID和最后更新时间。 5. `country`:国家表,包含国家的ID、国家名称和最后更新时间。 6. `customer`:客户表,包含客户的ID、姓名、地址、邮编、电话、积分、注释和最后更新时间。 7. `film`:电影表,包含电影的ID、标题、描述、发行年份、语言ID、原始语言ID、租金、长度、评级和最后更新时间。 8. `film_actor`:电影演员表,包含电影ID和演员ID。 9. `film_category`:电影类别表,包含电影ID和类别ID。 10. `inventory`:库存表,包含DVD的ID、电影ID和最后更新时间。 11. `language`:语言表,包含语言的ID、名称和最后更新时间。 12. `payment`:支付表,包含支付的ID、客户ID、租赁ID、支付时间、租赁时长和支付金额。 13. `rental`:租赁表,包含租赁的ID、客户ID、电影ID、租赁时间和最后更新时间。 14. `staff`:员工表,包含员工的ID、姓名、地址、邮编、电话、邮箱、店铺ID、用户名、密码和最后更新时间。 15. `store`:店铺表,包含店铺的ID、地址、邮编、电话和最后更新时间。 16. `sales_by_film_category`:按电影类别统计销售额的视图,包含类别名称和销售额。 使用Sakila数据库可以练习SQL查询、联结、聚合、子查询等等操作,是学习MySQL的很好的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值