《MySQL必知必會》讀書筆記(四) 22~30章 完結篇

一、視圖 mysql

視圖不包含表中應該有的任何列或數據,它包含的是一個SQL查詢。在視圖建立以後,能夠用於表基本相同的方式利用它們。能夠對視圖執行SELECT操做,過濾和排序數據,將視圖聯結到其餘視圖或表,甚至能添加和更新數據。 sql

視圖僅僅是用來查看存儲在別處的數據的一種設施。視圖自己不包含數據,所以它們返回的數據是從其餘表中檢索出來的。在添加或更改這些表中的數據時,視圖將返回改變過的數據。 數據庫

由於視圖不包含數據,因此每次使用視圖時,都必須處理查詢執行時所需的任一個檢索。若是用多個聯結和過濾建立了複雜的視圖或者嵌套了視圖,性能可能降低得很厲害。 安全

建立和使用視圖的一下常見的規則和限制: 服務器


  • 與表同樣,視圖必須惟一命名(不能給視圖取與別的視圖或表相同的名字);
  • 能夠建立的視圖數目沒有限制;
  • 建立視圖須要有足夠的權限;
  • 視圖能夠嵌套;
  • ORDER BY能夠用在視圖中,但若是從該視圖檢索數據的SELECT語句中也含有ORDER BY,那麼該視圖中的ORDER BY將被覆蓋;
  • 視圖不能索引,也不能有關聯的觸發器或默認值;
  • 視圖能夠和表一塊兒使用。

建立視圖: 函數


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。更新一個視圖將更新其基表。若是視圖定義中有如下操做,則不能對視圖使用上述三個語句: 命令行

  • 分組(GROUP BY 和 HAVING);
  • 聯結;
  • 子查詢;
  • 並;
  • 彙集函數(Min()、Count()、Sum()等);
  • DISTINCT;
  • 導出(計算)列。

通常應該將視圖用於檢索,而不用於更新。

二、存儲過程

是爲之後的使用而保存的一條或多條MySQL語句的集合。

執行存儲過程:

CALL productpricing(@pricelow, @pricehigh, @priceaverage);



其中括號中的是參數,由於他們是MySQL變量,全部MySQL變量都以@開頭。

建立存儲過程:

CREATE PROCEDURE productpricing()
BEGIN
     MySQL語句
END;



MySQL命令行建立存儲過程應注意:

    默認的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;



每一個參數必須具備指定的類型,關鍵字OUT指出相應的參數用來從存儲過程傳出一個值。IN表示傳遞給存儲過程、INOUT表示對存儲過程傳入和傳出。經過INTO關鍵字將SELECT結果保存到相應的變量。 不能經過一個參數返回多個行和列。

存儲過程代碼位於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遊標只能用於存儲過程。

使用遊標的步驟:

  • 聲明,這個過程實際上沒有檢索數據,它只是定義要使用的SELECT語句;
  • 打開遊標,這個過程用前面定義的SELECT語句把數據實際檢索出來;
  • 根據須要取出檢索的各行;
  • 關閉遊標。

聲明遊標:

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條信息:

  • 惟一的觸發器名;
  • 觸發器關聯的表;
  • 觸發器應該響應的活動(DELETE、INSERT或UPDATE);
  • 觸發器什麼時候執行(處理以前或以後)。

在MySQL5中,觸發器名必須在每一個表中惟一,不是每一個數據庫惟一。之後的版本可能會使命名規則更爲嚴格。

觸發器用CREATE TRIGGER語句建立:

CREATE TRIGGER newproduct AFTER INSERT ON products 
FOR EACH ROW SELECT 'Product added';



觸發器按每一個表每一個事件每次定義,每一個表每一個事件只容許有一個觸發器。所以每一個表最多支持六個觸發器(三個語句以前和以後)。單一觸發器不能與多個事件或多個表關聯。

只有表才支持觸發器,視圖不支持。

若是BEFORE觸發器失敗,則MySQL將不執行請求的操做。若是BEFORE觸發器或語句自己失敗,MySQL將不執行AFTER觸發器。

使用DROP TRIGGER語句刪除觸發器。

INSERT觸發器:

  • 在INSERT觸發器代碼內,能夠引用一個名爲NEW的虛擬表,訪問被插入的行;
  • 在BEFORE INSERT觸發器中,NEW中的值也能夠被更新(運行更改被插入的值);
  • 對於AUTO_INCREMENT列,NEW在INSERT執行以前包含0,在INSERT執行以後包含新的自動生成值。

CREATE TRIGGER neworder AFTER INSERT ON orders 
FOR EACH ROW SELECT NEW.order_num;
DELETE觸發器:

  • 在DELETE觸發器代碼內,能夠應用一個名爲OLD的虛擬表。訪問被刪除的行;
  • OLD中的值所有都是隻讀的,不能更新。

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;



使用BEGIN END語句塊使觸發器能容納多條SQL語句。

UPDATE觸發器:

  • 在UPDATE觸發器代碼中,你能夠引用一個名爲OLD的虛擬表訪問之前的值,引用一個名爲NEW的虛擬表訪問新更新的值;
  • 在BEFORE UPDATE觸發器中,NEW中的值容許 被更新;
  • OLD中的值所有都是隻能,不能被更新。

五、事務處理

事務處理用來管理INSERT、UPDATE和DELETE語句,不能回退SELECT語句、CREATE或DROP操做。

用START TRANSACTION;標記事務開始;

使用COMMIT提交;

ROLLBACK關鍵字回退;

當COMMIT或ROLLBACK語句執行後,事務會自動關閉。

使用SAVEPOINT 保留點名;建立保留點

ROLLBACK TO 保留點名;回退保留點。

保留點在事務處理完成後自動釋放,也能夠用RELEASE SAVEPOINT明確的釋放保留點。

MySQL行爲是自動提交全部更改,即執行當即生效,爲指示MySQL不自動提交更改,需使用下面語句:

SET autocommit=0;



autocommit標誌是針對鏈接而不是服務器的。

六、國際化

字符集是字符和符號的集合;

編碼是某個字符集成員的內部表示;

校對是規定字符若是進行比較的指定。

查看所支持的字符集完整列表: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;



MySQL用如下方式肯定字符集和校對:

  • 若是指定CHARACTER SET和COLLATE,則使用這些值;
  • 若是隻指定CHARACTER SET,則使用此字符集及其默認的校對;
  • 若是既不指定CHARACTER SET,也不指定COLLATE,則同時使用數據庫默認。

還容許對每一個列設置字符集和校對。

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;



上面的SELECT語句演示了在一般不區分大小寫的表上區分大小寫搜索的一種技術,反過來用也是能夠的。

串能夠在字符集之間進行轉化,爲此使用Cast()或Convert()函數。

七、安全管理

查看用戶:

USE mysql;
SELECT user FROM user;



建立用戶帳號:

CREATE USER ben IDENTIFIED BY PASSWARD('...');



刪除用戶帳號:

DROP USER bforta



查看訪問權限

SHOW GRANTS FOR bforta;



添加權限,使用GRANT語句,要求至少給出:

  • 要授予的權限;
  • 被授予訪問權限的數據庫或表;
  • 用戶名。

GRANT SELECT ON crashcourse.* TO bforta;



撤銷權限:

REVOKE SELECT ON crashcourse.* FROM bforta;
更改口令:

SET PASSWORD FOR bforta = Password('...');



八、備份數據

幾種解決方案:

  • 使用命令行程序mysqldump轉存全部數據庫內容到外部文件;
  • 使用命令行程序mysqlhotcopy從一個數據庫複製全部數據;
  • 使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE轉存全部數據到某個外部文件。

爲了保證全部數據被寫到磁盤,可能須要在進行備份前使用FLUSH TABLES語句刷新未寫數據。

九、數據庫維護

ANALYZE TABLE 檢查表鍵是否正確。

CHECK TABLE檢查表的問題。

十、日誌文件

錯誤日誌,名爲hostname.err,默認在data目錄中;

查詢日誌,名爲hostname.log,默認在data目錄中;

二進制日誌,記錄更新過的數據,名爲hostname.bin,默認在data目錄中;

緩慢查詢日誌,記錄執行緩慢的查詢,名爲hostname-slow.log,位於data目錄中。

相關文章
相關標籤/搜索