目录

一. 视图

1.1 基本使用

1.2 视图规则和限制

二. 用户管理

2.1 用户

2.1.1 用户信息

2.1.2 创建用户

2.1.3 删除用户

2.1.4 修改用户密码

2.2 数据库的权限

2.2.1 给用户授权

2.2.2 回收权限

三. MySQL访问

MySQL接口介绍

四. 图形化界面登陆数据库


一. 视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视 图的数据变化会影响到基表,基表的数据变化也会影响到视图。

1.1 基本使用

create view 视图名 as select语句;

实际上就是创建一个新的表。

注意视图和基表是数据是打通的:

删除

drop view 视图名;

1.2 视图规则和限制

与表一样,必须唯一命名(不能出现同名视图或表名)

创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响

视图不能添加索引,也不能有关联的触发器或者默认值 视图可以提高安全性,必须具有足够的访问权限

order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图 中的 order by 将被覆盖

视图可以和表一起使用

二. 用户管理

如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。

2.1 用户

2.1.1 用户信息

MySQL中的用户,都存储在系统数据库mysql的user表中

host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆

user: 用户名

authentication_string: 用户密码通过password函数加密后的

*_priv: 用户拥有的权限

2.1.2 创建用户

create user '用户名'@'登陆主机/ip' identified by '密码'; 

此时就可以使用新创建的用户进行登录了:

不能远程登录

想远程登录的话可以这样写:

create user '用户名'@'%' identified by '密码'; 

写成%,但是特别不建议。

2.1.3 删除用户

drop user '用户名'@'主机名'

再去查就没了:

2.1.4 修改用户密码

自己改自己的:

set password=password('新的密码');

root用户修改指定用户的密码,用update也可以

set password for '用户名'@'主机名'=password('新的密码');

2.2 数据库的权限

2.2.1 给用户授权

grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']

grant select on ...

grant select, delete, create on ....

grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限

*.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)

库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)

identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户

例如:我用root用户创建一个test数据库,里面创建一个user表,再在里面添加数据:

创建一个用户:

在另一个终端登录这个用户:

查不到刚刚创建的表。这里就改一下权限:

另一台主机就可以看到了,并且可以做任何事情:

查看赋予的权限:

2.2.2 回收权限

revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';

root移除lwz 的权限

用户lwz就查不到了:

root下,使用命令可以查看给lwz 的权限:

三. MySQL访问

先做一下准备工作,给lwz用户添加test数据库的所有权限:

尝试链接mysql client 通过 mysql_get_client_info() 函数,来验证我们的引入是否成功

成功:

MySQL接口介绍

初始化mysql_init()

要使用库,必须先进行初始化!

MYSQL *mysql_init(MYSQL *mysql);

如: MYSQL *mfp = mysql_init(NULL)

链接数据库mysql_real_connect

下发mysql命令mysql_query

第一版测试,输入命令测试正常执行命令:

#include <iostream>
#include <mysql/mysql.h>
#include <string>

const std::string host = "127.0.0.1";
const std::string passwd = "123456";
const std::string db = "test";
const std::string user = "lwz";
const unsigned int port = 3306;

int main()
{
    // std::cout << "mysql client Version: " <<  mysql_get_client_info() << std::endl;
    // 1. 创建句柄
    MYSQL* mysql = mysql_init(nullptr);
    if(mysql == nullptr)
    {
        std::cout << "mysql_init error" << std::endl;
        return 1;
    }
    // 2.链接数据库
    if(mysql_real_connect(mysql,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0) == nullptr)
    {
        std::cout << "connect error" << std::endl;
        return 2;
    }
    std::cout << "connect success" << std::endl;
    // 3.设置字符集
    mysql_set_character_set(mysql, "utf8");
    // 4.执行命令
    std::string sql;
    while(std::getline(std::cin,sql))
    {
        if(sql == "quit")
        {
            break;
        }
        int n = mysql_query(mysql,sql.c_str());
        if(n==0)
        {
            std::cout << sql << " success " << n <<std::endl;
        }
        else 
        {
            break;
        }
    }

    
    mysql_close(mysql);
    return 0;
}

数据库中查:

但是使用查询语句不行

sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操 作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过 mysql_store_result这个函数来读取结果。原型如下:

该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该 函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内 存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行 完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取 MYSQL_RES 中的数据。

对于MYSQL_RES类型:

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。

#include <iostream>
#include <mysql/mysql.h>
#include <string>

const std::string host = "127.0.0.1";
const std::string passwd = "123456";
const std::string db = "test";
const std::string user = "lwz";
const unsigned int port = 3306;

int main()
{
    // std::cout << "mysql client Version: " <<  mysql_get_client_info() << std::endl;
    // 1. 创建句柄
    MYSQL *mysql = mysql_init(nullptr);
    if (mysql == nullptr)
    {
        std::cout << "mysql_init error" << std::endl;
        return 1;
    }
    // 2.链接数据库
    if (mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cout << "connect error" << std::endl;
        return 2;
    }
    std::cout << "connect success" << std::endl;
    // 3.设置字符集
    mysql_set_character_set(mysql, "utf8");
    // 4.执行命令,对select特殊处理
    std::string sql = "select * from user";
    int n = mysql_query(mysql, sql.c_str());
    if (n == 0)
    {
        std::cout << sql << " success " << n << std::endl;
    }
    else
    {
        std::cout << sql << " error " << n << std::endl;
        return 3;
    }
    // 4.1拿到结果集
    MYSQL_RES* res = mysql_store_result(mysql);
    if(res == nullptr)
    {
        std::cout << "mysql result error" << std::endl;
        return 4;
    }
    // 4.2 获取行和列,方便后面遍历
    int rows = mysql_num_rows(res);
    int fields = mysql_num_fields(res);
    // 4.3 从结果集中拿到每一行的数据
    MYSQL_ROW line;
    for(int i = 0;i < rows;i++)
    {
        line = mysql_fetch_row(res);
        for(int j = 0;j < fields;j++)
        {
            std::cout << line[j] << " ";
        }
        std::cout <<std::endl;
    }
    mysql_free_result(res);

    mysql_close(mysql);
    return 0;
}

四. 图形化界面登陆数据库

主要就注意这个3306端口监听所有网络接口:

还有我们创建的用户一定要是全部的都可以链接,可以远程登录,虽然不安全:

这里我比较常用MySQL workbench(免费)和navicat(收费)

因为不太安全,不用的时候一定要关闭数据库,或者删除

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐