目录
(1)MYSQL *mysql_init(MYSQL *mysql) 初始化接口
(2)MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
const char *password, const char *db, unsigned int port, const char *unix_socket,
unsigned long client_flag) 链接数据库
(3)const char *mysql_error(MYSQL *mysql) 数据库错误信息
(4)int mysql_query(MYSQL *mysql, const char *query) 需要运用SQL语句 插入数据
(5)MYSQL_RES *mysql_store_result(MYSQL *mysql) 获取查询结果
(6)unsigned int mysql_num_fields(MYSQL_RES *res) 查询结果集的行数
(7)MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *res) 查询结果集的字段
(8)MYSQL_ROW mysql_fetch_row(MYSQL_RES *res) 按行输出结果集
(9)void mysql_close(MYSQL *mysql) 关闭数据库
一、mysql 安装
Mysql是一个关系型数据库管理系统 AB---->oracle
MYsql是开源的,所以不需要支付费用
Mysql支持大型的数据库,可以处理成千上万记录的大型数据库
MYsql使用标准的SQL数据语言形式
Mysql可以允许多个系统上使用,并且支持多种语言,c,c++,python,java,php
Mysql是可以定制,采用GPL开源协议。
命令:
sudo apt-get update
sudo apt-get install -f
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
二、SQL语句
1、登录SQL
-- 登录SQL
mysql -u root -p //以root身份登录
mysql -u user -p //以普通用户进行登录,用户名为:user
2、创建用户
--查看所有用户
select user from user;
--创建用户
create user "209user"@"localhost" identified by "123456";
--修改5用户登录密码
set password for "209user"@"localhost" = PASSWORD("209");
-- 授权用户操作
grant select on *.* to "209user"@"localhost";
//授权操作
grant drop on *.* to "209user"@"localhost";
3、创建数据库、创建表
-- 查看所有的数据库
show databases;
--创建数据库
create database 209test;
-- 使用数据库
use mysql;
use 209test;
-- 查看所有表
show tables;
-- 创建表
create table int_test(
tiny_int tinyint, //整形 1个字节
small_int smallint, //整形 2个字节
mudium_int mediumint, //整形 3个字节
common_int int, //整形 4个字节
big_int bigint ); //整形 8个字节
-- 创建学生表
create table student(
name varchar(10) not null,
age tinyint unsigned not null,
sex char(6)
);
-- 显示表结构
describe int_test;
4、表插入数据
-- 插入数据(5种方式)
insert into student (id,name,birth,age,sex,tel) values(1000,"jack","1998-7-7",18,"male","12345678910");
insert into student (name,birth,age,sex,tel) values("tom","1995-8-8",89,"female","98765432101");
insert into student values(1002,"rose","1996-9-9",78,"male","45678912301");
insert into student (id,name,birth,age,sex) values (1004,"zhangsan","1996-8-8",26,"female");
insert into student values (1005,"lisi","1999-7-7",21,"male","55555555555"),(1006,"wangwu","1956-7-7",89,"female","66666666666");
5、修改表、字符集
//授权操作,普通用户需要授权后,才能执行 drop 命令
grant drop on *.* to "209user"@"localhost";
-- 修改表
alter table student rename stu; alter table student drop sex;
alter table student add sex char(6);
alter table student add id int unsigned not null primary key auto_increment first;
alter table student add birth date after name;
alter table student add tel char(11) default '-';
-- 查询数据
select *from student;
select name from student;
select name from student where id > 1002;
select name from student where id between 1001 and 1004;
--修改更新数据
update student set tel = "00000000000" where name = "rose";
-- 删除记录
delete from student where id = 1000;
-- 修改字符集
//修改后,可以将字符串写成中文,不然只能是英文字符串,但是在高版本的数据库中不需要修改,封装了这个功能。
alter table student convert to character set utf8;
insert into student values(1007,"张三","1996-9-9",78,"male","12345678912");
6、删除表、数据库
-- 删除表
drop table student;
-- 删除数据库
drop database 209test;
7、事务操作
-- 事务操作
//事务会将数据库断电之前的情况保存下来,数据库恢复正常后,数据会恢复到之前;
//当commit 执行之后,数据将恢复为断电前,执行后的状态;
-- 创建表
create table account(
id int unsigned not null primary key,
name varchar(20),
moneny int )charset utf8;
-- 插入数据
insert into account values(1001,"张三",2000),(1002,"李四","5000"),(1003,"王五","1000");
-- 李四给王五转500
update account set moneny = moneny - 500 where id = 10002;
-- 停电了,再次登录MYSQL,数据出错
//没有引入事务之前,就会出现这样丢数据的情况
//事务直接开启,commit 后,数据库将执行,保存前未执行的操作;
-- 开启事务
start transaction;
-- 李四给王五转账500
update account set moneny = moneny - 500 where id = 1002;
-- 查询数据 select *from account;
-- 李四确实少了500 (看到的结果是事务日志)
-- 王五增加500
update account set moneny = moneny + 500 where id = 1003;
-- 退出数据库再次登录,数据并没有修改
-- 提交 commit;
//事务可以回滚到数据库某个指定状态;
-- 开启事务
start transaction;
-- 张三转出500;
update account set moneny = moneny - 500 where id = 1001;
-- 设置回滚点1
savepoint sp1;
-- 李四转出500;
update account set moneny = moneny - 500 where id = 1002;
-- 设置回滚点2
savepoint sp2;
-- 王五增加1000;
update account set moneny = moneny + 1000 where id = 1003;
-- 回滚到 sp2;
rollback to sp2;
-- 提交
commit;
三、代码实现数据库操作
1、数据库实现步骤
(1)初始化数据库(初始化与链接数据库)
//mysql_init() 初始化
//mysql_real_connect() 链接数据库
//mysql_error() 数据库错误信息
(2)插入数据库
//mysql_query() 需要运用SQL语句 插入数据
(3)查询数据库
//mysql_query() 需要运用SQL语句 查询数据库
//mysql_store_result() 获取查询结果,返回MYSQL_RES 结构体指针集
//mysql_num_fields() 查询结果集的行数
//mysql_fetch_field() 查询结果集的字段
//mysql_fetch_row() 按行输出结果集
//mysql_close() 关闭数据库
2、数据库接口
(1)MYSQL *mysql_init(MYSQL *mysql) 初始化接口
参数:一个自己定义的指向数据库的对象指针,如: MYSQL *m; 此处通常为 NULL
返回值:成功:MYSQL* //一个数据库对象地址(指针)
失败:NULL(需要做错误处理,返回错误信息)
(2)MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
const char *password, const char *db, unsigned int port, const char *unix_socket,
unsigned long client_flag) 链接数据库
参数:MYSQL *mysql //指向数据库的对象指针
const char *host //主机名或IP地址,可以是 NULL 和 localhost (本地主机)
const char *user //登录数据库的用户,可以是 root 或 其他 user 名字(209user)
const char *password //用户登录密码
const char *db //数据库名称
unsigned int port //通常为 0, 或者是 TCP/IP 的 端口号(与第二个host 参数相关)
const char *unix_socket //通常为 NULL, 或者是 套接字 命名管道(与 host)
unsigned long client_flag // 通常为 0,
返回值:成功:MYSQL* //一个数据库对象地址(指针)
失败:NULL (需要做错误处理,返回错误信息)
(3)const char *mysql_error(MYSQL *mysql) 数据库错误信息
参数:一个自己定义的指向数据库的对象指针 如: MYSQL *m;
返回值:成功:字符指针(字符串)
失败:NULL
(4)int mysql_query(MYSQL *mysql, const char *query) 需要运用SQL语句 插入数据
参数:MYSQL *mysql //一个自己定义的指向数据库的对象指针 如: MYSQL *m;
const char *query //所有SQL语句(用双引号括起来)或字符指针
如: “select *from table;” char *sql;
返回值:成功:0
失败:!0 (需要做错误处理,返回错误信息)
(5)MYSQL_RES *mysql_store_result(MYSQL *mysql) 获取查询结果
参数:一个自己定义的指向数据库的对象指针 如: MYSQL *m;
返回值:成功:MYSQL_RES * //结果集结构体指针,如:MYSQL_RES *res
失败:NULL(需要做错误处理,返回错误信息)
(6)unsigned int mysql_num_fields(MYSQL_RES *res) 查询结果集的行数
参数:自己定义的指向结果集结构体指针,特指mysql_store_result() 返回值
如: MYSQL_RES *res;
返回值:成功:结果集行数
失败:0
(7)MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *res) 查询结果集的字段
参数:自己定义的指向结果集结构体指针,特指mysql_store_result() 返回值
如: MYSQL_RES *res;
返回值:成功:MYSQL_FIELD * //结果集中所有列的MYSQL_FIELD结构的数组
(8)MYSQL_ROW mysql_fetch_row(MYSQL_RES *res) 按行输出结果集
参数:一个自己定义的数据库对象 如: MYSQL *m;
返回值:成功:MYSQL_ROW //返回每行首地址,本质是数组
失败:NULL(需要做错误处理,返回错误信息)
(9)void mysql_close(MYSQL *mysql) 关闭数据库
参数:一个自己定义的数据库对象 如: MYSQL *m;
返回值:void
3、代码的实现
#include <iostream>
#include <mysql/mysql.h>
#include <iomanip>
using namespace std;
//数据库初始化
MYSQL* Init()
{
MYSQL *m;
m = mysql_init(NULL); //创建mysql对象并且初始化,返回对象的地址
if(NULL == m)
{
cout<<mysql_error(m)<<endl; //打印错误信息
return NULL;
}
//数据库连接mysql_real_connect();
m = mysql_real_connect(m,"localhost","209user","209","209test",0,NULL,0);
if(NULL == m)
{
cout<<mysql_error(m)<<endl; //打印错误信息
return NULL;
}
return m;
}
//插入数据
void InsertDatabase(MYSQL *m)
{
if(NULL == m)
{
cout<<mysql_error(m)<<endl; //打印数据库错误信息,mysql_error();
return;
}
int ret = mysql_query(m,"set names utf8;"); //mysql_query()接口执行数据库语句
if(ret != 0)
{
cout<<mysql_error(m)<<endl; //打印错误信息
return;
}
char sql[128] = {0};
int id,age;
char name[32] = {0},birth[32] = {0},sex[32] = {0},tel[32] = {0};
cout<<"请输入编号,姓名,出生日期,年龄,性别,电话:"<<endl;
cin>>id>>name>>birth>>age>>sex>>tel;
sprintf(sql,"insert into student (id,name,birth,age,sex,tel) values(%d,'%s','%s',%d,'%s','%s');",id,name,birth,age,sex,tel);
ret = mysql_query(m,sql); //mysql_query()接口执行数据库语句
if(ret != 0)
{
cout<<mysql_error(m)<<endl; //打印错误信息
return;
}
cout<<"插入成功"<<endl;
}
//查询数据库
void FindDataBase(MYSQL *m)
{
if(m == NULL)
{
return;
}
mysql_query(m,"set names utf8");
int ret = mysql_query(m,"select *from student"); //mysql_query()接口执行数据库语句
if(ret != 0)
{
cout<<mysql_error(m)<<endl;
return;
}
MYSQL_RES *res = mysql_store_result(m); // mysql_store_result()获取查询的结果
if(NULL == res)
{
cout<<mysql_error(m)<<endl;
return;
}
//获取字段数
int field = mysql_num_fields(res); //mysql_num_fields()获取字段个数
cout<<field<<endl;
//获取字段名
MYSQL_FIELD *f;
while(f = mysql_fetch_field(res)) //mysql_fetch_field()获取字段名
{
cout<<setw(20)<<setiosflags(ios::left)<<f->name; //打印字段名
}
cout<<endl;
//获取每一条记录
MYSQL_ROW r; //数组
int i;
while(r = mysql_fetch_row(res)) //mysql_fetch_row()获取每行记录
{
for(i = 0 ; i < field;i++)
{
cout<<setw(20)<<setiosflags(ios::left)<<r[i];
}
cout<<endl;
}
}
int main(int argc, char const *argv[])
{
MYSQL *mysql; //创建mysql对象
mysql = Init();
if(NULL == mysql)
{
cout<<"初始化Mysql失败"<<endl;
}
else
{
cout<<"链接数据库成功"<<endl;
}
//插入数据
//InsertDatabase(mysql);
FindDataBase(mysql); //查询数据库
mysql_close(mysql); //关闭数据库
return 0;
}