mysql 数据库
使用系统:ubuntu 18.04 LTS
安装mysql
sudo apt install mysql-server //安装 mysql服务器
sudo apt install mysql-client //安装 mysql 客户端
sudo apt install libmysqlclient-dev //安装c语言API 库 编译的时候需要加 -lmysqlclient
基本使用
登陆 :
mysql [-h主机ip] -u root -p
查看数据库:
show databases;
选用数据库:
use 数据库名
例如:use mysql
查看数据库中表:
show tables
数据库
-
创建
create database 库名;
create database 库名 character set utf8; 加上字符集 ,明确字符集,中文可以查看
create database 库名 charset = utf8;
-
删除
- drop database 数据库名
表
选择一个数据库 : use 数据库名
-
创建
- create table 表名(字段名 字段类型 字段约束,字段名2 字段类型2 字段约束2 ....);
- create table tb_stu(id int not null primary key, name varchar(32) not null ,score double);
- create table 表名(字段名 字段类型 字段约束,字段名2 字段类型2 字段约束2 ....);
-
查看表的结构
-
desc 表名;
desc tb_stu;
-
-
查看创建表
- show create table tb_stu;
-
修改表的结构
alter
- 增加字段
alter table 表名 add 字段名 字段类型 after 字段名;
after 字段名 可以省略- alter table tb_stu add gender int not null after score;
- 删除字段
alter table 表名 drop 字段名;
- 修改字段类型
alter table 表名 change/(modify column) 字段名 字段类型;
- 修改表名
alter table 表名 rename 新表名
- 增加字段
-
插入数据
insert into 表名 value(数据1,数据2,数据3);
- insert into tb_stu value(1,"小名",90.2,1);
- insert into tb_stu(id,name,gender) value(3,"何昂",2);
- insert into tb_stu(id,name,gender) value(3,"何昂",2), value(3,"何昂",2), value(3,"何昂",2);
-
查找数据
select 字段名1,字段名2 from 表名 约束条件;
- 给字段取别名
select 字段名1 as 别名1 , 字段名2 as 别名2 from 表名 约束条件
- select id as 学号 , name as 姓名 ,score as 分数, gender as 性别 from tb_stu;
- 模糊查找 `select 字段1 字段2 tb_stu where 字段 like "%关键字%";
- select * from tb_stu where name like "%李%";
- 数字条件 select * from tb_stu where score > 80 and score<90;
- 排序 select * from tb_stu order by id;
- order by 字段名 asc; 升序
默认
- order by 字段名 desc;
- order by 字段名 asc; 升序
- 给字段取别名
-
删除数据
delete from 表名 约束条件
- delete from tb_stu where id =3; **没有约束条件就全部删除 **
- truncate tb_stu; 清空表格
-
修改数据
update 表名 set 字段名 = 新值 where 约束条件
- update tb_stu set name = "何一" where id = 1;
查找数据 select
- select id , name form tb_stu where id = 1;
- 条件运算 : > < >= <= = != (<>)
- 逻辑运算:&&(and) ||(or) !(not)
- in(value1,value2,.....)
- select from tb_stu where 班级 in(1,3,5);
- between value1 and value2 //包含边界值
约束关键字
-
primary key
- 修改成主键:alter table tb_stu change id id int primary key;
- 删除主键:alter table tb_stu drop primary key;
auto_increment
-
forengn key外键
- alter table grade add constrain fk forengn key(num) references tb_stu(id)
- fk 是一个别名
- 子表字段要被设置为外键,不能为主键,被参照的父表字段必须是主键
- 作用,如果子表的外键,在插入数据时候,如果外键的值在被参照字段没有的话,那么插入数据无效;
- 删除: alter table grade drop foreign key fk;
- alter table grade add constrain fk forengn key(num) references tb_stu(id)
**not null ** 不能为空 ,修饰字段
-
default
- alter table tb_stu change 成绩 成绩 double not null default 0;
数据类型
默认是有符号的,在类型后面添加
unsigned
修饰,可以是无无符号tyinyint(3) //3为显示宽度 后面加
zerofill
0填充 0是正数, 所有使用0填充的 要是一个无符号类型
用户管理
创建用户:create user 'zhangsan'@'localhost' indetified by ‘123456’;
授权:grant all on *.* to 'zhangsan'@'localhost' ;
多表连接查找
t1 表 有 4 条信息 t2 有 5条信息
- select * from t1, t2;
- 笛卡尔积组合
- 结果 20 条信息
- select * from t1 left join t2 on t1.id = t2.id;
多表条件查询
- left join 左连接,以左边表为参照 ,如果右表没有对应的数据,就为NULL
数据的备份与恢复
- 表的备份:
bash> mysqldump -uroot -p s stu_info tea_info >table.sql
- 库的备份:
-
bash > mysqldump -uroot -p s>table1.sql
表级备份,备份库的所有表 - bash >
mysqldump -uroot -p s -B>data.sql
库级备份 写-B选项
-
- 表级恢复: mysql> source ./table1.sql 注意,先use 这个库
- 库级恢复:mysql> source ./data.sql
.sql 文件就是sql语句
c 语言 API
-
MYSQL
-
连接信息的结构体
typedef struct st_mysql { NET net; /* Communication parameters */ unsigned char *connector_fd; /* ConnectorFd for SSL */ char *host,*user,*passwd,*unix_socket,*server_version,*host_info; char *info, *db; struct charset_info_st *charset; MYSQL_FIELD *fields; MEM_ROOT field_alloc; my_ulonglong affected_rows; my_ulonglong insert_id; /* id if insert on table with NEXTNR */
-
-
MYSQL_FIELD
字段信息
typedef struct st_mysql_field { char *name; /* Name of column */ char *org_name; /* Original column name, if an alias */ char *table; /* Table of column if column was a field */ char *org_table; /* Org table name, if table was an alias */ char *db; /* Database for table */ char *catalog; /* Catalog for table */ char *def; /* Default value (set by mysql_list_fields) */ unsigned long length; /* Width of column (create length) */ unsigned long max_length; /* Max width for selected set */ unsigned int name_length; unsigned int org_name_length; unsigned int table_length; unsigned int org_table_length; unsigned int db_length; unsigned int catalog_length; unsigned int def_length; unsigned int flags; /* Div flags */ unsigned int decimals; /* Number of decimals in field */ unsigned int charsetnr; /* Character set */ enum enum_field_types type; /* Type of field. See mysql_com.h for types */ void *extension; } MYSQL_FIELD;
-
MYSQL_ROW
typedef char **MYSQL_ROW;
-
MYSQL_RES
typedef struct st_mysql_res { my_ulonglong row_count; MYSQL_FIELD *fields; MYSQL_DATA *data; MYSQL_ROWS *data_cursor; unsigned long *lengths; /* column lengths of current row */ MYSQL *handle; /* for unbuffered reads */ const struct st_mysql_methods *methods; MYSQL_ROW row; /* If unbuffered read */ MYSQL_ROW current_row; /* buffer to current row */ MEM_ROOT field_alloc; unsigned int field_count, current_field; my_bool eof; /* Used by mysql_fetch_row */ /* mysql_stmt_close() had to cancel this result */ my_bool unbuffered_fetch_cancelled; void *extension; } MYSQL_RES;
MYSQL conn , * sock; //定义mysql全局变量
- 初始化 mysql 结构体
MYSQL *mysql_init(MYSQL *mysql)
- mysql_init(&conn);
- 返回值:An initialized
MYSQL*
handler.NULL
if there was insufficient memory to allocate a new object.
- 连接数据库
- sock = mysql_real_connect(&conn,主机地址,用户名,密码,库,0, NULL, 0);//如果方法NULL,表示连接失败
- 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)
- 设定字符集
int mysql_set_character_set(MYSQL *mysql, const char *csname)
- mysql_set_character_set(&conn,"utf8");
- 传入sql语句
int mysql_query(MYSQL *mysql, const char *stmt_str)
- mysql_query(&conn,sql); //sql是一个字符串
- 如果成功,返回0
- sql 不需要
;
号
- 接收sql结果
MYSQL_RES *mysql_store_result(MYSQL *mysql)
- MYSQL_RES * res_ptr = mysql_store_result(&conn);
- 一行一行的读信息
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
- MYSQL_ROW row = mysql_fetch_row(res_ptr); //row[0] 第一个字段信息
- 读完数据 free res_ptr;
void mysql_free_result(MYSQL_RES *result)
- mysql_free_result(res_ptr);
- 关闭数据库
void mysql_close(MYSQL *mysql)
- 获取字段信息 mysql_fetch_field(MYSQL_RES*)
- 返回字段的结构体指针,第一次调用返回第一个字段名,第二次这返回第二个字段名
- 另一个获取结果的函数:
MYSQL_RES *mysql_use_result(MYSQL *mysql)
- const char * mysql_error(MYSQL * );
- 返回错误信息
- unsigned long long mysql_num_rows(MYSQL_RES *)
- 返回结果行数
- unsigned long long mysql_num_fields(MYSQL_RES *)
- 返回结果列数
#include
#include
int main()
{
MYSQL mysql;
if(NULL==mysql_init(&mysql))
{
printf("初始化失败!\n");
return -1;
}
printf("初始化成功!\n");
if(NULL==mysql_real_connect(&mysql,"localhost","root","123456","s",0,NULL,0))
{
printf("连接失败!:%s\n",mysql_error(&mysql));
return -1;
}
printf("连接成功!\n");
mysql_set_character_set(&mysql,"utf8");
char sql[128sprintf(sql,"select * from stu_info");
int ret=mysql_query(&mysql,sql);
if(ret!=0)
{
printf("sql语句不合法!%s\n",mysql_error(&mysql));
return -1;
}
printf("sql合法,执行成功!\n");
MYSQL_RES *result=NULL;
MYSQL_ROW row = NULL;
int num_rows,num_fields;
result = mysql_store_result(&mysql);
num_rows=mysql_num_rows(result);
num_fields=mysql_num_fields(result);
printf("行数:%d,列数:%d\n",num_rows,num_fields);
for(int i=0;i