一、视图 mysql
视图不包含表中应该有的任何列或数据,它包含的是一个SQL查询。在视图建立以后,能够用于表基本相同的方式利用它们。能够对视图执行SELECT操做,过滤和排序数据,将视图联结到其余视图或表,甚至能添加和更新数据。 sql
视图仅仅是用来查看存储在别处的数据的一种设施。视图自己不包含数据,所以它们返回的数据是从其余表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。 数据库
由于视图不包含数据,因此每次使用视图时,都必须处理查询执行时所需的任一个检索。若是用多个联结和过滤建立了复杂的视图或者嵌套了视图,性能可能降低得很厉害。 安全
建立和使用视图的一下常见的规则和限制: 服务器
建立视图: 函数
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。若是不存在建立,若是存在则更新。 spa
能够对视图使用INSERT、UPDATE和DELETE。更新一个视图将更新其基表。若是视图定义中有如下操做,则不能对视图使用上述三个语句: 命令行
通常应该将视图用于检索,而不用于更新。
二、存储过程
是为之后的使用而保存的一条或多条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的结果中显示。三、游标
是一个存储在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语句定义的局部变量必须在定义任意游标或句柄以前,句柄必须在游标以后定义。
四、触发器
是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触发器:
五、事务处理
事务处理用来管理INSERT、UPDATE和DELETE语句,不能回退SELECT语句、CREATE或DROP操做。
用START TRANSACTION;标记事务开始;
使用COMMIT提交;
ROLLBACK关键字回退;
当COMMIT或ROLLBACK语句执行后,事务会自动关闭。
使用SAVEPOINT 保留点名;建立保留点
ROLLBACK TO 保留点名;回退保留点。
保留点在事务处理完成后自动释放,也能够用RELEASE SAVEPOINT明确的释放保留点。
MySQL行为是自动提交全部更改,即执行当即生效,为指示MySQL不自动提交更改,需使用下面语句:
SET autocommit=0;
六、国际化
字符集是字符和符号的集合;
编码是某个字符集成员的内部表示;
校对是规定字符若是进行比较的指定。
查看所支持的字符集完整列表: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()函数。
七、安全管理
查看用户:
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语句刷新未写数据。
九、数据库维护
ANALYZE TABLE 检查表键是否正确。
CHECK TABLE检查表的问题。
十、日志文件
错误日志,名为hostname.err,默认在data目录中;
查询日志,名为hostname.log,默认在data目录中;
二进制日志,记录更新过的数据,名为hostname.bin,默认在data目录中;
缓慢查询日志,记录执行缓慢的查询,名为hostname-slow.log,位于data目录中。