MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品。MySQL 最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一。
MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。MySQL 軟件采用了雙授權(quán)政策,它分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。由于其社區(qū)版的性能卓越,搭配 PHP 和 Apache 可組成良好的開發(fā)環(huán)境。
視圖
MySQL 5添加了對視圖的支持。視圖是虛擬的表。與包含數(shù)據(jù)的表不一樣,視圖只包含使用時(shí)動(dòng)態(tài)檢索數(shù)據(jù)的查詢。
一、為什么使用視圖
(1)重用SQL語句。
(2)簡化復(fù)雜的SQL操作。在編寫查詢后,可以方便的重用它而不必知道它的基本查詢細(xì)節(jié)。
(3)使用表的組成部分而不是整個(gè)表。
(4)保護(hù)數(shù)據(jù)。可以給用戶授予表的特定部分的訪問權(quán)限而不是整個(gè)表的訪問權(quán)限。
(5)更改數(shù)據(jù)格式和表示。視圖可返回與底層表的表示和格式不同的數(shù)據(jù)。
重要的是:視圖僅僅是用來查看存儲(chǔ)在別處的數(shù)據(jù)的一種設(shè)施。視圖本身不包含數(shù)據(jù),因?yàn)樗鼈兎祷氐臄?shù)據(jù)是從其他表中檢索出來的。在添加或更改這些表中的數(shù)據(jù)時(shí),視圖將返回改變過的數(shù)據(jù)。
二、視圖的規(guī)則和限制
(1)與表一樣,視圖必須唯一命名(不能給視圖取與別的視圖或表相同的名字)。
(2)對于可以創(chuàng)建的視圖數(shù)目沒有限制。
(3)為了創(chuàng)建視圖,必須具有足夠的訪問權(quán)限。這些限制通常由數(shù)據(jù)庫管理人員授予。
(4)視圖可以嵌套,即可以利用從其他視圖中檢索數(shù)據(jù)的查詢來構(gòu)造一個(gè)視圖。
(5)ORDER BY可以用在視圖中,但如果從該視圖檢索數(shù)據(jù)的SELECT語句中也包含ORDER BY,那么該視圖中的ORDER BY將被覆蓋。
(6)視圖不能索引,也不能有關(guān)聯(lián)的觸發(fā)器或默認(rèn)值。
(7)視圖可以和表一起使用。
使用視圖
(1)視圖用CREATE VIEW語句來創(chuàng)建。
(2)使用SHOW CREATE VIEW viewname;來查看創(chuàng)建視圖的語句。
(3)用DROP刪除視圖,其語法是DROP VIEW viewname;。
(4)更新視圖時(shí),可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果要更新的視圖不存在,則第2條更新語句會(huì)創(chuàng)建一個(gè)視圖;如果要更新的視圖存在,則第2條語句會(huì)替換原有視圖。
一、利用視圖簡化復(fù)雜的聯(lián)結(jié)
視圖最常見的應(yīng)用之一是隱藏復(fù)雜的SQL,這通常都會(huì)涉及聯(lián)結(jié)。例如:
CREATE VIEW productcustomers AS SELECT cust_name,cust_contact,prod_id FROM customers,orders,orderitems WHERE customers.cust_id=orders.cust_id AND orderitems.order_num=orders.order_num;
這條語句創(chuàng)建了一個(gè)名為productcustomers的視圖,它聯(lián)結(jié)三個(gè)表,以返回已訂購了任意產(chǎn)品的所有客戶的列表。如果執(zhí)行SELECT * FROM productcustomers,將列出訂購了任意產(chǎn)品的客戶。為了檢索訂購了產(chǎn)品TNT2的客戶,可如下進(jìn)行:
SELECT cust_name,cust_contact FROM productcustomers WHERE prod_id='TNT2';
此語句的輸出如下圖所示:
這條語句通過WHERE子句從視圖中檢索特定數(shù)據(jù)。在MySQL處理此查詢時(shí),它將指定的WHERE子句添加到視圖查詢中的已有WHERE子句中,以便正確過濾數(shù)據(jù)。
二、用視圖重新格式化檢索出的數(shù)據(jù)
CREATE VIEW vendorlocations AS SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS vend_title FROM vendors ORDER BY vend_name;
SELECT * FROM vendorlocations;
此語句的輸出如下圖所示:
三、用視圖過濾不想要的數(shù)據(jù)
視圖對于應(yīng)用普通的WHERE子句也很有用。例如,可以定義customeremaillist視圖,它過濾沒有電子郵件地址的客戶,示例如下:
CREATE VIEW customeremaillist AS SELECT cust_id,cust_name,cust_email FROM customers WHERE cust_email IS NOT NULL;
SELECT * FROM customeremaillist;
此語句的輸出如下圖所示:
四、使用視圖與計(jì)算字段
CREATE VIEW orderitemsexpanded AS SELECT order_num,prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems;
為了檢索訂單20005的詳細(xì)內(nèi)容(上面的輸出),如下進(jìn)行:
SELECT * FROM orderitemsexpanded WHERE order_num=20005;
此語句的輸出如下圖所示:
五、更新視圖
通常,視圖是可以更新的。更新一個(gè)視圖將更新其基表。如果對視圖增加或刪除行,實(shí)際上是對其基表增加或刪除行。但是,并非所有的視圖都是可更新的。基本上可以說,如果MySQL不能正確的確定被更新的基數(shù)據(jù),則不允許更新(包括插入和刪除)。這意味著如果視圖定義中有以下操作,則不能進(jìn)行視圖的更新;
(1)分組(使用GROUP BY和HAVING);
(2)聯(lián)結(jié);
(3)子查詢;
(4)并;
(5)聚集函數(shù)(Min()、Count()、Sum()等);
(6)DISTINCT;
(7)導(dǎo)出(計(jì)算)列。