1、视图
视图不包含表中应该有的任何列或数据,它包含的是一个SQL查询。在视图创建之后,可以用于表基本相同的方式利用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据。
视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。
因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果用多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能下降得很厉害。
创建和使用视图的一下常见的规则和限制:
创建视图:
CREATE VIEW productcustomers AS SELECT cust_name, cust_contact, prod_id FROM customers, orders, orderitems WHERE customers.cust_id = orders.cust_id;
使用SHOW CREATE VIEW viewname 查看创建视图的语句。
删除视图:DROP VIEW viewname;
更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果不存在创建,如果存在则更新。
可以对视图使用INSERT、UPDATE和DELETE。更新一个视图将更新其基表。如果视图定义中有以下操作,则不能对视图使用上述三个语句:
一般应该将视图用于检索,而不用于更新。
2、存储过程
是为以后的使用而保存的一条或多条MySQL语句的集合。
执行存储过程:
CALL productpricing(@pricelow, @pricehigh, @priceaverage);
创建存储过程:
CREATE PROCEDURE productpricing() BEGIN MySQL语句 END;
默认的MySQL语句分隔符为;,MySQL命令行会解释存储过程内的;,这样它们最终不会成为存储过程的成分,这会使存储过程中的SQL出现语法错误。解决办法是临时更改命令行程序的语句分隔符,例如用//作为新的语句结束分隔符:
DELIMITER //
DELIMITER ;
恢复原来的语句分隔符。
出\以外,任何字符都可以用作语句分隔符。
删除存储过程:
DROP PROCEDURE productpricing;
当过程存在想删除它时可使用DROP PROCEDURE IF EXISTS;
使用参数:
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;
存储过程代码位于BEGIN和END语句内,代码前面放置--表示注释,用DECLARE语句定义局部变量,也支持可选的默认值。IF条件语句,条件后需跟THEN。还支持ELSEIF和ELSE子句,ELSEIF后需跟THEN。
用SHOW CREATE PROCEDURE 过程名;语句查看创建存储过程的CREATE语句。SHOW PROCESSDURE STATUS LIKE ... 查看存储过程列名。可以在CREATE PROCESSDURE 过程名后添加COMMENT值,在SHOW PROCEDURE STATUS的结果中显示。3、游标
是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。MySQL游标只能用于存储过程。
使用游标的步骤:
声明游标:
DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders;
打开、关闭游标
OPEN ordernumbers;
CLOSE ordernumbers;
在一个游标关闭后,如果没有重新打开则不能使用它。但是,使用声明过的游标不需要再次声明,用OPEN语句打开即可。如果不明确关闭游标,MySQL将会在到达END语句时自动关闭它。
在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据,检索出来的数据存储在什么地方,它还向前移动游标中的内部行指针,使下一条FECTH语句检索下一行。FETCH 列 INTO 变量。
用DECALRE语句定义的局部变量必须在定义任意游标或句柄之前,句柄必须在游标之后定义。
4、触发器
是MySQL响应DELETE、UPDATE、INSERT语句而自动执行的一条MySQL语句。其他MySQL语句不支持触发器。
在创建触发器时需要给出4条信息:
在MySQL5中,触发器名必须在每个表中唯一,不是每个数据库唯一。以后的版本可能会使命名规则更为严格。
触发器用CREATE TRIGGER语句创建:
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
只有表才支持触发器,视图不支持。
如果BEFORE触发器失败,则MySQL将不执行请求的操作。如果BEFORE触发器或语句本身失败,MySQL将不执行AFTER触发器。
使用DROP TRIGGER语句删除触发器。
INSERT触发器:
CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;DELETE触发器:
CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW BEGIN INSERT INTO archive_orders(order_num, order_date, cust_id) VALUES(OLD.order_num, OLD.order_date, OLD.cust_id); END;
UPDATE触发器:
5、事务处理
事务处理用来管理INSERT、UPDATE和DELETE语句,不能回退SELECT语句、CREATE或DROP操作。
用START TRANSACTION;标记事务开始;
使用COMMIT提交;
ROLLBACK关键字回退;
当COMMIT或ROLLBACK语句执行后,事务会自动关闭。
使用SAVEPOINT 保留点名;创建保留点
ROLLBACK TO 保留点名;回退保留点。
保留点在事务处理完成后自动释放,也可以用RELEASE SAVEPOINT明确的释放保留点。
MySQL行为是自动提交所有更改,即执行立即生效,为指示MySQL不自动提交更改,需使用下面语句:
SET autocommit=0;
6、国际化
字符集是字符和符号的集合;
编码是某个字符集成员的内部表示;
校对是规定字符如果进行比较的指定。
查看所支持的字符集完整列表:SHOW CHARACTER SET;
查看所支持校对的完整列表:SHOW COLLATION;
许多校对会出现两次,一次区分大小写(由_cs表示),一次不区分大小写(由_ci表示)。
为确定所用的字符集和校对,可以使用以下语句:
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
为了给表指定字符集和校对,可使用带子句的CREATE TABLE:
CREATE TABLE mytable ( column1 INT, column2 VARCHAR(10) ) DEFAULT CHARACTER SET hebrew COLLATE hebrew_general_ci;
还允许对每个列设置字符集和校对。
CREATE TABLE mytable ( column1 INT, column2 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_ci )校对在对用ORDER BY子句检索出来的数据排序时起重要的作用。如果需要用与创建表时不同的校对顺序排序,可以在SELECT语句自身中进行:
SELECT * FROM customers ORDER BY lastname, firstname COLLATE latin1_general_cs;
串可以在字符集之间进行转化,为此使用Cast()或Convert()函数。
7、安全管理
查看用户:
USE mysql; SELECT user FROM user;
CREATE USER ben IDENTIFIED BY PASSWARD('...');
DROP USER bforta
SHOW GRANTS FOR bforta;
GRANT SELECT ON crashcourse.* TO bforta;
REVOKE SELECT ON crashcourse.* FROM bforta;更改口令:
SET PASSWORD FOR bforta = Password('...');
几种解决方案:
为了保证所有数据被写到磁盘,可能需要在进行备份前使用FLUSH TABLES语句刷新未写数据。
9、数据库维护
ANALYZE TABLE 检查表键是否正确。
CHECK TABLE检查表的问题。
10、日志文件
错误日志,名为hostname.err,默认在data目录中;
查询日志,名为hostname.log,默认在data目录中;
二进制日志,记录更新过的数据,名为hostname.bin,默认在data目录中;
缓慢查询日志,记录执行缓慢的查询,名为hostname-slow.log,位于data目录中。