MYSQL 5.7 数据库管理

一、数据库操作命令

在熟悉安装及访问 MySQL 数据库以后,接下来将学习使用 MySQL 数据库的基本操作, 这也是在服务器运维工作中不可或缺的知识

1、查看数据库结构

MySQL 是一套数据库管理系统,在每台 MySQL 服务器中,均支持运行多个数据库, 每个数据库相当于一个容器,其中存放着许多表,如图所示
在这里插入图片描述

2、查看数据库

SHOW DATABASES 语句:用于查看当前 MySQL 服务器中包含的数据库,MySQL 的 每一条操作语句默认都是以分号(;)结束的经初始化的 MySQL 服务器 , 默认建立了四个数据库(mysql 5.7) :sys 、 mysql 、 information_schema 和 performance_schema(其中 mysql 是 MySQL 服务正常运行所需的数据库,其中包含了用户认证相关的表),执行以下操作可以进行查看

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

3、查看数据库中有哪些表

SHOW TABLES 语句:用于查看当前所在的数据库中包含的表。在操作之前,需要先使用 USE 语句切换到所使用的数据库。例如,执行以下操作可以显示school数据库中包含的所有表。

mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| Test             |
| hob              |
| hobby            |
| info             |
| infos            |
| new              |
| newtable         |
| t1               |
| testtime         |
| tm               |
| tmp              |
| tt               |
| user             |
| user1            |
+------------------+
14 rows in set (0.00 sec)

MySQL 数据库的数据文件存放在/usr/local/mysql/data 目录下,每个数据库对应一个子 目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为“.frm”、“.MYD”和 “.MYI”。

  • “.frm”文件是与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等。不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文件。所有的“.frm”文件都存放在所属数据库的文件夹下面。
  • “.MYD”文件是 MyISAM 存储引擎专用,存放 MyISAM 表的数据。每一个 MyISAM 表
    都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件 在一起。
  • “.MYI”文件也是专属于 MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息。 对于 MyISAM 存储来说,可以被
    cache 的内容主要就是来源于“.MYI”文件中。每一个 MyISAM
    表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。

4、查看表结构

DESCRIBE 语句:用于显示表的结构,即组成表的各字段(列)的信息。需要指定“数 据库名.表名”作为参数;若只指定表名参数,则需先通过 USE 语句切换到目标数据库

查看info表的表结构

mysql> desc info;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   | UNI | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(50)  | YES  |     | 未知    |                |
| hobby   | int(3)       | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> desc school.info;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   | UNI | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(50)  | YES  |     | 未知    |                |
| hobby   | int(3)       | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

二、SQL语言

数据库目前标准的指令集是 SQL。

SQL 是 Structured Query Language 的缩写,即结 构化查询语言。它是 1974 年由 Boyce 和 Chamberlin 提出来的,1975~1979 年 IBM 公司 研制的关系数据库管理系统原型 System R 实现了这种语言。经过多年的发展,SQL 语言 得到了广泛的应用。

SQL 语言主要由以下几部分组成。

  • DDL(Data Definition Language,数据定义语言):用来建立数据库、数据库对象和定义字段,如CREATE、ALTER、DROP。
  • DML(Data Manipulation Language,数据操纵语言):用来插入、删除和修改数据库 中的数据,如INSERT、UPDATE、DELETE。
  • DQL(Data Query Language,数据查询语言):用来查询数据库中的数据,如 SELECT。
  • DCL(Data Control Language,数据控制语言):用来控制数据库组件的存取许可、 存取权限等,如COMMIT、ROLLBACK、GRANT、REVOKE。

1、DDL数据定义语言

(1)创建新数据库

CREATE DATABASE 语句:用于创建一个新的数据库,需指定数据库名称作为参数。

创建school数据库

mysql> CREATE DATABASE school;
Query OK, 1 row affected (0.00 sec)

刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/data 目录下会自动生成一个与新建的数据库名相同的文件夹。

(2)创建新表

CREATE TABLE 语句:用于在当前数据库中创建新的表,需指定数据表名称作为参数, 并定义该表格所使用的各字段,创建表之前,应先明确数据表格的结构、各字段的名称和类型等信息。

语法:
CREATE TABLE 表名 (字段 1 名称类型, 字段 2 名称类型, …, PRIMARY KEY (主键名))

创建info表,定义id为整数型,主键,自增长,名字:字符类型,不能为空,分数:小数类型,地址:可变长字符类型,默认值为未知

mysql> create table info(id int(3) primary key auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default '未知');
Query OK, 0 rows affected (0.02 sec)

mysql> desc info;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   |     | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(50)  | YES  |     | 未知    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

(3)删除表

DROP TABLE 语句:用于删除数据库中的表,需要指定“数据库名.表名”作为参数;若 只指定表名参数,则需先通过执行“USE”语句切换到目标数据库

mysql> drop table info;
Query OK, 0 rows affected (0.01 sec)

(4)删除数据库

DROP DATABASE 语句:用于删除指定的数据库,需要指定数据库名作为参数

mysql> drop database auth;
Query OK, 0 rows affected (0.00 sec)

2、DML数据操纵语言

(1)插入数据记录

INSERT INTO 语句:用于向表中插入新的数据记录

语法:
INSERT INTO 表名(字段 1, 字段 2,…) VALUES(字段 1 的值, 字段 2 的值,…)

执行以下操作将会向info表里插入一条记录,id为1,name为“shengjie”,score为80,address为“nanjing”。char和varchar类型的数据需要加上单引号,数值型的不需要

mysql> insert into info(name,score,address) values('shengjie',80,'nanjing');
Query OK, 1 row affected (0.02 sec)

mysql> select * from info;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
1 row in set (0.00 sec)

需注意的是,VALUES 部分的值应与前面指定的各字段逐一对应,这里因为id字段定义了auto_increment自增约束,所以可以直接不用写id的值,它自己会加一

mysql> desc info;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   |     | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(50)  | YES  |     | 未知    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

在插入新的数据记录时,如果这条记录完整包括表中所有字段的值,则插入语句中指定字段的部分可以省略,但是自增字段的值也要写

向info表中插入第二条记录

mysql> insert into info values(2,'shangzhen',82,'beijing');
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  1 | shengjie  | 80.00 | nanjing |
|  2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)

(2)删除数据记录

DELETE 语句:用于删除表中指定的数据记录

语法:
DELETE FROM 表名 WHERE 条件表达式
mysql> delete from info where name='shengjie';
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  2 | shangzhen | 85.00 | beijing |
+----+-----------+-------+---------+
1 row in set (0.00 sec)

需要注意的是,在执行 UPDATE、DELETE 语句时,通常都带 WHERE 条件,不带条件的 UPDATE 语句和 DELETE 语句会修改或删除所有的记录,是非常危险的操作。

(3)删除整个表

mysql> delete from info;
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
Empty set (0.00 sec)

delete 只能删除表中的数据,表结构还在

3、DQL数据查询语言

(1)查询数据记录

SELECT 语句:用于从指定的表中查找符合条件的数据记录。MySQL 数据库支持标准 的 SQL 查询语句

语法:
SELECT 字段名 1,字段名 2,… FROM 表名 WHERE 条件表达式

表示所有字段时,可以使用通配符“*”,若要显示所有的数据记录,则可以省略 WHERE 条件子句

查询info表的所有记录

mysql> select * from info;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  1 | shengjie  | 80.00 | nanjing |
|  2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)

当需要根据特定的条件查找记录时,WHERE 条件子句是必不可少的

查询info表中分数大于等于82的记录

mysql> select * from info where score>=82;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
1 row in set (0.00 sec)

查询info表中分数大于等于82的记录的人名

mysql> select name from info where score>=82;
+-----------+
| name      |
+-----------+
| shangzhen |
+-----------+
1 row in set (0.00 sec)

(2)修改数据记录

UPDATE 语句:用于修改、更新表中的数据记录

语法:
UPDATE 表名 SET 字段名 1=字段值 1[,字段名 2=字段值 2] WHERE 条件表达式

修改shagnzhen的分数等于85

mysql> update info set score=85 where name='shangzhen';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from info;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  1 | shengjie  | 80.00 | nanjing |
|  2 | shangzhen | 85.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)

以下操作可以将数据库用户 root 的密码设为“12345”,当再次使用“mysql -u root -p”访问 MySQL 数据库服务器时,必须使用此密码进行验证

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> update user set authentication_string=password('123456');
Query OK, 3 rows affected, 1 warning (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 1

若是在 Linux 命令行环境中执行,还可以使用 mysqladmin 工具来设置密码。命令格式 为“mysqladmin -u root –p‘旧密码’password‘新密码’”。

[root@localhost ~]# mysqladmin -uroot -p123456 password 'abc123';
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

4、DCL数据控制语言

在 MySQL 数据库服务器中,用于访问数据库的各种用户(如 root)信息都保存在 mysql 数据库的 user 表中,管理员可以直接修改其中的数据记录来完成密码修改或权限赋予,但值得注意的是,应当尽量减少人工操作,避免由于操作失误导致数据库无法访问或连接不到数据库等问题。通常都是给对应业务最小权限,某业务用户只负责查询,则只需要给赋予 SELECT 权限即可。

事务的begin、commit以及权限的grant、revoke都属于DCL语言,后面会有详细介绍。

三、数据库高级操作

1、清空表

清空一个数据表就是删除这个表内的所有数据。前面已经学习过 DELETE FROM 语句,可以删除表内的数据,除此之外还可以使用 TRUNCATE TABLE 语句实现清空表内记录。

DELETE FROM 语句可以使用 WHERE 子句对删除的结果集进行过滤选择, 这样更方便、更灵活。TRUNCATE TABLE 语句是删除表中所有记录数据,没法定制,灵活性上稍差。

mysql> select * from info;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  1 | shengjie  | 80.00 | nanjing |
|  2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)

mysql> truncate table info;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from info;
Empty set (0.00 sec)

DELETE 在不加 WHERE 子句的时候,跟 TRUNCATE 是一样的效果,清空整个表。 在清空表的时候有一点不同,看他们返回的结果,DELETE 返回的结果内有删除的记录条目,而 TRUNCATE 并没有返回被删除的条目。

mysql> select * from info;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  2 | shangzhen | 85.00 | beijing |
+----+-----------+-------+---------+
1 row in set (0.00 sec)

mysql> delete from info;
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
Empty set (0.00 sec)

TRUNCATE 工作时是将表结构按原样重新建立,而 DELETE 工作时是一行一行的删除 记录数据的,在速度上 TRUNCATE 会快很多,尤其在数据量比较大的时候,表现更为明显。 另外如果一个表中有自增字段时,使用 DELETE FROM 删除所有记录后,再次新添加的记录会从原来最大的记录 ID 后面继续自增写入记录。使用 TRUNCATE TABLE 清空表内数据后,ID 会从 1 开始重新记录。

mysql> truncate table info;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from info;
Empty set (0.00 sec)

mysql> insert into info(name,score,address) values('shengjie',80,'nanjing');
Query OK, 1 row affected (0.00 sec)

mysql> insert into info values(2,'shangzhen',82,'beijing');
Query OK, 1 row affected (0.01 sec)

mysql> select * from info;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  1 | shengjie  | 80.00 | nanjing |  <----id还是从1开始
|  2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)
mysql> delete table info;
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 'table info' at line 1
mysql> delete from info;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from info;
Empty set (0.00 sec)

mysql> insert into info(name,score,address) values('shengjie',80,'nanjing');
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  3 | shengjie | 80.00 | nanjing | <----id字段从3开始了
+----+----------+-------+---------+
1 row in set (0.00 sec)

总结:delete和truncate的不同

1、delete可以配合where来进行条件筛选选择具体要删除的记录,而truncate的是删除真个表里的内容,不可以按记录删除

2、如果表里存在自增字段的话,delete之后,再次新添加的记录会从原来最大的记录 ID 后面继续自增写入记录。使用 TRUNCATE 清空表内数据后,ID 会从 1 开始重新记录。

2、临时表

MySQL 的临时表,顾名思义,就是临时建立的表,并不会长期存在,主要用于保存一 些临时数据。临时表有个特性,就是只在当前连接可见,当前连接下可执行增删改查等操作, 当连接被关闭后,临时表就会被 MySQL 删除,相关的资源也会被释放。

新建一个临时表tmp并插入一行数据记录,退出数据库再次进入数据库tmp表就不存在了

mysql> create temporary table tmp(id int(3) primary key auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default '未知');
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tmp(name,score,address) values('shengjie',80,'nanjing');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
1 row in set (0.00 sec)

mysql> quit
Bye

[root@localhost ~]# mysql -uroot -p
Enter password:

mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from tmp;
ERROR 1146 (42S02): Table 'school.tmp' doesn't exist

3、克隆表

在 MySQL 的开发和维护过程中,会有原样拷贝某个数据表的需求。怎么样才能够快速、 完整的拷贝数据表呢,AS 这里是作为连接语句的操作符,更多的是被用来设置别名,这种方法可以实现创建表并且将原表的数据拷贝过来,但是这种方法存在一个问题,就是表的索引、默认值等无法复制过来

创建test表把info表的所有记录拷贝过来

mysql> select * from info;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  3 | shengjie | 80.00 | nanjing |
|  4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)

mysql> create table test as select * from info;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  3 | shengjie | 80.00 | nanjing |
|  4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)

下面来介绍两种可以实现完整复制的方法

  • 方法一:通过 LIKE 方式克隆表
    首先,通过在创建表时使用 LIKE 方法,完整复制表结构。LIKE 方法可以将源表完全一样的复制生成一个新表,包括表的备注、索引、主键、存储引擎等,但是不会复制源表内数据记录。再通过 INSERT INTO…SELECT 方法,将源表内的数据写入新表内
mysql> create table test1 like info;  <----复制info表
Query OK, 0 rows affected (0.02 sec)

mysql> desc test1;   <---查看test1表结构
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   |     | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(50)  | YES  |     | 未知    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> select * from test1;   <-----LIKE方法复制表结构,不复制数据
Empty set (0.00 sec)

mysql> insert into test1 select *from info;   <----把info所有数据插入test1表
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  3 | shengjie | 80.00 | nanjing |
|  4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)
  • 方法二:通过创建表的方式克隆表
    首先,使用 SHOW CREATE TABLE 命令来获取源表的表结构、索引等信息。 其次,复制源表结构并修改表名为目标名字,然后执行创建新表的语句。通过这步操作, 就可以获得一个和源表结构一样的克隆表了。 最后,执行 INSERT INTO…SELECT 语句,从源表复制数据到新表内。
mysql> show create table info \G;   <---查看info表的创建过程
*************************** 1. row ***************************
       Table: info
Create Table: CREATE TABLE "info" (
  "id" int(3) NOT NULL AUTO_INCREMENT,
  "name" varchar(10) NOT NULL,
  "score" decimal(5,2) DEFAULT NULL,
  "address" varchar(50) DEFAULT '未知',
  PRIMARY KEY ("id")
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR: 
No query specified

复制info的表结构创建语句用来创建新表test2

mysql> CREATE TABLE "test2" (      
    ->   "id" int(3) NOT NULL AUTO_INCREMENT,
    ->   "name" varchar(10) NOT NULL,
    ->   "score" decimal(5,2) DEFAULT NULL,
    ->   "address" varchar(50) DEFAULT '未知',
    ->   PRIMARY KEY ("id")
    -> ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> desc test2;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   |     | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(50)  | YES  |     | 未知    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

在test2插入info表的所有记录

mysql> insert into test2 select * from info;
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test2;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  3 | shengjie | 80.00 | nanjing |
|  4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)

四、数据库用户授权

MySQL 数据库的 root 用户账号拥有对所有数据库、表的全部权限,频繁使用 root 账号 会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负 责一部分数据库、表的管理和维护操作,甚至可以对查询、修改、删除记录等各种操作做进 一步的细化限制,从而将数据库的风险降至最低。

1、用户权限

查看服务器所支持的不同权限,可以看到数据库可以对以下操作对用户进行授权

mysql> show privileges;
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege               | Context                               | Comment                                               |
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Alter                   | Tables                                | To alter the table                                    |
| Alter routine           | Functions,Procedures                  | To alter or drop stored functions/procedures          |
| Create                  | Databases,Tables,Indexes              | To create new databases and tables                    |
| Create user             | Server Admin                          | To create new users                                   |
| Delete                  | Tables                                | To delete existing rows                               |
| Drop                    | Databases,Tables                      | To drop databases, tables, and views                  |
| Event                   | Server Admin                          | To create, alter, drop and execute events             |
| Execute                 | Functions,Procedures                  | To execute stored routines                            |
| File                    | File access on server                 | To read and write files on the server                 |
| Grant option            | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess   |
| Index                   | Tables                                | To create or drop indexes                             |
| Insert                  | Tables                                | To insert data into tables                            |
| Lock tables             | Databases                             | To use LOCK TABLES (together with SELECT privilege)   |            
| Reload                  | Server Admin                          | To reload or refresh tables, logs and privileges      |
| Select                  | Tables                                | To retrieve rows from table                           |
| Show databases          | Server Admin                          | To see all databases with SHOW DATABASES              |
| Show view               | Tables                                | To see views with SHOW CREATE VIEW                    |
| Shutdown                | Server Admin                          | To shut down the server                               |
| Super                   | Server Admin                          | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.   |
| Trigger                 | Tables                                | To use triggers                                       |
| Create tablespace       | Server Admin                          | To create/alter/drop tablespaces                      |
| Update                  | Tables                                | To update existing rows                               |
| Usage                   | Server Admin                          | No privileges - allow connect only                    |
+-------------------------+---------------------------------------+-------------------------------------------------------+
31 rows in set (0.00 sec)

2、授予授权

GRANT 语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时, GRANT 语句将会创建新的用户;当指定的用户名存在时,GRANT 语句用于修改用户信息。

语法:
GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 [ IDENTIFIED BY '密码' ]

使用 GRANT 语句时,需要注意的事项如下。

  • 权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select,insert,update”。使用“all”表示所有权限,可授权执行任何操作。
  • 数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“*”。
  • 用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段 内的所有地址,如“%.bdqn.com”“192.168.1.%”等。
  • IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时, 若省略“IDENTIFIE BY”部分,则用户的密码将为空。 使用 GRANT 语句授权的用户记录,会保存到 mysql 库的user、db、host、tables_priv 等相关表中,无须刷新即可生效。

新建用户shengjie,只能在本地登录

mysql> create user shengjie@'localhost';
Query OK, 0 rows affected (0.01 sec)

修改shengjie的密码为abc123

mysql> alter user shengjie@'localhost' identified by 'abc123';
Query OK, 0 rows affected (0.06 sec)

查看数据库的所有用户的用户名,登录终端和密码,密码已经加密

mysql> select user,host,authentication_string from mysql.user;
+-----------+-----------+-------------------------------------------+
| user      | host      | authentication_string                     |
+-----------+-----------+-------------------------------------------+
| root      | localhost | *6691484EA6B50DDDE1926A220DA01FA9E575C18A |
| mysql.sys | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root      | %         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| shengjie  | localhost | *6691484EA6B50DDDE1926A220DA01FA9E575C18A |
+-----------+-----------+-------------------------------------------+
4 rows in set (0.01 sec)

删除用户shengjie

mysql> drop user shengjie@'localhost';
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host,authentication_string from mysql.user;
+-----------+-----------+-------------------------------------------+
| user      | host      | authentication_string                     |
+-----------+-----------+-------------------------------------------+
| root      | localhost | *6691484EA6B50DDDE1926A220DA01FA9E575C18A |
| mysql.sys | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root      | %         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

新建shangzhen用户授权他可以创建,修改,查询,插入,删除的操作对所有库和表在本地,密码为abc123

mysql> grant create,update,select,insert,delete on *.* to shangzhen@'localhost' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.02 sec)

查看shangzhen的权限

mysql>  show grants for shangzhen@'localhost';
+--------------------------------------------------------------------------------+
| Grants for shangzhen@localhost                                                 |
+--------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON *.* TO 'shangzhen'@'localhost' |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)

新建用户tangyan,密码为123,授权他所有操作,并且还可以给别人授权的权限,但是他只能从192.168.245.0网段登陆

mysql> grant all on *.* to tangyan@'192.168.245.%' identified by '123' with grant option;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show grants for tangyan@'192.168.245.%';   <--查看tangyan用户的授权
+----------------------------------------------------------------------------+
| Grants for tangyan@192.168.245.%                                           |
+----------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'tangyan'@'192.168.245.%' WITH GRANT OPTION |
+----------------------------------------------------------------------------+
1 row in set (0.00 sec)

新建zhangsan用户授权他只能对school库进行查询的操作,密码为123

mysql> grant select on school.* to 'zhangsan'@'localhost' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

以zhangsan的身份重新登录数据库,只能对school进行查询操作,不能进行其他操作

[root@localhost ~]# mysql -uzhangsan -p
Enter password: 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| school             |
+--------------------+
2 rows in set (0.01 sec)

mysql> delete from info;
ERROR 1142 (42000): DELETE command denied to user 'zhangsan'@'localhost' for table 'info'

mysql> select * from info;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  3 | shengjie | 80.00 | nanjing |
|  4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)

3、查看权限

SHOW GRANTS 语句:专门用来查看数据库用户的授权信息,通过 FOR 子句可指定 查看的用户对象(必须与授权时使用的对象名称一致)

语法:
SHOW GRANTS FOR 用户名@来源地址

查看root用户的权限

mysql> show grants for root;
+-------------------------------------------------------------+
| Grants for root@%                                           |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.01 sec)

查看当前登录的用户权限

mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

查看shangzhen用户的权限,用户名@登录地址这是一个整体,必须要全部写上

mysql>  show grants for shangzhen@'localhost';
+--------------------------------------------------------------------------------+
| Grants for shangzhen@localhost                                                 |
+--------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON *.* TO 'shangzhen'@'localhost' |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4、撤销权限

REVOKE 语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然可以连接到 MySQL 服务器,但将被禁止执行对应的数据库操作

语法:
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址

取消shangzhen用户的create权限

mysql> revoke create on *.* from shangzhen@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for shangzhen@'localhost';
+------------------------------------------------------------------------+
| Grants for shangzhen@localhost                                         |
+------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'shangzhen'@'localhost' |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)

注意:通过回收授权来修改授权,不能够通过重复授权来修改权限

猜你喜欢

转载自blog.csdn.net/shengjie87/article/details/108371511