若是數據檢索是最重要的,在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;