《MySQL必知必会》学习笔记3:19-28章

INSERT数据插入

  1. 插入完整的行;

    INSERT INTO 表名
    VALUES(各列的值);
    

    如果某个列没有值,应该使用NULL值(假定表允许对该列指定空值)。
    各个列必须以它们在表定义中出现的次序填充。

  2. 插入行的一部分;

    INSERT INTO 表名(部分列名)
    VALUES(对应的列值);
    

    省略的列必须满足:该列定义为允许NULL值(无值或空值);在表定义中给出默认值

    如需优先检索,然后插入语句,可以使用 INSERT LOW_PRIORITY INTO语句

  3. 插入多行;

    INSERT INTO 表名(部分列名)
    VALUES (对应的列值集合1)<,(对应的列值集合2)>;
    
  4. 插入某些查询的结果:将一条SELECT语句的结果插入表中

    INSERT INTO 表名(部分列名)
    SELECT (相应个数的列名且对应数据类型相同)
    FROM 表名
    [WHERE 子句];
    

    UPDATE、DELETE语句可以使用子查询,使得能用SELECT语句检索出的数据更新列数据

UPDATE 表名
SET 列名1 = 表达式/[,列名2 = 表达式/...]
[WHERE 子句];

部分删除:UPDATE使某列值为NULL

整行删除:如无WHERE子句,删除所有行
DELETE FROM 表名
[WHERE 子句];

如果想从表中删除所有行,不要使用DELETE。
可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快
(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。

  1. 创建表

    CREATE TABLE 表名(
    	列名 数据类型 [列级完整性数据约束条件:UNSIGNED、ZEROFILL、[NOT] NULL、AUTO_INCREMENT
    				、DEFAULT 常量、COMMENT ''、UNIQUE、PRIMATY KEY],
    	表级完整性约束条件:主键PRIMARY KEY(,)、外键FOREIGN KEY() REFERENCE 外表(主键)、
    	唯一性约束UNIQUE()、列约束CHECK(判断表达式)
    ) ENGINE=[InooDB | MyISAM | MEMORY ...],.... ;
    

    表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
    CONSTRAINT 约束名 约束

    返回最后一个AUTO_INCREMENT值: SELECT last_insert_id();

  2. 修改表

    数据库表的更改不能撤销,使用ALTER TABLE要极为小心,应该在进行改动前做一个完整的备份(模式和数据的备份)。

    比较有意义的操作是定义外键(约束):

     ALTER TABLE 表名
     ADD CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 外表(主键)[,其他修改];
    

    单个表进行多个更改,可以使用单条ALTER TABLE语句,每个更改用逗号分隔
    DROP 列名
    MODIFY 列名 数据类型 列级完整性约束

    复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:
    1.用新的列布局创建一个新表;
    2.使用INSERT INTO 新表(列名) SELECT语句从旧表复制数据到新表。如果有必要,可使用转换函数和计算字段;
    3.检验包含所需数据的新表;
    4.重命名旧表(如果确定,可以删除它);
    5.用旧表原来的名字重命名新表;
    6.根据需要,重新创建触发器、存储过程、索引和外键。

  3. 删除表
    DROP TABLE 表名;

  4. 重命名表
    RENAME TABLE 旧名 TO 新名<,旧名 TO 新名>;

视图

MySQL 5添加了对视图的支持。
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
视图仅仅是用来查看存储在别处的数据的一种设施。
视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。

为什么使用视图:
1.重用SQL语句。
2.简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
3.使用表的组成部分而不是整个表。
4.保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
5.更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

在视图创建之后,可以用与表基本相同的方式利用它们。
可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,
甚至能添加和更新数据(有限制)

规则:
与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
对于可以创建的视图数目没有限制
为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予。
视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。
ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖
视图不能索引,也不能有关联的触发器或默认值
视图可以和表一起使用。例如,编写一条联结表和视图的SELECT语句。

  1. 使用视图:
    视图用CREATE VIEW语句来创建。
    使用SHOW CREATE VIEW viewname;来查看创建视图的语句。
    用DROP删除视图,其语法为DROP VIEW viewname;。
    更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。
    如果要更新的视图不存在,则第2条更新语句会创建一个视图;
    如果要更新的视图存在,则第2条更新语句会替换原有视图

  2. 利用视图简化复杂的联结

     订购了任意产品的客户
     CREATE VIEW productcustomers AS
     SELECT cust_name,cust_contact,prod_id
     FROM customers,orders,orderitems
     WHERE customers.cust_id = orders.cust_id
     AND orderitems.order_num = orders.order_num;
     编写好后根据条件取出需要的行,SELECT语句就像对表的操作
     SELECT 列名
     FROM productcustomers
     [WHERE 子句];
    
  3. 用视图过滤不想要的数据

     CREATE VIEW customeremaillist AS
     SELECT cust_id,cust_name,cust_email
     FROM customers
     WHERE cust_email IS NOT NULL;
    

    导出列作为视图:

  4. 使用视图与 计算 字段

    CREATE VIEW vendorlocations AS
    SELECT prod_id,
      	 quantity,
      	 item_price,
      	 quantity*item_price AS expanded_price
    FROM orderitems
    WHERE order_num = 20005;
    
  5. 使用视图重新格式化检索出的数据——拼接

    CREATE VIEW orderitemsexpanded AS	
    SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS vend_title
    FROM vendors
    ORDER BY vend_name;
    
  6. 视图定义中有以下操作,则不能进行视图的更新
    分组(使用GROUP BY和HAVING);
    联结;
    子查询;
    并;
    聚集函数(Min()、 Count()、 Sum()等);
    DISTINCT;
    导出(计算)列

存储过程:

  1. 一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。

  2. 执行:
    CALL 存储过程;
    CALL productpricing(@pricelow,@pricehigh,@priceaverage); @开头的为定义的变量
    执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格。

  3. 创建

    CREATE PROCEDURE productpricing()
    BEGIN
    	 SELECT AVG(prod_price) AS priceaverage
    	 FROM products;
    END;
    
    CALL productpricing();
    显示结果  priceaverage : xxxxx.xxxxxx
    

    命令行中;为结束,创建存储过程会有多个;导致语句提前结束出现错误
    利用DELIMITER暂时修改结束符号,如 DELIMITER //
    END // 完成创建
    然后 DELIMITER ; 恢复;结束

    使用参数:

    CREATE PROCEDURE productpricing(
    	OUT pl DECIMAL(8,2),
    	OUT ph DECIMAL(8,2),
    	OUT pa DECIMAL(8,2)
    )
    BEGIN
    	 SELECT MIN(prod_price)
    	 INTO pl 
    	 FROM products;
    	 SELECT MAX(prod_price)
    	 INTO ph 
    	 FROM products;
    	 SELECT AVG(prod_price)
    	 INTO pa 
    	 FROM products;
    END;
    
    CALL productpricing(@pricelow,@pricehigh,@priceaverage);
    	不显示结果,将结果存在3个变量
    SELECT @pricelow,@pricehigh,@priceaverage;
    	显示变量的值(存在其中的结果)
    

    关键字
    OUT:相应的参数用来从存储过程传出一个值(返回给调用者)
    IN:传递给存储过程
    INOUT:对存储过程传入和传出(?)

    关键字使用:

    CREATE PROCEDURE ordertotal(
    	 IN onumber INT,
    	 OUT ototal DECIMAL(8,2)
    )
    BEGIN
    	 SELECT SUM(item_price*quantity)
    	 FROM orderitems
    	 WHERE order_num = onumber
    	 INTO ototal;
    END;
    
    	CALL ordertotal(20005,@total);
    SELECT @total;
    

    案例:包含业务规则和智能处理的存储过程:

    业务场景:
    获得订单合计,但需要对合计增加营业税,不过只针对某些顾客。
    细节:
    获得合计(与以前一样);
    把营业税有条件地添加到合计;
    返回合计(带或不带税)。
    实现: --为注释,COMMENT 为备注

     -- NAME: ordertotal
     -- PARAMETERS: onumber = '订单编号'
     --             taxable = '0为不带税,1为带税'
     --             ototal  = '订单合计变量'
    
     CREATE PROCEDURE ordertotal (
     	 IN onumber INT,
     	 IN taxable BOOLEAN,
     	 OUT ototal DECIMAL(8,2)
     ) COMMENT '获取订单总结,可选的附加税'
     BEGIN
     	 -- 为订单总结声明变量   
     	 DECLEAR total DECIMAL(8,2);
     	 -- 声明税率             
     	 DECLEAR taxrate INT DEFAULT 6;
    
     	 -- 获取订单总价
     	 SELECT SUM(item_price*quantity)
     	 FROM orderitems
     	 WHERE order_num = onumber
     	 INTO ototal;
    
     	 -- 判断是否带税
     	 IF tabable THEN
     	 	-- 加税
     	 	SELECT total+(total/100*taxrate) INTO total;
     	 END IF;
    
     	 -- 存入输出变量
     	 SELECT total INTO ototal;
    
     END;
    
     执行和获得结果
     CALL ordertotal(20005,0,@total);
     SELECT @total;
    

    4.删除和检查
    DROP PROCEDURE [IF EXISTS] 存储过程名;
    SHOW CREATE PROCEDURE 存储过程名; 显示创建存储过程名的CREATE语句
    SHOW PROCEDURE STATUS 存储过程名 [LIKE 子句]; 显示(所有或者有限制的)存储过程的创建时间、由谁创建等详细信息的列表

游标cursor

一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的 结果集。

MySQL中游标只能用于存储过程(和函数)。
存储过程处理完成后,游标就消失(因为它局限于存储过程)。

  1. 创建游标
   CREATE PROCEDURE processorders()
   BEGIN
   	DECLEAR ordernumbers CURSOR
   	FOR
   	SELECT order_num FROM orders;
   END;
  1. 打开和关闭游标
    OPEN 游标名; 处理OPEN语句时执行查询,存储检索出的数据以供浏览和滚动。
    在一个游标关闭后,如果没有重新打开,则不能使用它。但是,使用声明过的游标不需要再次声明,用OPEN语句打开它就可以了。

    CLOSE 游标名; CLOSE释放游标使用的所有内部内存和资源,因此在每个游标不再需要时都应该关闭。
    如果你不明确关闭游标, MySQL将会在到达END语句时自动关闭它。

     CREATE PROCEDURE processorders()
     BEGIN
        -- 声明游标
     	DECLEAR ordernumbers CURSOR
     	FOR
     	SELECT order_num FROM orders;
    
     	-- 打开游标
     	OPEN ordernumbers;
    
     	-- 关闭游标
     	CLOSE ordernumbers;
     END;
    
  2. 使用游标数据
    游标被打开后,可以使用FETCH语句分别访问它的每一行。
    访问一行后,向前移动游标中的内部行指针,可以继续检索下一行
    1.访问一行

    CREATE PROCEDURE processorders()
    BEGIN
    	-- 声明局部变量
    	DECLEAR o INT;
    
       -- 声明游标
    	DECLEAR ordernumbers CURSOR
    	FOR
    	SELECT order_num FROM orders;
    
    	-- 打开游标
    	OPEN ordernumbers;
    
    	-- 获取订单编号,存入变量o
    	FETCH ordernumbers INTO o;
    
    	-- 关闭游标
    	CLOSE ordernumbers;
    END;
    
  3. 循环访问所有行

    CREATE PROCEDURE processorders()
    BEGIN
    	-- 声明局部变量
    	DECLEAR o INT;
    	DECLEAR done BOOLEAN DEFAULT 0;
    
       -- 声明游标
    	DECLEAR ordernumbers CURSOR
    	FOR
    	SELECT order_num FROM orders;
    
    	-- 声明CONTINUE HANDLER  SQLSTATE '02000'是一个未找到条件
    	DELEAR CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    
    	-- 打开游标
    	OPEN ordernumbers;
    
    	-- 开始循环访问所有行
    	REPEAT
    
    		-- 获取订单编号,存入变量o
    		FETCH ordernumbers INTO o;
    
    	-- 结束循环	
    	UNTILE done END REPEAT;
    
    	-- 关闭游标
    	CLOSE ordernumbers;
    END;
    
  4. 实现功能

    CREATE PROCEDURE processorders()
    BEGIN
    	-- 声明局部变量
    	DECLEAR o INT;
    	DECLEAR done BOOLEAN DEFAULT 0;
    	DECLEAR t DECIMAL(8,2);
    
    	-- 创建用于存储结果的表
    	CREATE TABLE IF NOT EXISTS ordertotals(
    		order_num INT,
    		total DECIMAL(8,2)
    	);
    
    
       -- 声明游标
    	DECLEAR ordernumbers CURSOR
    	FOR
    	SELECT order_num FROM orders;
    
    	-- 声明CONTINUE HANDLER  SQLSTATE '02000'是一个未找到条件
    	DELEAR CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    
    	-- 打开游标
    	OPEN ordernumbers;
    
    	-- 开始循环访问所有行
    	REPEAT
    
    		-- 获取订单编号,存入变量o
    		FETCH ordernumbers INTO o;
    
    		-- 执行计算是否的带税的订单总价的存储过程 (IN,IN,OUT 某个订单的总价) 
    		-- 具体代码看上一章
    		CALL ordertotal(o,1,t);
    
    		-- 插入结果表中
    		INSERT INTO ordertotals(order_num,order_total)
    		VALUES (o,t);
    
    	-- 结束循环	
    	UNTILE done END REPEAT;
    
    	-- 关闭游标
    	CLOSE ordernumbers;
    END;
    
    //执行
    CALL processorders();
    //查看结果表
    SELECT * FROM ordertotals;
    

触发器

  1. 定义:MySQL响应任意DELETE/INSERT/UPDATE语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句)

  2. 注意点:
    与其他DBMS相比, MySQL 5中支持的触发器相当初级。未来的MySQL版本中有一些改进和增强触发器支持的计划。

    触发器名必须在每个表中唯一,但不是在每个数据库中唯一。现在最好是在数据库范围内使用唯一的触发器名。
    每个表最多支持6个触发器(每条INSERT、 UPDATE和DELETE的之前和之后)。
    单一触发器不能与多个事件或多个表关联。

    创建触发器可能需要特殊的安全访问权限,但是,触发器的执行是自动的。
    如果INSERT、 UPDATE或DELETE语句能够执行,则相关的触发器也能执行。
    BEFORE触发器或语句本身失败, MySQL将不执行AFTER触发器(如果有的话)。

    应该用触发器来保证数据的一致性(大小写、格式等)。
    在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明地进行,与客户机应用无关。

    触发器的一种非常有意义的使用是创建审计跟踪。
    使用触发器,把更改(如果需要,甚至还有之前和之后的状态)记录到另一个表非常容易。

    触发器仅支持表,不支持视图和临时表。
    MySQL触发器中不支持CALL语句。这表示不能从触发器内调用存储过程。所需的存储过程代码需要复制到触发器内。

  3. 创建触发器
    在创建触发器时,需要给出4条信息:
    1.唯一的触发器名;
    2.触发器关联的表;
    3.触发器应该响应的活动(DELETE、 INSERT或UPDATE);
    4.触发器何时执行(处理之前或之后)。
    通常,将BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)

     CREATE TRIGGER 触发器名 [ BEFORE | AFTER ] [ INSERT | UPDATE | DELETE ] ON 表名
     FOR EACH ROW 触发处理语句;
    
  4. 删除触发器
    触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。
    DROP TRIGGER newproduct;

  5. 触发器类型
    1.INSERT触发器

    在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;
    在BEFORE INSERT触发器中, NEW中的值也可以被更新(允许更改被插入的值);
    对于AUTO_INCREMENT列, NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。

    获取(返回)新的自动生成的订单号:

    CREATE TRIGGER neworder AFTER INSERT ON orders
    FOR EACH ROW SELECT NEW.order_num;
    
    此触发器必须按照AFTER INSERT执行,因为在BEFORE INSERT语句执行之前,新order_num还没有生成。
    
    //测试这个触发器
    INSERT INTO orders(order_date,cust_id)
    VALUES (NOW(),10001);
    返回order_num 20010 自增的结果
    

    2.DELETE触发器

    在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行
    OLD中的值全都是只读的,不能更新。

     使用OLD保存将要被删除的行到一个存档表中:
     CREATE TRIGGER deleteorder BEFORE DELETE ON orders
     FOR EACH ROW
     BEGIN
        INSERT INTO ahchive_orders(order_num,order_date,cust_id)
        VALUES(OLD.order_num,OLD.order_date,OLD.cust_id)
     END;
    

    BEGIN和END语句标记触发器体:容纳多条SQL语句(在BEGIN END块中一条挨着一条)

    3.UPDATE触发器

    在UPDATE触发器代码中,可引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,OLD中的值全都是只读的,不能更新;
    引用一个名为NEW的虚拟表访问新更新的值,
    在BEFORE UPDATE触发器中, NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值);

     保证更新的某字段总是大写:
     CREATE TRIGGER deleteorder BEFORE UPDATE ON vendors
     FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);
    

事务处理

MyISAM和InnoDB,前者不支持明确的事务处理管理,而后者支持。

事务处理(transaction processing)可以用来维护数据库的完整性,
它保证成批的MySQL操作要么完全执行,要么完全不执行

管理事务处理的关键
将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。

只是对简单的事务处理才能这样做(直接使用COMMIT和ROLLBACK),
复杂的事务处理可能需要部分提交或回退。

案例:添加订单事务处理过程
(1) 检查数据库中是否存在相应的客户,如果不存在,添加他/她。
(2) 提交客户信息,添加新行到customers表。

(3) 检索客户的ID。
(4) 添加一行到orders表。
(5) 如果在添加行到orders表时出现故障,回退。

(6) 检索orders表中赋予的新订单ID。
(7) 对于订购的每项物品,添加新行到orderitems表。
(8) 如果在添加新行到orderitems时出现故障,回退所有添加的orderitems行和orders行。

(9) 提交订单信息。

部分提交或回退
如果发生错误,只需要返回到添加orders行之前即可,不需要回退到customers表(如果存在的话)。

为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。
这样,如果需要回退,可以回退到某个占位符。
这些占位符称为保留点

设置任意多的保留点,越多越好,能灵活地进行回退。

概念操作
更改MySQL默认的自动提交行为:SET autocommit = 0; autocommit标志是针对每个连接而不是服务器的。
事务(transaction) 指一组/批SQL语句;START TRANSACTION; 开启事务 (当COMMIT或ROLLBACK语句执行后,事务会自动关闭(将来的更改会隐含提交))
回退(rollback)指撤销指定SQL语句的过程;ROLLBACK;
提交(commit)指将未存储的SQL语句结果写入数据库表;COMMIT;
保留点(savepoint)指事务处理中设置的临时占位符(placeholder)创建保留点:SAVEPOINT 保留点名;
对保留点发布回退(与回退整个事务处理不同)。回退到指定给出的保留点:ROLLBACK TO 保留点名;
释放保留点:保留点在事务处理完成(执行一条ROLLBACK或COMMIT)后自动释放。
显式释放 :RELEASE SAVEPOINT 保留名;

全球化和本地化

字符集为字母和符号的集合;
编码为某个字符集成员的内部表示;
校对为规定字符如何比较的指令。

查看所支持的字符集完整列表:SELECT CHARACTER SET;
查看所支持校对的完整列表:SELECT COLLATION;

查看系统使用的字符集和校对:
SHOW VARIABLES LIKE ‘%character%’;
SHOW VARIABLES LIKE ‘%collation%’;

修改使用的字符集和校对:命令行(临时)和文件(永久)
参考:https://www.cnblogs.com/wuyongyu/p/6640940.html

如果指定CHARACTER SET和COLLATE两者,则使用这些值。
如果只指定CHARACTER SET,则使用此字符集及其默认的校对
(如SHOW CHARACTER SET的结果中所示)。
如果既不指定CHARACTER SET,也不指定COLLATE,则使用数据库默认。

给表指定字符集和校对:

CREATE TABLE 表名(
	列声明
) DEFAULT CHARACTER SET 字符集
  COLLATION 校对;

给列指定字符集和校对:

CREATE TABLE 表名(
	column1 VARCHAR(10) CHARACTER SET 字符集 COLLATION 校对,
	列声明
) DEFAULT CHARACTER SET 字符集
  COLLATION 校对;

校对在对用ORDER BY子句检索出来的数据排序时起重要的作用
如果你需要用与创建表时不同的校对顺序排序特定的SELECT语句,可以在SELECT语句自身中进行:

SELECT * FROM customers
ORDER BY lastname,firstname COLLATION latin1_general_cs; //为区分大小写的校对

如果绝对需要,串可以在字符集之间进行转换。
为此,使用Cast()或Convert()函数。
CAST(expression AS TYPE);将任何类型的值转换为指定类型
CAST()也可以转化字符集,并且同时强制改变数据类型:

CAST(串 AS 指定数据类型 CHARACTER SET 指定字符集);

CONVERT (数据类型[(length)], 表达式或列名 [, 样式]) ;

CONVERT(字符串 USING 字符集);

ORDER BY CONVERT(列名 USING GBK)  根据汉字首字母排序

安全管理

  1. 访问控制
    可能有的情况:
    多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表;
    某些用户需要读表,但可能不需要更新表;
    你可能想允许用户添加数据,但不允许他们删除数据;
    某些用户(管理员)可能需要处理用户账号的权限,但多数用户不需要;
    你可能想让用户通过存储过程访问数据,但不允许他们直接访问数据;
    你可能想根据用户登录的地点限制对某些功能的访问。

    日常工作中,决不能使用root。应该创建一系列的账号,有的用于管理,有的供用户使用,有的供开发人员使用,等等。

    访问控制是为了保证用户不能执行他们不应该执行的语句

  2. 管理用户
    查看所有用户账号列表:

    USE mysql;
    SELECT user FROM user;
    

    创建用户账号:

    CREATE USER 用户名 IDENTIFIED BY '密码';
    

    重命名用户:

    RENAME USER 旧 TO 新;
    

    更改口令(密码):

    SET PASSWORD [FOR 用户名] = Password('密码'); //不加用户名是改当前用户
    											 //Password()函数为了加密
    

    删除用户账号 以及相关的权限:

    DROP USER 用户名;
    

    查看用户访问权限:

    SHOW GRANTS FOR 用户;  
    结果:USAGE ON *.*  TO '用户'@'%'     
    
    1.USAGE ON *.* : USAGE表示根本没有权限
    2.用户定义为user@host 
    MySQL的权限用用户名和主机名结合定义。
    如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)。
    

    为设置权限,使用GRANT语句。 GRANT要求你至少给出以下信息:
    要授予的权限;
    被授予访问权限的数据库或表;
    用户名。

    GRAND 权限[,权限] ON 数据库名.* TO 用户 [WITH GRANT OPTION:该用户可以转授其他用户该权限];
    允许用户在数据库的所有表上使用某权限(数据库的所有表的某权限授予该用户)。	
    

    GRANT的反操作为REVOKE,用它来撤销特定的权限:

    REVOKE 权限[,权限]  ON 数据库名.* FROM 用户;
    被撤销的访问权限必须存在,否则会出错。
    

    GRANT和REVOKE可在几个层次上控制访问权限:

     整个服务器                   使用GRANT ALL和REVOKE ALL;
     整个数据库                   使用ON database.*;
     特定的表                     使用ON database.table;
     (数据库或表不存在时也可以设置,好处可提前设置,
     坏处删除原先的建立同名新库或表,原先的权限还在,如果没撤销的话)
     特定的列;
     特定的存储过程。
    
权 限说 明
ALL除GRANT OPTION外的所有权限
ALTER使用ALTER TABLE
ALTER ROUTINE使用ALTER PROCEDURE和DROP PROCEDURE
CREATE使用CREATE TABLE
CREATE ROUTINE使用CREATE PROCEDURE
CREATE TEMPORARYTABLES使用CREATE TEMPORARY TABLE
CREATE USER使用CREATE USER、 DROP USER、 RENAME USER和REVOKEALL PRIVILEGES
CREATE VIEW使用CREATE VIEW
DELETE使用DELETE
DROP使用DROP TABLE
EXECUTE使用CALL和存储过程
FILE使用SELECT INTO OUTFILE和LOAD DATA INFILE
GRANT OPTION使用GRANT和REVOKE
INDEX使用CREATE INDEX和DROP INDEX
INSERT使用INSERT
LOCK TABLES使用LOCK TABLES
PROCESS使用SHOW FULL PROCESSLIST
RELOAD使用FLUSH
REPLICATION CLIENT服务器位置的访问
REPLICATION SLAVE由复制从属使用
SELECT使用SELECT
SHOW DATABASES使用SHOW DATABASES
SHOW VIEW使用SHOW CREATE VIEW
SHUTDOWN使用mysqladmin shutdown(用来关闭MySQL)
SUPER使用CHANGE MASTER、 KILL、 LOGS、 PURGE、 MASTER和SET GLOBAL。还允许mysqladmin调试登录
UPDATE使用UPDATE
USAGE无访问权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值