2019.01.30
MySql数据库
一、
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。
这种所谓的关系型可以理解为“表格”的概念,一个关系型数据库由一个或者数个表格组成。
表头(header):每一列的名称
列(row):具有相同数据类型的数据的集合。
行(col):每一行用来描述某个人/物的具体信息。
值(value):行的具体信息,每个值必须与该列的数据类型相同。
键(key):表中用来识别某个人特定的人/物的方法,键的值在当前列中具有唯一性。
MySql与sqlite3 的区别:
二者都是关系型数据库,sqlite3是小型的数据库,只能在本地使用,数据存放在本地。
MySql是大型的数据库,它有自己的服务器,所有的数据存放在服务器上。它可工作在客户端/服务器模式下。
二、MySql数据类型
1.整型
2.浮点型
设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。
3.定点型
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位
char和varchar:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。
varchar和text:
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
2.text类型不能有默认值。
3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用
5.二进制数据
1.BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
2.BLOB存储的数据只能整体读出。
3.TEXT可以指定字符集,BLOB不用指定字符集。
6.日期时间类型
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
7.数据类型的属性
三、MySql的使用
1.创建一个数据库
使用 create database 语句可完成对数据库的创建, 创建命令的格式如下:
create database 数据库名 [其他选项];
例如我们需要创建一个名为 my_db 的数据库, 在命令行下执行以下命令:
create database my_db character set gbk;
为了便于在命令提示符下显示中文, 在创建时通过 character set gbk 将数据库字符编码指定为 gbk。创建成功时会得到 Query OK, 1 row affected(0.02 sec) 的响应。
提示: 可以使用 show databases; 命令查看已经创建了哪些数据库。
选择所要操作的数据库
要对一个数据库进行操作, 必须先选择该数据库, 否则会提示错误:
ERROR 1046(3D000): No database selected
两种方式对数据库进行使用的选择:
一: 在登录数据库时指定, 命令: mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p
例如登录时选择刚刚创建的数据库: mysql -D my_db -u root -p
二: 在登录后使用 use 语句指定, 命令: use 数据库名;
use 语句可以不加分号, 执行 use my_db 来选择刚刚创建的数据库, 选择成功后会提示: Database changed
2.创建数据库表
使用 create table 语句可完成对表的创建, create table 的常见形式:
create table 表名称(列声明);
以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex) 这些内容:
create table students(id int, name text, sex text);
3.插入数据
insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:
insert [into] 表名 [(列名1, 列名2, 列名3, …)] values (值1, 值2, 值3, …);
例子:
insert into students(id, name, sex) values(1, "xiao", "man");
insert into students values(2, "hong", "woman");
4.数据查询
普通查询
select 列名称 from 表名称 [查询条件];
select * from students;
select name from students;
按特定条件查询
where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;
select * from students where sex = "woman";
5.数据更新
update 语句可用来修改表中的数据, 基本的使用形式为:
update 表名称 set 列名称=新值 where 更新条件;
update students set sex = "man" where id = 2;
6.数据的删除
delete 语句用于删除表中的数据, 基本用法为:
delete from 表名称 where 删除条件;
delete from students where name = "xiao";
7.数据库的修改
(1)添加列
基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置];
在表的最后追加列 address:
alter table students add address char(60);
名为 age 的列后插入列 birthday:
alter table students add birthday date after sex;
8.删除整个数据库
基本形式: drop database 数据库名;
示例: 删除 my_db 数据库:
drop database my_db;
8.通过程序查询数据库
#include <iostream>
#include <windows.h>
#include <mysql.h>
using namespace std;
MYSQL * init()
{
MYSQL *mysql = mysql_init(NULL); // 生成一个 mysql 句柄,用于和服务器交互
if(NULL == mysql)
{
cout << "初始化失败!" << endl;
return NULL;
}
/*
功能:连接服务器
形参:
第一个: mysql_init(NULL)生成的句柄
第二个:主机名或ip地址,本机可用"localhost"
第三个:用户名
第四个:密码
第五个:数据库名
返回值:如果成功,返回值和 第一个参数值是一样的如果失败,返回 NULL
*/
MYSQL *ms = mysql_real_connect(mysql, "localhost", "root", "114q6636z798p", "my_db", 0, NULL, 0);
if(ms == NULL)
{
cout << "连接服务器失败:" << mysql_error(mysql) << endl;
exit(1);
}
return mysql;
}
void select(MYSQL *mysql)
{
char* sql = "select * from students";
int ret = mysql_query(mysql, sql);
if(0 != ret)
{
cout << "select失败:" << mysql_error(mysql) << endl;
return;
}
//检索完整的结果集至客户端
MYSQL_RES *result = mysql_store_result(mysql);
if (NULL == result)
{
cout << "mysql_store_result失败:" << mysql_error(mysql) << endl;
return;
}
//返回结果集中的列数
unsigned int column = mysql_num_fields(result);
//返回所有字段结构的数组
MYSQL_FIELD * fields = mysql_fetch_fields(result);
for(unsigned int i = 0; i < column; i++)
{
printf("%-10s", fields[i].name);
}
printf ("\n");
MYSQL_ROW row;
//从结果集中获取下一行
while((row = mysql_fetch_row(result)))
{
for (unsigned int i = 0; i < column; i++)
printf("%-10s", row[i]);
cout << endl;
}
//释放结果集使用的内存
mysql_free_result(result);
}
int main()
{
//
MYSQL *mysql = init();
//
select(mysql);
mysql_close(mysql);
return 0;
}
9.MySql的事务处理
MySql默认是自动提交的。我们可以通过设置set autocommit=0禁止自动提交。设置set autocommit=1开启自动提交。
事务处理命令:
开启事务:START TRANSACTION
禁止自动提交:set autocommit=0
开启自动提交:set autocommit=1
提交事务:commit
事务回滚:rollback
事务的封装以及实例
#include <iostream>
#include <windows.h>
#include <mysql.h>
#define BEGIN_TRAN "START TRANSACTION"
#define SET_TRAN "SET AUTOCOMMIT=0"
#define UNSET_TRAN "SET AUTOCOMMIT=1"
#define COMMIT_TRAN "COMMIT"
#define ROLLBACK_TRAN "ROLLBACK"
using namespace std;
MYSQL * init()
{
MYSQL *mysql = mysql_init(NULL); // 生成一个 mysql 句柄,用于和服务器交互
if(NULL == mysql)
{
cout << "初始化失败!" << endl;
return NULL;
}
/*
功能:连接服务器
形参:
第一个: mysql_init(NULL)生成的句柄
第二个:主机名或ip地址,本机可用"localhost"
第三个:用户名
第四个:密码
第五个:数据库名
返回值:如果成功,返回值和 第一个参数值是一样的如果失败,返回 NULL
*/
MYSQL *ms = mysql_real_connect(mysql, "localhost", "root", "114q6636z798p", "my_db", 0, NULL, 0);
if(ms == NULL)
{
cout << "连接服务器失败:" << mysql_error(mysql) << endl;
exit(1);
}
return mysql;
}
int mysql_BeginTran(MYSQL *mysql)
{
int ret = 0;
//--执行事务开始SQL
ret = mysql_query(mysql, BEGIN_TRAN);
if (ret != 0)
{
printf("func mysql_query() err: %d\n", ret);
return ret;
}
//--设置事务手动提交
ret = mysql_query(mysql, SET_TRAN);
if (ret != 0)
{
printf("func mysql_query() err: %d\n", ret);
return ret;
}
return ret;
}
int mysql_Rollback(MYSQL *mysql)
{
int ret = 0;
//--事务回滚操作
ret = mysql_query(mysql, ROLLBACK_TRAN);
if (ret != 0)
{
printf("func mysql_query() err: %d\n", ret);
return ret;
}
//--恢复事务自动提交标志
ret = mysql_query(mysql, UNSET_TRAN);
if (ret != 0)
{
printf("func mysql_query() err: %d\n", ret);
return ret;
}
return ret;
}
int mysql_Commit(MYSQL *mysql)
{
int ret = 0;
//--执行事务提交SQL
ret = mysql_query(mysql, COMMIT_TRAN);
if (ret != 0)
{
printf("func mysql_query() err: %d\n", ret);
return ret;
}
//--恢复自动提交设置
ret = mysql_query(mysql, UNSET_TRAN);
if (ret != 0)
{
printf("func mysql_query() err: %d\n", ret);
return ret;
}
return ret;
}
int main()
{
MYSQL *mysql = init();
mysql_BeginTran(mysql);
char *sql = "insert into students values(10, 'qzp', 'man', '1997-02-18', '123456')";
int ret = mysql_query(mysql, sql);
if(ret != 0)
{
cout << "insert 失败:" << mysql_error(mysql) << endl;
}
char ch;
ch = getchar();
//输入y提交事务
if(ch == 'y')
{
mysql_Commit(mysql);
}
//输入n事务回滚
else if(ch == 'n')
{
mysql_Rollback(mysql);
}
mysql_close(mysql);
return 0;
}