在熟悉安装及访问 MySQL 数据库以后,接下来将学习使用 MySQL 数据库的基本操作, 这也是在服务器运维工作中不可或缺的知识
MySQL 是一套数据库管理系统,在每台 MySQL 服务器中,均支持运行多个数据库, 每个数据库相当于一个容器,其中存放着许多表,如图所示
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)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”一样。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 是 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。CREATE DATABASE 语句:用于创建一个新的数据库,需指定数据库名称作为参数。
创建school数据库
mysql> CREATE DATABASE school; Query OK, 1 row affected (0.00 sec)刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/data 目录下会自动生成一个与新建的数据库名相同的文件夹。
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)DROP TABLE 语句:用于删除数据库中的表,需要指定“数据库名.表名”作为参数;若 只指定表名参数,则需先通过执行“USE”语句切换到目标数据库
mysql> drop table info; Query OK, 0 rows affected (0.01 sec)DROP DATABASE 语句:用于删除指定的数据库,需要指定数据库名作为参数
mysql> drop database auth; Query OK, 0 rows affected (0.00 sec)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)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 语句会修改或删除所有的记录,是非常危险的操作。
delete 只能删除表中的数据,表结构还在
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)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.在 MySQL 数据库服务器中,用于访问数据库的各种用户(如 root)信息都保存在 mysql 数据库的 user 表中,管理员可以直接修改其中的数据记录来完成密码修改或权限赋予,但值得注意的是,应当尽量减少人工操作,避免由于操作失误导致数据库无法访问或连接不到数据库等问题。通常都是给对应业务最小权限,某业务用户只负责查询,则只需要给赋予 SELECT 权限即可。
事务的begin、commit以及权限的grant、revoke都属于DCL语言,后面会有详细介绍。
清空一个数据表就是删除这个表内的所有数据。前面已经学习过 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 开始重新记录。
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在 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 账号 会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负 责一部分数据库、表的管理和维护操作,甚至可以对查询、修改、删除记录等各种操作做进 一步的细化限制,从而将数据库的风险降至最低。
查看服务器所支持的不同权限,可以看到数据库可以对以下操作对用户进行授权
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)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)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)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)注意:通过回收授权来修改授权,不能够通过重复授权来修改权限