|
修改数据库的字符集或排序规则: ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]
删除数据库:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
使用客户端命令创建数据库:
~]# mysqladmin create mydb
~]# mysql -e "create database mydb;"
使用客户端命令删除数据库:
~]# mysqladmin drop mydb //会对删除数据库的操作进行确认;
~]# mysql -e "drop database mydb;"
表:
创建表:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
//使用SQL语句全新的定义出一张新表,包括表的名称、字段数量、数据类型、存储引擎的选择等各种属性;
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
select_statement
//利用SELECT语句的查询结果来填充新表的内容,但是新表的表格式可能与基表不一致,很多的数据类型的修饰符可能会丢失;
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
//直接复制基本的表格式到新表上,但新表中没有任何数据,即为空表;
注意:
1.对于MySQL或MariaDB的表来说,存储引擎是非常重要的概念,通常需要在创建表的时候来指定;如果没有明确指定,则使用默认的存储引擎;
2.对于已经创建完成的空表,可以任意调整其存储引擎;
3.对于非空表,不建议直接修改表的存储引擎;
良心建议:在创建表之初或者存储数据之前,确定表的存储引擎;
删除表:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE]
建议:使用修改表名称的方式使指定表不再被继续使用;
修改表格式:
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [,> 可以修改的内容:
ADD:字段,索引,约束,键(主键,唯一键,外键)
CHANGE:字段名称,字段定义格式和字段的位置;
MODIFY:字段定义格式和字段的位置;
DROP:字段,索引,约束,键;
RENAME:修改表名称;
查看表结构:
DESC [db_name.]tbl_name;
查看表的定义方式:
SHOW CREATE TABLE tbl_name;
查看表的状态和属性信息:
SHOW TABLE STATUS [from | in db_name] like 'PATTERN' | where expr;
示例:
MariaDB [hellodb]> show table status where name='students'\G
视图:VIEW,虚表;
就是一个SELECT语句的执行结果;
创建视图:
CREATE VIEW view_name [(column_list)] AS SELECT clause;
示例:
MariaDB [hellodb]> create view student as select StuID,Name,Gender from students;
删除视图:
DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]
示例:
MariaDB [hellodb]> drop view student;
注意:
能否在视图中实现插入新的数据记录,取决于基表中没有被视图选择的字段是否要求不能为空,如果有此类约束,则结果是无法插入新数据;否则可以插入新数据,没有被视图选择的字段内容,默认都为"NULL";
索引:
索引的类型:
聚集索引、非聚集索引:
聚集索引:索引和数据存放在一起,找到索引即找到数据;
非聚集索引:索引和数据不存放在一起,索引通过索引指针指向数据所在位置;
稠密索引、稀疏索引:是否索引了每一条数据记录;
稠密索引:每条数据记录都有一条索引与之对应;
稀疏索引:并不是每条数据记录都有一条索引与之对应,而是一条索引对应某个或某些数据块;
主键索引、辅助索引:
BTree:Balance Tree,B- Tree,BTree,B+Tree
左前缀索引:
注意:在使用BTree索引进行检索时,给出的PATTERN的最左侧字符不要出现通配符,否则,无法使用索引进行检索;只能全文遍历;
Hash索引:
R Tree:Spacial,空间索引;
FULLTEXT:全文索引;
覆盖索引:索引中的内容就是要检索的内容,通过检索索引内容即可立即找到数据,并直接返回检索结果;
EXPLAIN:分析查询语句的执行路由;
创建索引:
1.在创建表时,通过指定主键或唯一键,可以自动创建索引;
2.如果在创建表时,没有指定主键或唯一键,则可以在表成功创建之后添加索引;
CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option] ...
示例:
MariaDB [hellodb]> create index name_index on students(Name);
查看索引:
SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]
示例:
MariaDB [hellodb]> show index from students\G
删除索引:
DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name
示例:
MariaDB [hellodb]> drop index name_index on students;
DML:操纵数据;
INSERT/REPLACE、DELETE、UPDATE、SELECE
INSERT:向表中插入新的数据记录;每次可以向表中插入一行或多行数据;
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
示例:
MariaDB [hellodb]> insert into students (Name,Age,Gender) values ('Rio Messi',31,'M');
MariaDB [hellodb]> insert into students (Name,Age,Gender) values ('Guo Jing',40,'M'),('Huang Rong',27,'F');
没有明确的规定字段名称,则意味着为一行中的各个字段添加数据内容:
MariaDB [hellodb]> insert into students values (30,'Liu Bei',57,'M',1,2);
注意:添加的数据内容,必须要严格的对应每个数据字段,需要保证数据类型的匹配;
INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
示例:
MariaDB [hellodb]> insert into students set Name='Tang Xuanzang',Age=35,Gender='M';
INSERT [INTO] tbl_name [(col_name,...)] SELECT ...
将后面SELECT语句的查询结果插入到选中的目标表中;注意下列问题:
1.SELECT语句的查询结果中包含的字段数量,应该和目标表中的指定字段数量相同;
2.SELECT语句的查询结果中包含的各字段的数据类型,必须要与目标表中各字段的数据类型保持一致;
此种插入数据的方法,更多的用于表复制操作;
此前曾经使用CREATE TABLE命令通过复制表格式的方式创建过一个空的新表,然后再将原表中的数据以方法复制到新表中;
REPLACE命令与INSERT命令的功能几乎完全相同,除了一种特殊情况之外:
当向表中插入数据时,如果主键位置或唯一键位置出现重复数据时,不会继续插入而是选择替换对应行中各字段的数据;
DELETE:
Single-table syntax:
DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
Multiple-table syntax:
DELETE tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition]
Or:
DELETE FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition]
注意:默认情况下,MySQL或MariaDB都不会阻止不带有WHERE条件子句的删除操作,这将意味着,有可能会因为此操作导致清空整张表中的数据;
限制条件:
WHERE where_condition
LIMIT row_count
ORDER BY ... LIMIT row_count
WHERE where_condition LIMIT row_count
WHERE where_condition ORDER BY ... LIMIT row_count
示例:
MariaDB [hellodb]> delete from students limit 3;
删除正常的查询结果中的前三行数据记录;
MariaDB [hellodb]> delete from students where Age delete from students where Name like 'h%' limit 2;
删除Name字段以"H|h"开头的所有数据记录中的前两条记录;
MariaDB [hellodb]> delete from students order by age desc limit 3;
删除根据Age字段进行降序排序的查询结果中的前三条数据记录;
UPDATE:
Single-table syntax:
UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
Multiple-table syntax:
UPDATE table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]
注意:默认情况下,MySQL或MariaDB都不会阻止不带有WHERE条件子句的修改操作,这将意味着,有可能会因为此操作导致整张表中的所有数据记录被同时修改;
限制条件:
WHERE where_condition
LIMIT row_count
ORDER BY ... LIMIT row_count
WHERE where_condition LIMIT row_count
WHERE where_condition ORDER BY ... LIMIT row_count
示例:
同DELETE的示例;
注意:在MySQL或MariaDB中,如果服务器变量sql_safe_updates=ON,则可以阻止不带有限制条件的UPDATE更新操作或DELETE删除操作;
临时调整:
MariaDB [hellodb]> set @@sql_safe_updates=ON;
永久生效:/etc/my.cnf
sql_safe_updates=ON
MariaDB [hellodb]> update students set> ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
SELECT
Query Cache:MySQL/MariaDB的查询结果缓存;
K/V对存储;
Key:查询语句经过hash之后的hash值;
Value:查询语句的执行结果;
MySQL/MariaDB的查询执行路径:
1.用户发送请求 --> 查询缓存(命中) --> 响应用户;
2.用户发送请求 --> 查询缓存(未命中) --> 解析器 --> 预处理器 --> [查询优化器 -->] 查询执行引擎 --> 存储引擎 --> 查询执行引擎 --> [缓存查询结果 -->] 响应用户;
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
DISTINCT:数据去重;即:重复出现的数据仅显示一次;
SQL_CACHE:
显式的指出必须将此次的查询语句的执行结果存放至查询缓存;
SQL_NO_CACHE:
显式的指出绝对不能将此次的查询语句的执行结果存放至查询缓存;
query_cache_type服务器变量是MySQL的缓存开关,通常有三个取值:
1.ON:启用缓存功能;
默认缓存所有符合缓存条件的查询结果;除非使用SQL_NO_CACHE参数明确指出不缓存查询结果;
2.OFF:关闭缓存功能;
默认不缓存任何查询结果;仅能缓存使用SQL_CACHE参数明确的指出的查询结果;
3.DEMAND:按需缓存;
如果明确指出SQL_CACHE,即缓存查询结果,否则,默认隐式关闭查询缓存;
query_cache_limit | 1048576
query_cache_min_res_unit | 4096
select_expr:
*:表示表中的所有字段(列);
col1,col2,...coln:普通的列名列表;通常用于执行投影运算;
col_name1 as col_alias1,col_name2 as col_alias2, ...
对于查询结果中的各字段名称使用别名进行重定义;
table_references:
[db_name.]tbl_name
db_name.*
[db_name.]tbl_name1,[db_name.]tbl_name2, ...
[db_name.]tbl_name1 as tbl_alias1,[db_name.]tbl_name2 as tbl_alais2, ...
单表查询:
select select_expr1,select_expr2,... from tbl_name where expr group by col_name having expr order by col_name limit
WHERE条件子句:
通过指明特定的过滤条件或表达式来实现"选择"运算;过滤条件有下列几种:
1.算术表达式:Age+10,
算术操作符:+, -, *, /, %;
2.比较表达式:Age+10, >=, 统计每个班级里面所有人的平均年龄:
MariaDB [hellodb]> select> 统计所有学生中男生和女生的平均年龄:
MariaDB [hellodb]> select Gender,avg(Age) as nos from students group by Gender;
HAVING子句:对于经过分组归类并进行了聚合运算以后的结果进行条件过滤;
其条件表达式的书写格式与WHERE子句相同;
示例:
统计人数超过3人的班级及其人数数据:
MariaDB [hellodb]> select> ORDER BY子句:根据指定的字段将查询结果进行排序,可以使用升序或降序,默认是升序;
升序:ASC
降序:DESC
示例:
MariaDB [hellodb]> select> LIMIT子句:
对于查询的结果进行限定行数的输出;
LIMIT {[offset,] row_count | row_count OFFSET offset}
1.LIMIT [offset,] row_count
offset:偏移量,在输出结果中,从第一行开始(含)跳过的不显示的行数;
row_count:要显示的行数;
示例:显示查询结果中的第二行和第三行;
MariaDB [hellodb]> select> 2.LIMIT row_count OFFSET offset
示例:显示查询结果中的第二行和第三行;
MariaDB [hellodb]> select> 多表查询:
建议:在生成环境中,能使用单表查询即可得到结果的操作,尽可能使用单表查询;因为多表查询会给服务器造成过大的负载压力;
所谓多表查询,即指通过对多个表内容的查询,以获得具有一定关联关系的查询结果的查询方式;也称为连接操作,连接操作也就是将多张表关联在一起的方法;
连接操作:
交叉连接:
也称为笛卡尔积连接;
内连接:
等值连接:让表和表之间通过某特定字段的等值判断的方式建立的内连接;
非等值连接:让表和表之间通过某特定字段的不等值判断的方式建立的内连接;在极少的场合中才有应用;
外连接:以某张为基准表,判断参考表与基准表之间的连接关系;
左外连接:
以左表为基准表,右表为参考表,显示出基准表中所有的行,并将参考表中与基准表中有关联关系的行合并输出,如果基准表中的行与参考表中无关,则输出NULL;
连接操作符:LEFT JOIN
右外连接:
以右表为基准表,左表为参考表,显示出基准表中所有的行,并将参考表中与基准表中有关联关系的行合并输出,如果基准表中的行与参考表中无关,则输出NULL;
连接操作符:RIGHT JOIN
自然连接:
通过MySQL的进程自行判断并完成的连接过程。通常MySQL会使用表中的名称相同的字段作为基本的连接条件;
连接操作符:NATRUAL INNER
自然外连接:
自然左外连接:
连接操作符:NATURAL LEFT JOIN
自然右外连接:
连接操作符:NATURAL RIGHT JOIN
自连接:
人为的将一张表中的两个字段之间建立的连接关系;
示例:
交叉内连接:
每个学生所在的班级名称:
MariaDB [hellodb]> select Name,Class from students as s,classes as c where s.CLassID=c.ClassID;
MariaDB [hellodb]> select Name,Class from students,classes where students.CLassID=classes.ClassID;
交叉左外连接:
每个学生所在班级的名称,即使该学生不属于任何班级:
MariaDB [hellodb]> select Name,Class from students left join> 交叉右外连接:
每个班级的学生姓名,即使该班级中没有任何学生;
MariaDB [hellodb]> select> ||
MariaDB [hellodb]> select> 子查询:嵌套查询;
在SELECT查询语句中嵌套另一个SELECT查询语句;等同于从某个视图中获取查询结果;
SELECT col1,col2,* FROM tbl_name WHERE col OPTS VALUE;
示例:
用于WHERE子句中的子查询:
查询学生中年龄大于全班平均年龄的学生的姓名和年龄;
MariaDB [hellodb]> select Name,Age from students where Age>(select avg(Age) from students);
用于IN子句中的子查询:
查询学生的年龄和老师的年龄相同的学生的名字:
MariaDB [hellodb]> select Name from students where Age in (select Age from teachers);
查询学生的年龄和老师的年龄相同的学生和老师的名字:
MariaDB [hellodb]> select t.Name as Teacher,s.Name as Student from students as s,teachers as t where s.Age=t.Age;
用于FROM子句的子查询:
查询有班级的学生对应的班级名称:
MariaDB [hellodb]> select s.Name,s.Class from (select StuID,students.Name,students.Age,Gender,Class from students,classes where students.ClassID=classes.ClassID) as s;
联合查询:
将多张表的内容通过多个SELECT语句查询得到的结果组合输出;
注意:使用联合查询的前提条件:
多张表需要有相同数据类型的字段;
操作符:UNION
示例:
MariaDB [hellodb]> select StuID as> select查询:
单表查询 --> 多表查询(交叉内连接) --> 多表查询(外连接) --> 子查询 --> 联合查询;
MySQL的用户和权限管理:
用户账号:
'Username'@'Hostname'
skip_name_resolve = ON
'user'@'172.16.0.1'
'user'@'a.qhdlink.com'
skip_name_resolve = OFF
Client_IP --> Client_Hostname
在MySQL上能够实施的用户账户的管理操作:
CREATE USER
DROP USER
GRANT
RENAME USER
REVOKE
SET PASSWORD
MySQL中的权限类别:
库级别;
表级别;
字段级别;
管理类;
程序类;
管理类的权限:
CREATE USER
DROP USER
RELOAD
LOCK TABLES
REPLICATION CLIENT
REPLICATION SLAVE
SHUTDOWN
FILE
SHOW DATABASES
PROCESS
SUPER
程序类的权限:
FUNCTION
PROCEDURE
TRIGGER
操作:CREATE,ALTER,DROP,EXECUTE
库级别和表级别的权限:
CREATE
ALTER
SHOW
DROP
INDEX
CREATE VIEW
SHOW VIEW
GRANT OPTION:能够将管理员自身获得的权限生成一个副本,并转赠给目标用户;
表级别的数据操作的权限:
INSERT
REPLACE
DELETE
UPDATE
SELECT
字段级别(列级别)的数据操作的权限:
SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)
所有的权限:
ALL
ALL PRIVILEGES
MySQL的元数据数据库:mysql
数据字典数据库;
host
db
user
column_priv
procs_priv
proxies_prive
tables_priv
上述元数据数据库中的表统称为"授权表";
如果对于授权表的内容进行了修改,MySQL每300秒会自动重读并使新设置生效;
如果不打算等待,可以手动刷新授权表:
MariaDB [mysql]> FLUSH PRIVILEGES;
MySQL用户管理:
'Username'@'Hostname'
Username:任意的字符串组合,只能包含基本意义的字符;可以包含"_"、"."、"-";
Hostname:
FDQN
Domain_name
IP_ADDRESS
可以使用MySQL的专用通配符:%, _
skip_name_resolve={ON|OFF}
创建用户账户:
CREATE USER语句:
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password' |> 示例:
MariaDB [mysql]> create user 'testuser'@'%';
MariaDB [mysql]> create user 'testuser'@'%'> 也可以使用DML语句创建用户账户:
INSERT INTO mysql.user SET User='testuser',Host='%',Password=PASSWORD('qhdlink');
示例:
MariaDB [mysql]> insert into user set User='user1',Host='%',Password=PASSWORD('qhdlink'),ssl_cipher='',x509_issuer='',x509_subject='',authentication_string='';
重命名用户账户:
RENAME USER语句:
RENAME USER old_user TO new_user [, old_user TO new_user] ...
示例:
MariaDB [mysql]> rename user 'testuser'@'%' to 'test'@'172.16.%.%';
也可以使用DML语句重命名用户账户:
示例:
MariaDB [mysql]> update user set User='user01',Host='172.16.75.%' where User='user1';
删除用户账户:
DROP USER语句:
DROP USER user [, user] ...
示例:
MariaDB [mysql]> drop user 'test'@'172.16.%.%';
也可以使用DML语句删除用户账户:
示例:
MariaDB [mysql]> delete from user where User='user01';
用户账户的密码管理:
1.SET PASSWORD语句:
SET PASSWORD [FOR user] = { PASSWORD('cleartext password') | OLD_PASSWORD('cleartext password') | 'encrypted password' }
示例:
MariaDB [mysql]> set password for 'test'@'%' = PASSWORD('qhdlink');
2.也可以使用DML语句修改用户账户密码:
示例:
MariaDB [mysql]> update user set Password=PASSWORD('qhdlink.com') where User='test';
3.mysqladmin工具:
# mysqladmin -uUSERNAME -hHOSTNAME -p password 'NEW_PASSWORD'
注意:执行此操作的MySQL用户需要对mysql.user表有修改权限;
忘记MySQL管理员的密码的解决办法:
方法一:
1.停止当前的MySQL或MariaDB服务;
2. 在/etc/my.cnf文件中加入下列两条服务器参数:
skip-grant-tables = ON
skip-networking = ON
3.启动MySQL或MariaDB服务,使用mysql或mysqladmin客户端工具以空秘密的root用户登录,进行root用户的密码修改;
4.从/etc/my.cnf中删除上述两条服务器参数,再重启服务即可;
方法二:
1.停止当前的MySQL或MariaDB服务;
2.使用命令启动MySQL服务:
# mysqld_safe --skip-grant-tables --skip-networking
3.启动另一个会话连接,并使用mysql或mysqladmin客户端工具以空密码的root用户的身份修改其密码;
4.kill掉此前的mysqld-safe及衍生的mysqld服务;
5.再正常启动服务即可;
对于已经建立的用户或未建立的用户进行授权:
GRANT语句:
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
priv_type:
SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX,> object_type:
TABLE | FUNCTION | PROCEDURE
priv_level:
* | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name
*:表示所有的数据库;
*.*:表示所有数据库中的所有表对象;
db_name.*:表示指定数据库中的所有表对象;
db_name.tbl_name:表示指定数据库中的指定的表对象;
tbl_name:表示当前正在使用的数据库中的指定的表对象;
db_name.routine_name:表示指定数据库中的指定存储函数后存储过程对象;通常需要使用object_type参数共同决定;
user_specification:
user [> ssl_option:
SSL | X509 | CIPHER 'cipher' | ISSUER 'issuer' | SUBJECT 'subject'
with_option:
GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count | MAX_USER_CONNECTIONS count
示例:
MariaDB [mysql]> grant all privileges on hellodb.* to 'test'@'%';
MariaDB [mysql]> grant select,update on hellodb.students to 'test'@'%';
MariaDB [mysql]> grant select(Name,Age,ClassID) on hellodb.students to 'test'@'%';
也可以对某些基本表创建视图之后,再对视图进行用户权限授权:
MariaDB [hellodb]> create view stu_base as select Name,Age,ClassID from students;
MariaDB [hellodb]> grant all on hellodb.stu_base to 'test'@'%';
取消授权/收回授权:
REVOKE语句:
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...
示例:
MariaDB [mysql]> revoke delete on hellodb.* from 'test'@'%';
MariaDB [mysql]> revoke all on hellodb.students from 'test'@'%';
MariaDB [mysql]> revoke select(Age,ClassID) on hellodb.students from 'test'@'%';
注意:在取消已经做出的授权时,REVOKE语句所指定的priv_level部分应该和授权时GRANT语句所指定的priv_level保持绝对一致;否则判定此次取消授权的操作失败;
示例:前提是testdb数据库中包含有tb1和tb2两张表;
MariaDB [testdb]> grant all on testdb.* to 'test'@'%';
MariaDB [testdb]> revoke all on testdb.tb2 from 'test'@'%';
ERROR 1147 (42000): There is no such grant defined for user 'test' on host '%' on table 'tb2'
正确的取回授权的方式:
MariaDB [testdb]> revoke all on testdb.* from 'test'@'%';
MariaDB [testdb]> grant all on testdb.tb1 to 'test'@'%';
此时,'test'@'%'用户就只有对testdb数据库中tb2表有所有操作权限;
查看用户的授权:
SHOW GRANTS语句:
SHOW GRANTS [FOR user]
|
|