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

开发成长之路(17)-- 数据库操作_第1张图片


轻量级SQL可视化工具:sqlite3

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

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


SQL语言概览

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

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


MySQL见闻录 - 入门之旅

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

开发成长之路(17)-- 数据库操作_第2张图片

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

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

2、头文件

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

#include 

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

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

后面的示例代码是一份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);//英文错误信息

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);

参数释义:

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

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

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

mysql_real_query函数的原型如下:

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

参数释义:

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

查询成功则该函数返回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);

这两个函数分别代表了获取查询结果的两种方式。
第一种,调用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);

参数释义:

result就是mysql_store_result或mysql_use_result的返回值。

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

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

mysql_free_result函数的原型如下:

void STDCALL mysql_free_result(MYSQL_RES *result);

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

void STDCALL mysql_close(MYSQL *sock);

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


击穿盲点

设置了一些扫盲的。

《深入浅出SQL》问答录

开发成长之路(17)-- 数据库操作_第3张图片

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


打开我的收藏夹 – MySQL篇

开发成长之路(17)-- 数据库操作_第4张图片

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


全面分析 MySQL并发控制

开发成长之路(17)-- 数据库操作_第5张图片

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


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

你可能感兴趣的:(开发成长之路,数据库,mysql,sql)