mysql

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);
  • 查看表的结构

    • 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;
  • 删除数据 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;
  • **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全局变量

  1. 初始化 mysql 结构体 MYSQL *mysql_init(MYSQL *mysql)
    • mysql_init(&conn);
    • 返回值:An initialized MYSQL* handler. NULL if there was insufficient memory to allocate a new object.
  2. 连接数据库
    • 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)
  3. 设定字符集int mysql_set_character_set(MYSQL *mysql, const char *csname)
    • mysql_set_character_set(&conn,"utf8");
  4. 传入sql语句 int mysql_query(MYSQL *mysql, const char *stmt_str)
    • mysql_query(&conn,sql); //sql是一个字符串
    • 如果成功,返回0
    • sql 不需要 ;
  5. 接收sql结果 MYSQL_RES *mysql_store_result(MYSQL *mysql)
    • MYSQL_RES * res_ptr = mysql_store_result(&conn);
  6. 一行一行的读信息 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
    • MYSQL_ROW row = mysql_fetch_row(res_ptr); //row[0] 第一个字段信息
  7. 读完数据 free res_ptr; void mysql_free_result(MYSQL_RES *result)
    • mysql_free_result(res_ptr);
  8. 关闭数据库 void mysql_close(MYSQL *mysql)
  9. 获取字段信息 mysql_fetch_field(MYSQL_RES*)
    • 返回字段的结构体指针,第一次调用返回第一个字段名,第二次这返回第二个字段名


  1. 另一个获取结果的函数:MYSQL_RES *mysql_use_result(MYSQL *mysql)


  1. const char * mysql_error(MYSQL * );
    • 返回错误信息
  2. unsigned long long mysql_num_rows(MYSQL_RES *)
    • 返回结果行数
  3. 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

你可能感兴趣的:(mysql)