一、視圖 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目錄中。