若是数据检索是最重要的,在INSERT和INTO之间添加关键字LOW_PRIORITY,可下降INSERT语句的优先级,也适用于UPDATE和DELETE语句html
从一个新表中导入数据到另外一个表中
INSERT INTO p1(.......) SELECT (......) FROM p2;mysql
若不能保证主键值不重复,可省略此列,MySQL会自动生成新值git
导入时使用的是列的位置而不是列名github
基本的UPDATE语句由3部分构成:要更新的表,列名和它们的新值,肯定更新行的过滤条件sql
UPDATE customers SET cust_name = 'The Fudds', cust_email = 'elmer@fudd.com' WHERE cust_id = 1005;
DELETE删除的是整行,删除指定的列则使用UPDATE语句数据库
DELETE FROM customers WHERE cust_id = 1006;
建立表的两种方法:直接用MySQL语句操纵,使用具备交互式建立和管理表的工具(其内部也是使用MySQL语句操纵)工具
CREATE TABLE osc_customers { id int(11) NOT NULL AUTO_INCREMENT, user int(16) NOT NULL, email char(255) NULL, PRIMARY KEY (id) }ENGINE=InnoDB
AUTO_INCREMENT 键值自增,每一个表只容许一个且它必须被索引性能
NULL,容许缺值spa
PRIMARY KEY 指定主键,可指定多个,主键不能为null.net
表名后给出IF NOT EXISTS表示仅在一个表不存在时建立它
DEFAULT 指定默认值
MySQL具备多个引擎,它们各自有不一样的功能特性,为不一样的任务选择合适的引擎能得到良好的功能
不指定则使用默认引擎
InnoDB:可靠的事物处理引擎,不支持全文本搜索
MyISAM:性能极高的引擎,支持全文本搜索,不支持事物处理
MEMORY:在功能上等同于MyISAM,但因为数据存储在内存中,速度很快(特别适合于临时表)
引擎完整列表及其特性:http://dev.mysql.com/doc/refman/5.7/en/storage_engines.html 误
外键不能跨引擎:即一个引擎的表不能引用具备使用不一样引擎的表的外键
更新表
使用ALTER TABLE更新表
给表增长一个列
ALTER TABLE vendors ADD vend_phone CHAR(20);
删除一个列
ALTER TABLE vendors DROP COLUMN vend_phone;
ALTER TABLE的一种常见用途是定义外键
删除表
DROP TABLE tableName;
重命名表
RENAME TABLE tableName1 TO tableName2;
视图是虚拟的表,与包含数据的表不同,视图只包含使用时动态检索数据的查询。
1. 重用SQL语句
2. 简化复杂的SQL操做,在编写查询后,能够方便的重用它而没必要知道它的基本查询细节
3. 使用表的组成部分而不是整个表
4. 保护数据。能够给用户表的特定部分的访问权限而不是整个表的访问权限
5. 更改数据格式和表示
建立视图:CREATE VIEW
删除视图:DROP VIEW
常常会有一个完整的操做须要多条语句才能完成,存储过程就是将多条操做语句封装在容易使用的单元中,简化复杂的操做
可简化对变更的管理。提升性能,使用存储过程比使用单条SQL语句要快
存在一些只能用在单个请求中的MySQL中的元素和特性,存储过程可使用它们来编写更强的代码
执行存储过程
MySQL称存储过程的执行为调用,语句为CALL,接受存储过程的名字以及须要传递给它的任意参数
CALL productpricing(@pricelow, @pricehigh, @priceaverage);
执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格
建立存储过程
CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END;
mysql命令行实用程序分隔符默认为 ;
可临时更改,DELIMITER // 定义分隔符为//
DELIMITER // CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END// DELIMITER ;
删除存储过程 DROP PROCEDURE productpricing;
使用参数
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;
OUT:指出相应的参数用来从存储过程当中传出一个值(返回给调用者)
IN:传递给存储过程
调用该存储过程,调用时并不显示任何数据
CALL productpricing(@pricelow, @pricehigh, @priceaverage);
显示数据
SELECT @pricehigh, @pricelow, @priceaverage;
使用IN和OUT参数
CREATE PROCEDURE ordertotal( IN onumber INT, OUT ototal DECIMAL(8,2) )COMMENT ‘This is a test' BEGIN SELECT Sum(item_price*quanity) FROM orderitems WHERE order_num = onumber INTO ototal; END;
调用该存储过程
CALL ordertotal(20005,@total);
存储过程当中注释 --
COMMENT关键字:非必需,若是给出,将在SHOW PROCEDURE STATUS的结果中显示
游标:是一种能从包括多条数据的结果集中每次提取一条记录的机制,充当指针的做用,用于对查询数据库所返回的记录进行遍历,以便进行相应的操做
只能用于存储过程
使用游标
书上的例子,具体参考https://my.oschina.net/githubhty/blog/909052
CREATE PROCEDURE processorders() BEGIN -- Declare local variables DECLARE o INT; DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; -- Open the cursor OPEN ordernumbers; -- Get order number FETCH ordernumbers INTO o; -- Close the cursor CLOSE ordernumbers; end;
触发器:使某些语句在事件发生时自动执行
每一个表最多支持6个触发器(INSERT、UPDATE和DELETE的以前和以后)
在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行
在BEFORE INSERT触发器中,NEW中的值能够被更新(容许更改被插入的值)
对于AUTO_INCREMENT列,NEW在INSERT执行以前包含0,在INSERT执行以后自动包含新的自动生成值
能够引用一个名为OLD的虚拟表,访问被删除的行
OLD中的值全都是只读的,不能被更新
CREATE TRIGGER deleteorder BERORE 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;
在任意订单被删除前将执行此触发器。它使用一条INSERT语句将OLD中的值(要被删除的订单)保存到一个名为archive_orders的存档表中
使用BEGIN和END语句标记触发体,可包含多条SQL语句
相对于AFTER DELETE,使用BEFORE DELETE的优势为:若是由于某种缘由触发体中的语句没有成功执行(如上述例子订单没有存档),DELETE语句也不会执行
在UPDATE触发器代码中,能够引用一个名为OLD的虚拟表访问UPDATE执行以前的值,引用名为NEW的虚拟表访问UPDATE执行以后的值
在BEFORE UPDATE触发器中,NEW中的值能够被更新
下面的例子保证州名缩写老是大写
CERATE TRIGGER updatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);
事务处理:保证成批的MySQL操做要么彻底所有执行,要么彻底不执行
事物(transaction):指一组SQL语句
回退(rollback):指撤销指定SQL语句的过程
提交(commit):指将未存储的SQL语句结果写入数据库表
保留点(savepoint):指事务处理中设置的临时占位符(place-holder),能够对它发布回退(与回退整个事务不一样)
控制事务处理
START TRANSACTION; ... ROLLBACK;
通常的SQL语句都是隐含提交即提交操做是自动进行的,可是在事务处理块中,提交不会隐含进行。需使用COMMIT语句进行明确提交
START TRANSACTION; ... COMMIT;
简单的ROLLBACK和COMMIT语句就能够写入或撤销整个事务处理。可是更复杂的事务处理可能须要部分提交或回退,可以使用保留点进行占位
START TRANSACTION; ... SAVEPOINT delete1; ... ROLLBACK TO delete1;
更改默认的提交行为,autocommit值为0指示MySQL不会自动更改,直至autocommit被设置为真为止
SET autocommit=0;