MySQL:视图+用户管理+访问+连接池原理

news2025/6/4 9:05:00

一、视图

       视图是一个虚拟表,其内容由查询定义。同真实的表一样(相当于是把查询的内容当成一个临时表来使用),视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图

1.1 为什么需要视图

 案例:

 当我们需要频繁从上面两表中获取用户名和部门名称的时候,我们会发现每次都需要频繁地进行内连接和条件设置,显然很麻烦

所以我们可以用视图来存储  用户名+部门名称  的查询结构 

1.2 视图的基本使用

 创建视图  

create view 视图名 as select语句;

 

 创建视图之后会多了一个表

 

我们将查询出来的结果放到视图里其实就相当于存到一个临时的表结构(高频使用)里 

视图的改变会影响基表

基表的改变会影响视图

删除视图

drop view 视图名;

1.3 视图的规则和限制

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

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

3、视图不能添加索引,也不能有关联的触发器或者默认值

4、视图可以提高安全性,必须具有足够的访问权限

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

6、视图可以和表一起使用

二、用户管理 

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

2.1 用户

2.1.1 用户信息

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

mysql> use mysql;

mysql> select host,user,authentication_string from user;

字段解释:

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

user: 用户名

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

*_priv: 用户拥有的权限

2.1.2 创建用户

create user '用户名'@'登陆主机/ip' identified by '密码';--密码会被做哈希加密保存到user表里

--备注:可能实际在设置密码的时候,因为mysql本身的认证等级比较高,一些简单的密码无法设置,会爆出如下报错:-- ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

-- 解决方案:Your password does not satisfy the current policy requirements-CSDN博客

--查看密码设置相关要求:

SHOW VARIABLES LIKE 'validate_password%';

 --注意:关于新增用户这里,需要大家注意,不要轻易添加一个可以从任意地方登陆的user。

登录之前刷新一下

flush privileges;

  -- 此时便可以使用新账号新密码进行登陆啦

2.1.3 删除用户

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

2.1.4 设置一个任意主机都可以登录的用户

      如果MySQL服务器直接暴露在公网,就会存在很大的风险,为了保证数据安全,MySQL服务器的端口是不对外开放的。 

2.1.5 修改用户密码

mysql会将用户设置的明文密码通过password函数加密之后再抄到表上!

自己改自己的密码

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

root用户修改指定用户的密码

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

2.2 数据库的权限

MySQL数据库提供的权限列表:

2.2.1 给用户授权

刚创建的用户没有任何权限。需要给用户授权。

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

说明: 权限列表,多个权限用逗号分开

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

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

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

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

root建一个表  然后给这个表权限

 这个时候张三就能看到这个表了

2.2.2 查看现有权限

特定用户现有查看权限 
mysql> show grants for 'zhangsan'@'%'; 

注意:如果发现赋权限后,没有生效,执行如下指令: 

flush privileges;

2.2.3 回收权限

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

三、C/C++访问数据库

      要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去官网下载我们使用C接口库来进行连接要正确使用,我们需要做一些准备工作:

1、保证mysql服务有效

先创建一个测试的数据库

root:建表之后赋权

cyx: 

 2、在官网上载适己台mysql connect库,以备后用   https://www.mysql.com/

 找到右下角的 

找到 

找到 

先查一下我们mysql的版本 

 他默认是9.2.0版本的,我们如果想用老版本可以点

 

//跳过一下 基础IO那里动静态库的引入

但是其实最早用yum源下载mysql-community-server的时候就已经把相关的库都配置好了!!

centos安装mysql以及mysql-devel_mysql-devel安装包下载-CSDN博客

要用C++连接的必须再安装mysql-devel。 

 其中 include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)

3.1 Connector/C库的引入

 test.cc

#include<iostream>
#include<mysql.h>
using namespace std;
int main()
{
 cout<<"mysql client Version: "<< mysql_get_client_info()<<endl;
 return 0;
}

makefile

mytest:test.cc
	g++ -o $@ $^ -std=c++11 -I/usr/include/mysql -L/lib64/mysql -lmysqlclient
.PHONY:clean
clean:
	rm -rf mytest

3.2 C/C++进行增删查改

 先找到官方文档找库的使用说明: https://www.mysql.com/

找到C API  找5.7

 找到

可以开个翻译

3.2.1 初始化mysql_init

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

MYSQL *mysql_init(MYSQL *mysql);//创建一个MYSQL对象

如: MYSQL *mfp = mysql_init(NULL)

//初始化数据库
  MYSQL *mfp = mysql_init(NULL);
  if(mfp==nullptr) {
    cerr<<"mysql_init error"<<endl;
    return 1;

3.2.2 链接数据库mysql_real_connect

初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的) 

MYSQL *mysql_real_connect(MYSQL *mysql, //MYSQL对象
                       const char *host,//主机
                       const char *user,//用户
                       const char *passwd,//密码
                       const char *db,//链接的数据库
                       unsigned int port,//端口号
                       const char *unix_socket,//域间套接字,这里设null
                       unsigned long clientflag);//设置为0

        第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很 多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。

 //链接数据库
if(mysql_real_connect(mfp,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr){
    cerr<<"mysql_real_connect error"<<endl;
    return 2;
  }
  cout<<"connect success"<<endl;

3.3.3 命令行 show processlist 

我们接下来可以进一步确定是否链接上了! 

       show processlist 是显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。除非单独个这个用户赋予了PROCESS 权限。 

     以下是程序运行之前, 查一下

    以下我们让进程sleep 10秒        

然后运行程序再查   会发现多了一个运行线程

3.2.4  下发mysql命令mysql_query

int mysql_query(MYSQL *mysql, const char *q);

 第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如“select * from table”。

返回值0表示成功,非0表示失败 

 为了方便验证,我们给conn数据库建个 user表

3.2.4.1 模拟MySQL语句
//尝试接受命令
  string cmd;
  while(true){
    cout<<"MySQL>>";
    if(!getline(cin,cmd) || cmd=="quit") break;
    int n=mysql_query(mfp,cmd.c_str());
    if(n==0) cout<<cmd<<"success"<<n<<std::endl;
    else cout<<cmd<<"failed"<<n<<std::endl;
  }

先验证quit和ctrl+d 

在验证插入表:

 

3.2.4.2 快速下达指令
 //快速下达指令
  string cmd="update user set name='lisi' where id=1;";
  int n=mysql_query(mfp,cmd.c_str());
  if(n==0) cout<<cmd<<"success"<<endl;
  else cout<<cmd<<"failed"<<endl;

 

 

3.2.4.3 中文乱码mysql_set_character_set 

 

 为什么这里会出现乱码问题呢??原因是客户端和服务器在编码统一的问题上没有达成一致

 设置连接的默认字符集的utf8,原始默认是latin1   我们可以在链接成功后设置一下

mysql_set_character_set(mfp,"utf8");

3.2.5 获取执行结果mysql_store_result

        sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert,delete(增shan)等语句,那么就看下操作成功与否即可。

        我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果。 

MYSQL_RES *mysql_store_result(MYSQL *mysql);

      该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回

      MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果(多级指针数组)。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 

      执行完mysql_store_result以后,其实数据 都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。 

1、获取结果行数mysql_num_rows  

my_ulonglong mysql_num_rows(MYSQL_RES *res);

2、获取结果列数mysql_num_fields

unsigned int mysql_num_fields(MYSQL_RES *res);

3、获取列名mysql_fetch_fields 

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

MYSQL_FIELD 是属性

 如:

 //获取属性
  int nrows=mysql_num_rows(res);
  cout<<"nrows="<<nrows<<endl;
  int ncols=mysql_num_fields(res);
  cout<<"ncols="<<ncols<<endl;
  MYSQL_FIELD *flds=mysql_fetch_fields(res);
  for(int i=0;i<ncols;++i){
    cout<<flds[i].name<<"\t";
  }
  cout<<endl; 

4.获取结果内容mysql_fetch_row(很像迭代器)

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

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

 // 获取内容
 int i = 0; 
MYSQL_ROW line; 
for(; i < nrows; i++){ 
 line = mysql_fetch_row(res); //迭代器遍历 可以拿到一行数据
 int j = 0; 
 for(; j < ncols; j++){ 
 cout<<line[j]<<"\t"; 
 } 
 cout<<endl; 
} 

5、清空结果集 mysql_free_result

void mysql_free_result(MYSQL_RES *result)

3.2.6 关闭mysql链接mysql_close

void mysql_close(MYSQL *sock); 

3.2.7 支持事务等常用操作

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); 
my_bool STDCALL mysql_commit(MYSQL * mysql); 
my_bool STDCALL mysql_rollback(MYSQL * mysql);

四、mysql图形化界面方案推荐与演示

11 款超赞的 MySQL 图形化工具,好用!-CSDN博客

phpMyAdmin可以安装到云服务器上 ,然后拿浏览器访问云服务器,登录后就能看到

但是安装起来有点麻烦

体验很好,但是要收费 

 体验很好,但要收费

 是mysql官方提供的图形化界面方案,免费的,体验一般

 下载方式:https://www.mysql.com/

点击  

点击  

 然后直接下载到本地

       使用图形化界面,除了像phpMyAdmin这样的基于web的mysql图形化界面解决方案,注定了图形化界面一定是在你本地的机器上,而我们用的云服务器是在云上的,从官方上看,云服务器如果部署了mysql,这mysql的端口号一定不能暴露,而是应该都在内网当中,当一个公司员工想访问内网的mysql要经历防火墙、LVS、诸如堡垒机这样的机器,才能进入到内网中在外部访问公司级别的数据库,但是一般的刚创业的小公司出于成本考虑,可能会在开发时把端口号暴露公网,就有点不太好,一般来说我们线上部署完服务后,数据库服务应该单独在云上单独买机器,一定要和web服务器(可能是两台机器)和mysql部署在同一个内网中,隐藏端口号,否则很容易被攻击。

     但是现在我们技术有限所以只能把端口号暴露出去,另外mysql是客户端,所以一定要允许用户进行网络请求远程登录(需要新建一个允许远端登录的用户)

设置权限 

 

 

 

 可以访问了,然后bench用户就可以进行远端登录了

 点击加号

选中然后点击闪电执行 

 

修改、插入、删除表数据的操作可以直接在表格里面做  然后点击 右下角的

 所以图形化界面的好处就是我们拿到这个表结构和数据之后可以直接在表格上面改,就不需要写sql语句了

五、MySQL连接池原理

       用户可以绑定函数A到cb上,如果有设置(select)那么mysql语句执行完后再执行cb函数回调方法。将处理后的数据返回到用户那边

六、简易网站数据流动是如何进行

      在mysql和服务器中间加一个软件层,这样我服务器就不需要关心交给哪个数据库,而是由这个软件层来帮我们操作,做负载均衡 

      不一定立马到数据库去找,对于一些高频数据可以先到缓冲里去找

关于架构具体的可以关注docker

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2396676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

neo4j 5.19.0安装、apoc csv导入导出 及相关问题处理

前言 突然有需求需要用apoc 导入 低版本的图谱数据&#xff0c;网上资料又比较少&#xff0c;所以就看官网资料并处理了apoc 导入的一些问题。 相关地址 apoc 官方安装网址 apoc 官方导出csv 教程地址 apoc 官方 导入 csv 地址 docker 安装 执行如下命令启动镜像 doc…

无人机桥梁3D建模的拍摄频率

无人机桥梁3D建模的拍摄频率 无人机桥梁3D建模的拍摄频率&#xff08;每秒拍摄照片数&#xff09;需根据建模精度、飞行速度、相机性能等因素综合确定。以下是专业级作业的详细参数分析&#xff1a; 1. 核心计算公式 拍摄频率&#xff08;fps&#xff09; \frac{飞行速度&…

ESP32-idf学习(三)esp32C3连接iot

一、前言 上一篇用蓝牙作为通信方式&#xff0c;虽然勉强完成了控制&#xff0c;但结果显然不是那么符合我们的预期&#xff0c;既然用蓝牙还需要研究一段时间&#xff0c;那我们就先整一些现成的&#xff0c;不需要研究的&#xff01;iot云平台&#xff01;这里当然也是通过w…

详解鸿蒙仓颉开发语言中的计时器

今天又到了大家喜闻乐见的科普环节&#xff0c;也可以说是踩坑环节&#xff0c;哈哈哈。今天聊一聊仓颉开发语言中的计时器&#xff0c;这部分可老有意思了。 为什么这么说呢&#xff0c;因为关于仓颉的计时器你几乎搜不到任何的文档&#xff0c;也没有相关的代码提示&#xf…

【计算机网络】第3章:传输层—拥塞控制原理

目录 一、PPT 二、总结 &#xff08;一&#xff09;拥塞的定义 &#xff08;二&#xff09;拥塞产生的原因 &#xff08;三&#xff09;拥塞控制的目标 &#xff08;四&#xff09;拥塞控制方法分类 1. 端到端拥塞控制 2. 网络辅助拥塞控制 &#xff08;五&#xff09;…

Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)

Vue3&#xff08;watch&#xff0c;watchEffect&#xff0c;标签中ref的使用,TS,props,生命周期&#xff09; watch监视 情况三&#xff1a;监视reactive定义的对象类型的数据 监视reactive定义的对象类型的数据&#xff0c;默认开启深度监视。地址没变&#xff0c;新值和旧…

【nssctf第三题】[NSSCTF 2022 Spring Recruit]easy C

这是题目&#xff0c;下载附件打开是个C文件 #include <stdio.h> #include <string.h>int main(){char a[]"wwwwwww";char b[]"dvxbQd";//try to find out the flagprintf("please input flag:");scanf(" %s",&a);if…

DBeaver导入/导出数据库时报错解决方案

导出&#xff1a; 报错&#xff1a;mysqldump: Got error: 2026: SSL connection error: error:0A000102:SSL routines::unsupported protocol when trying to connect 在额外的命令参数中添加"--ssl-modeDISABLED"可以关闭SSL服务&#xff0c;从而成功解决问题。这…

uniapp与微信小程序开发平台联调无法打开IDE

经测试属于网络问题。本机需要联网。否则会出现Hbuilder运行微信小程序到模拟器时无法打开 微信开发者工具 这个页面出不来会一直显示异常。这期间微信小程序开发工具的端口是通的 需要先联网

第十二节:第五部分:集合框架:Set集合的特点、底层原理、哈希表、去重复原理

Set系列集合特点 哈希值 HashSet集合的底层原理 HashSet集合去重复 代码 代码一&#xff1a;整体了解一下Set系列集合的特点 package com.itheima.day20_Collection_set;import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.…

【C++项目】:仿 muduo 库 One-Thread-One-Loop 式并发服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 &#x1f525; 前言 一&#xff1a;&#x1f525; 项目储备知识 &#x1f98b; HTTP 服务器&#x1f98b; Reactor 模型&#x1f380; 单 Reactor 单线程&#xff1a;单I/O多路…

基于大数据的个性化购房推荐系统设计与实现(源码+定制+开发)面向房产电商的智能购房推荐与数据可视化系统 基于Spark与Hive的房源数据挖掘与推荐系统设计

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

FFmpeg学习笔记

1. 播放器的架构 2. 播放器的渲染流程 3. ffmpeg下载与安装 3.0 查看PC是否已经安装了ffmpeg ffmpeg 3.1 下载 wget https://ffmpeg.org/releases/ffmpeg-7.0.tar.gz 3.2 解压 tar zxvf ffmpeg-7.0.tar.gz && cd ./ffmpeg-7.0 3.3 查看配置文件 ./configure …

Chrome 通过FTP,HTTP 调用 Everything 浏览和搜索本地文件系统

【提问1】 Chrome调用本地 everything.exe, everything 好像有本地 FTP 服务器&#xff1f; 【DeepSeek R1 回答】 是的&#xff0c;Everything 确实内置了 HTTP/FTP 服务器功能&#xff0c;这提供了一种相对安全的浏览器与本地应用交互的方式。以下是完整的实现方案&#x…

GpuGeek如何成为AI基础设施市场的中坚力量

AI时代&#xff0c;算力基础设施已成为支撑技术创新和产业升级的关键要素。作为国内专注服务算法工程师群体的智算平台&#xff0c;GpuGeek通过持续创新的服务模式、精准的市场定位和系统化的生态建设&#xff0c;正快速成长为AI基础设施领域的中坚力量。本文将深入分析GpuGeek…

【Hot 100】45. 跳跃游戏 II

目录 引言跳跃游戏 IIdp解题贪心解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】45. 跳跃游戏 II❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引言 跳跃…

Python数学可视化——显函数、隐函数及复杂曲线的交互式绘图技术

Python数学可视化——显函数、隐函数及复杂曲线的交互式绘图技术 一、引言 在科学计算和数据分析中&#xff0c;函数与方程的可视化是理解数学关系和物理现象的重要工具。本文基于Python的Tkinter和Matplotlib库&#xff0c;实现一个功能完善的函数与方程可视化工具&#xff…

代码随想录打卡|Day51 图论(dijkstra(堆优化版)精讲、Bellman_ford 算法精讲)

图论part09 dijkstra&#xff08;堆优化版&#xff09;精讲(不熟悉) 代码随想录链接 题目链接 import java.util.*;class Edge {int to; // 邻接顶点int val; // 边的权重Edge(int to, int val) {this.to to;this.val val;} }class MyComparison implements Comparator<…

AI入门——AI大模型、深度学习、机器学习总结

以下是对AI深度学习、机器学习相关核心技术的总结与拓展&#xff0c;结合技术演进逻辑与前沿趋势&#xff0c;以全新视角呈现关键知识点 一、深度学习&#xff1a;从感知到认知的技术革命 核心突破&#xff1a;自动化特征工程的范式变革 深度学习通过多层神经网络架构&#x…

【AI论文】论文转海报:迈向从科学论文到多模态海报的自动化生成

摘要&#xff1a;学术海报生成是科学交流中一项关键但具有挑战性的任务&#xff0c;需要将长上下文交织的文档压缩成单一的、视觉上连贯的页面。 为了应对这一挑战&#xff0c;我们引入了第一个用于海报生成的基准和度量套件&#xff0c;该套件将最近的会议论文与作者设计的海报…