开发成长之路(17)-- 数据库操作

举报
看,未来 发表于 2021/05/19 22:53:37 2021/05/19
【摘要】 轻量级SQL可视化工具:sqlite3 为什么先讲sqlite3?因为对于新手来说,sqlite3用来入门再方便不过了。 MySQL、Oracle等数据库那么庞大,小白真的能纯粹的用这些数据库来学习SQL语言?我看不见得。 需要sqlite3的图形化软件可以右侧找我,也可以私信我,网上找的基本都是命令行模式的。 SQL语言概览 入门数据库操作,基本功...

在这里插入图片描述


轻量级SQL可视化工具:sqlite3

为什么先讲sqlite3?因为对于新手来说,sqlite3用来入门再方便不过了。
MySQL、Oracle等数据库那么庞大,小白真的能纯粹的用这些数据库来学习SQL语言?我看不见得。

需要sqlite3的图形化软件可以右侧找我,也可以私信我,网上找的基本都是命令行模式的。


SQL语言概览

入门数据库操作,基本功一定要打扎实了。
咱也不喜欢做搬运工,这个也比较基础一些,大家可以自行学习:
经典SQL语句大全(绝对的经典)

当然,光这样看语句的话,也会有点干巴巴的,所以最好配一些题目,两篇一起看会比较好一些:
MySQL题集


MySQL见闻录 - 入门之旅

在网上翻来覆去找不到一套适合新手自学的书,于是买了课,急急忙忙上完了课,又发现全还给老师了。
这一系列文放在这里,从下载软件开始,记录一条MySQL入门之旅。 新手也可以跟着这条路走,一条道走到黑。
有任何疑问,参考三篇上课笔记,或者私信我。

1、Linux下的MySQL环境搭建

使用命令(安装mysql):

sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install emma

  
 
  • 1
  • 2
  • 3
  • 4

这要安不上,度娘在边上。

2、头文件

//Linux下
//mysqltest.cpp 代码如下:

#include <stdio.h>

//确保在/usr/include/mysql下有mysql.h文件
#include "mysql/mysql.h"

//windows下
#include <WinSock2.h> // 进行网络编程需要winsock2.h
 
#include <mysql.h>
 
#pragma comment(lib, “libmysql.lib”)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

后面的示例代码是一份windows下的,不过建议大家熟悉之后改成Linux版本的,毕竟咱这学C++的嘛,跟Linux感情还是好一点。

3、初见庐山真面目

/*连接句柄 整个MYSQL开发的核心*/
MYSQL * mysql;
 
/*初始化*/
MYSQL *mysql_init(MYSQL *mysql);
 
/*设置连接选项*/
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);
 
/*打开连接*/
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db,
unsigned int port, const char *unix_socket, unsigned long client_flag);
 
/*执行SQL语句*/
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
/*如果SQL语句是C风格字符串,可以直接用下面的函数*/
int mysql_query(MYSQL *mysql, const char *query);
 
/*SQL语句一般只能是一条语句,如果你想在一个函数调用中执行多个SQL语句,需要以;隔开,并且设置在打开连接时设置属性*/
CLIENT_MULTI_STATEMENTS
/*或者对已经打开的连接进行以下函数调用设置,其中mysql为MYSQL的指针*/
mysql_set_server_option(mysql,MYSQL_OPTION_MULTI_STATEMENTS_ON);
 
/*如果执行的是一个有返回结果的语句,可以用下列函数获取结果*/
MYSQL_RES *mysql_use_result(MYSQL *mysql);
MYSQL_RES *mysql_store_result(MYSQL *mysql);
/*其中前一个函数只是初始化MYSQL_RES结构体,并不真正从服务器获取结果,后一个函数直接将全部数据读取到客户端*/
 
/*MYSQL_RES结构体可以通过以下函数获得数据*/
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
/*该函数返回的MYSQL_ROW类型实际为 char** 类型,通过下标操作可以取得每一列的值*/
 
/*可以通过以下函数获得结果集的列数*/
unsigned int mysql_field_count(MYSQL *mysql);
unsigned int mysql_num_fields(MYSQL_RES *result);
/*获得结果集的行数*/
my_ulonglong mysql_num_rows(MYSQL_RES *result);
 
/*使用完结果集后一定要记得释放*/
void mysql_free_result(MYSQL_RES *result);
 
/*如果执行的SQL语句是无返回结果的,比如DELETE INSERT等,可以使用以下函数获取影响行数*/
my_ulonglong mysql_affected_rows(MYSQL *mysql);
 
/*最后使用完连接后需要释放*/
void mysql_close(MYSQL *mysql);
 
/*错误处理*/
/*MYSQL的函数基本都遵循C语言的编程习惯,当返回值为整数时,0代表成功,非0代表失败,当返回指针时,NULL代表失败*/
/*如果函数执行失败,你可以通过下列函数获得信息*/
unsigned int mysql_errno(MYSQL *mysql);//错误代号
const char *mysql_error(MYSQL *mysql);//英文错误信息

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

4、拨开迷雾,看下一层迷雾

①调用mysql_real_connect函数连接Mysql数据库。

mysql_real_connect函数的原型如下:

MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag);

  
 
  • 1

参数释义:

mysql:前面定义的MYSQL变量;
host:MYSQL服务器的地址;
user:登录用户名;
passwd:登录密码;
db:要连接的数据库;
port:MYSQL服务器的TCP服务端口;
unix_socket:unix连接方式,为NULL时表示不使用socket或管道机制;
clientflag:Mysql运行为ODBC数据库的标记,一般取0
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

连接失败时该函数返回0。

②调用mysql_real_query函数进行数据库查询。

mysql_real_query函数的原型如下:

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);

  
 
  • 1

参数释义:

mysql:前面定义的MYSQL变量;
q:SQL查询语句;
length:查询语句的长度。

  
 
  • 1
  • 2
  • 3

查询成功则该函数返回0。

③通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。

两个函数的原型分别为:

MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
 
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);

  
 
  • 1
  • 2
  • 3

这两个函数分别代表了获取查询结果的两种方式。
第一种,调用mysql_store_result函数将从Mysql服务器查询的所有数据都存储到客户端,然后读取;
第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回。
故经常我们使用mysql_store_result。

④调用mysql_fetch_row函数读取结果集数据。

上述两种方式最后都是重复调用mysql_fetch_row函数读取数据。mysql_fetch_row函数的原型如下:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

  
 
  • 1

参数释义:

result就是mysql_store_result或mysql_use_result的返回值。

  
 
  • 1

该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row[i]为第i个字段的值。当到结果集尾部时,此函数返回NULL。

⑤结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。

mysql_free_result函数的原型如下:

void STDCALL mysql_free_result(MYSQL_RES *result);

  
 
  • 1

⑥不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。

void STDCALL mysql_close(MYSQL *sock);

  
 
  • 1

详见:
MySQL见闻录 - 入门之旅


击穿盲点

设置了一些扫盲的。

《深入浅出SQL》问答录

在这里插入图片描述

具体详见:《深入浅出SQL》问答录


打开我的收藏夹 – MySQL篇

在这里插入图片描述

详见:打开我的收藏夹 – MySQL篇


全面分析 MySQL并发控制

在这里插入图片描述

详见:
全面分析 MySQL并发控制


这些东西,我自己回头还得重温一遍呐,好,写进计划里、

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/116995257

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。