设为首页 收藏本站
查看: 1093|回复: 0

[经验分享] MariaDB(MySQL)数据库的介绍及使用示例

[复制链接]

尚未签到

发表于 2018-10-5 07:51:24 | 显示全部楼层 |阅读模式
修改数据库的字符集或排序规则:  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]


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-612431-1-1.html 上篇帖子: MySQL主从复制原理深入讲解 下篇帖子: MySQL/MariaDB基础知识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表