首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【MySQL#6】视图 & 用户管理

【MySQL#6】视图 & 用户管理

作者头像
IsLand1314
发布2025-07-18 15:10:57
发布2025-07-18 15:10:57
1380
举报
文章被收录于专栏:学习之路学习之路

一、视图

1.1 什么是视图?
  • 定义:视图是一个虚拟表,其内容由查询定义。
  • 结构:同真实的表一样,视图包含一系列带有名称的列和行数据。
  • 意义:基于常用的条件查询建立为视图,方便查看与调用,可以理解为一种对常用的显示
  • 非持久化:视图的数据不会持久化到磁盘上,而是基于查询结果动态生成。
  • 数据同步:视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
1.2 基本使用

① 语法

创建视图

代码语言:javascript
复制
create view 视图名 as select 语句;

删除视图

代码语言:javascript
复制
drop view 视图名;

② 示例

创建视图

代码语言:javascript
复制
create view myview as select ename, dname from emp inner join dept on emp.deptno=dept.deptno;
image-20250210213507320
image-20250210213507320

查询视图

代码语言:javascript
复制
select * from myview order by dname;

+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |

③ 数据同步实验

修改视图

代码语言:javascript
复制
update myview set ename='TEST' where ename='CLARK';

查询基表

代码语言:javascript
复制
select * from EMP where ename='CLARK';
select * from EMP where ename='TEST';

修改基表

代码语言:javascript
复制
update EMP set deptno=10 where ename='JAMES'; -- 修改基表

查询视图:视图中的数据也发生了变化

代码语言:javascript
复制
mysql> select * from myview where ename='JAMES';
+-------+----------+
| ename | dname    |
+-------+----------+
| JAMES | RESEARCH | <== 视图中的数据也发生了变化
+-------+----------+
1.3 视图规则和限制
  • 命名:与表一样,必须唯一命名(不能出现同名视图或表名)。
  • 数量:创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响。
  • 索引和触发器:视图不能添加索引,也不能有关联的触发器或者默认值。
  • 安全性:视图可以提高安全性,必须具有足够的访问权限。
  • 排序:order by 可以用在视图中,但如果从该视图检索数据 select 中也含有 order by,那么该视图中的 order by 将覆盖原 select 中的 order by(就近原则)。
  • 使用:视图可以和表一起使用,如:笛卡尔积、内连、外连等。

练习点击题目

二、用户管理

目前为止我们使用 mysql 都是用的 root 账号,但是不建议直接使用 root 进行 mysql 的操作。

  • 我们推荐使用普通用户对数据的访问。而 root 作为管理员可以对普通用户对应的权限进行设置和管理。

如给张三和李四这样的普通用户权限设定后。就只能操作给你权限的库了

image-20250211103949472
image-20250211103949472
2.1 用户
① 用户信息

MySQL 有自己的用户管理机制,用户信息以表结构形式存储。这些信息保存在系统数据库 mysqluser 表中。

代码语言:javascript
复制
mysql> use mysql;
Database changed

mysql> select * from user \G;
*************************** 5. row ***************************
                    Host: localhost # 允许用户从哪台机器登录 MySQL,localhost 表示只允许从本地登录。
                    User: root # 用户名
                    # ....
   authentication_string: *A..A # 用户密码
        password_expired: N # 密码是否过期
   password_last_changed: 2024-12-20 14:44:30 # 密码上次更改时间
       password_lifetime: NULL

查看用户信息

代码语言:javascript
复制
mysql> select user, host, authentication_string from user;
+------------------+-----------+------------------------+
| user             | host      | authentication_string  |
+------------------+-----------+------------------------+
| debian-sys-maint | localhost | $TA$0$7m4hSoOH7        |
| mysql.infoschema | localhost | $TA$0$TR3BRBEUD        |
| mysql.session    | localhost | $TA$0$TH2IEUSED        |
| mysql.sys        | localhost | $AT$0$TNE1VERBR        |
| root             | localhost | *TA9FF471C2C394        |
+------------------+-----------+------------------------+

mysqllinux 一样可以允许创建多个用户,这些用户都是普通用户,你可以给他们开账号

所谓在 mysql 内部给用户开账号,就是把用户的用户名,允许从哪里登录,以及用户的密码信息放在 mysql 中的 user 表里。然后就有了这个用户了。

  • 如果我们现在想在 mysql 新建一个用户,有一个特点简单粗暴的方式,也不用后面学的专门的创建用户的sql语句
  • 可以用 insert 向这个 user 里面插入也是可以的。但是这太麻烦了

其实下面说的创建用户,删除用户,修改用户其实说到底就是在 user 表里做 增删改

② 创建用户

基本语法如下:

代码语言:javascript
复制
create user '用户名'@'登陆主机/ip' identified by '密码';
  • 用户名:自定义
  • 登陆主机/ip:本机登录用 localhost127.0.0.1,远程登录用 % 表示任意主机。
  • 密码:设置用户密码,会被哈希加密保存到 user 表中。
代码语言:javascript
复制
create user 'home'@'localhost' identified by '123456'; # 创建用户
flush privileges; # 刷新权限确保用户信息生效

mysql> select user, host, authentication_string from user;
+------------------+-----------+------------------------+
| user             | host      | authentication_string  |
+------------------+-----------+------------------------+
| debian-sys-maint | localhost | $TA$0$7m4hSoOH7        |
| home             | localhost | $ktVMDQMHA$005$        |
| mysql.infoschema | localhost | $TA$0$TR3BRBEUD        |
| mysql.session    | localhost | $TA$0$TH2IEUSED        |
| mysql.sys        | localhost | $AT$0$TNE1VERBR        |
| root             | localhost | *TA9FF471C2C394        |
+------------------+-----------+------------------------+

-- 创建好用户之后,以后我们就可以用这个用户进行操作了

但是如果是使用 Centos 进行操作创建用户可能会有问题,如下:

image-20250211110345182
image-20250211110345182

解决办法:

编辑 MySQL 配置文件:

通常配置文件位于 /etc/my.cnf 。打开配置文件并查找 [mysqld] 部分。

代码语言:javascript
复制
sudo vi /etc/my.cnf

移除 skip-grant-tables 选项:

image-20250211110424066
image-20250211110424066
③ 删除用户

语法

代码语言:javascript
复制
drop user '用户名'@'主机名';
-- 示例
drop user 'home'@'localhost';
drop user 'island'@'%';
④ 删除用户

语法

代码语言:javascript
复制
set password for '用户名'@'主机名' = password('新的密码'); # 用户自己修改密码
set password for '用户名'@'主机名' = password('新的密码'); # root 用户修改指定用户的密码

【案例】:

代码语言:javascript
复制
mysql> set password for 'home'@'localhost' = password('123456');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'password('123456')' at line 1

mysql> alter user 'home'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

ERROR 1064 (42000): You have an error in your SQL syntax 错误是因为在 MySQL 8.0 及以上版本中,PASSWORD() 函数已经被弃用。你需要使用新的语法来设置用户密码

  • 在 MySQL 8.0 及以上版本中,可以使用 ALTER USER 语句来设置用户密码
2.2 数据库的权限

当我们在MySQL中把一个用户创建好了,不是就所有工作做好了,而是说把用户创建好了 ,用户还要有他对应的权限也要处理的。

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

image-20250211112147143
image-20250211112147143

当前新建的用户只能看到这 两个数据库,如下:

image-20250211111809170
image-20250211111809170
① 授权

语法

代码语言:javascript
复制
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码'];

权限列表:多个权限用逗号分隔
	grant select on ...
	grant select, delete, create on ...
	grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限

库.对象名:指定数据库和对象(表、视图、存储过程等)
	*.*:所有数据库的所有对象
	库.*:某个数据库中的所有对象

【案例】

代码语言:javascript
复制
mysql> show grants for 'home'@'localhost'; # 查看用户权限,授权前
+------------------------------------------+
| Grants for home@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO `home`@`localhost` |
+------------------------------------------+

mysql> grant select, insert, update on learn1.* to 'home'@'localhost'; -- 授权

mysql> show grants for 'home'@'localhost'; # 查看用户权限,授权后
+------------------------------------------------------------------+
| Grants for home@localhost                                        |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `home`@`localhost`                         |
| GRANT SELECT, INSERT, UPDATE ON `learn1`.* TO `home`@`localhost` |
+------------------------------------------------------------------+

-- 切换到 home 主机,查看其库
mysql> show databases; # 授权前
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+

mysql> show databases; # 授权后
+--------------------+
| Database           |
+--------------------+
| information_schema |
| learn1             |
| performance_schema |
+--------------------+
② 收权

语法

代码语言:javascript
复制
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';

【案例】:

代码语言:javascript
复制
mysql> revoke all on learn1.* from 'home'@'localhost';
Query OK, 0 rows affected (0.01 sec)

-- 然后切换到 home 用户下
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、视图
    • 1.1 什么是视图?
    • 1.2 基本使用
    • 1.3 视图规则和限制
  • 二、用户管理
    • 2.1 用户
      • ① 用户信息
      • ② 创建用户
      • ③ 删除用户
      • ④ 删除用户
    • 2.2 数据库的权限
      • ① 授权
      • ② 收权
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档