初學MySQL

   使用Microsoft Excel的時候,覺得很方便,可是當一個數據變得多起來的時候,一個接一個的表格就顯得有些力不從心,關聯也不是很理想,直到後來接觸MySQL數據庫,才發現數據庫的便捷。

        我聽到的最形象的比喻是把數據庫比作圖書館。一本本的書就是一個個數據,在圖書館中如何把相同種類的書放在一類,如何把不同種類的書排列,思考這樣的問題實際上就接觸到了數據庫的內容。

        閒話不多說了,在學習MySQL的時候,最後身旁有一本《MySQL入門很簡單》這樣一本書。我推薦大家在MySQL的官網去下載該軟件,在官方網站你總能找到最新版的MySQL,其實不只是它,其他軟件都應該養成去官網下載的習慣,這樣不僅是正版,而且是最新的。在學習其他計算機語言的時候,我覺得MySQL的語言真的很簡明,像什麼CREATE、SELECT的,只要你的英文沒有問題,很多關鍵字你都可以“顧名思義”的使用(好吧作者承認水平不足,其實只是其他語言的數據類型簡寫作者不懂而已)當你真正投入的學習MySQL語言,學習操作數據庫的時候,你會發現,就像那本書名一樣,MySQL入門很簡單。

        在瞭解了數據庫的概念以後,我就開始學習MySQL數據庫的基本操作,我學習的順序不同於書上,這是適合我的順序,供大家參考。先開始學習①MySQL數據類型、然後②操作數據庫,③創建、修改和刪除表,④插入、更新與刪除數據,⑤查詢數據、⑥索引、⑦視圖、⑧觸發器、⑨存儲過程和函數。

        MySQL的數據類型分爲整數類型、浮點數類型和定點數類型。常用的整數類型是INT類型,在MySQL中INT類型和INTEGER類型因爲字節數、取值範圍都是一樣的,所以它們是一樣的。浮點數類型包括單精度浮點數(FLOAT型)和雙精度浮點數(DOUBLE型),FLOAT型和DOUBLE型默認會保存實際精度。DECIMAL(M,D)定點數類型,有效取值範圍是可以自己決定的。

        日期與時間類型比較簡單,在數據庫中存儲日期與時間,只要注意輸入的範圍即可。紀錄日期和時間,注意DATETIME類型和TIMESTAMP類型的區別,範圍較大的用DATETIME類型,TIMESTAMP類型在根據時區顯示,不用換算時間比較有用。

        字符串類型的話,VARCHAR類型比CHAR類型好用,VARCHAR類型範圍可變,所以方便,值得注意的是CHAR類型會把輸入的空格自動濾掉。TEXT類型和BLOB類型很像,BOLB類型可以存儲二進制數據,存儲相對大的文件圖片、PDF之類的,用BOLB類型。

         ENUM類型和SET類型像一對兄弟,只需形象的記住,ENUM類型是單選,SET類型是多選。

         如果你不習慣命令行程序中去操作MySQL數據庫,那你可以在MySQL的官方網站下載一個MySQLWorkbench這樣一款由圖形操作界面來控制的軟件去操作。

         在MySQL中,創建數據庫需要通過SQL語句來實現,其實我們學習的目的也是爲了學習SQL語句,這樣無論你換了其他的數據庫,語法可能有差異,操作上可以大同小異。用CREATE DATEBASE 數據庫名;來創建,刪除數據庫的話把CREATE換成DROP就行。

          創建完成數據庫之後,我們來學習插入數據。表,是存儲數據的基本單位。下面來看兩個表:

Information

Id


name



 

Grade

Id


grade


        現在我們在數據庫中有兩個簡易的表,一個信息表,一個成績表。把成績表中的id設置爲主鍵,那這個id就變成了唯一的,也就是在輸入學生的學號的時候是不能有相同的學號的學生的,學號是學生的唯一標識,在錄入成績的時候,我們同樣需要學號,這個時候在輸入一遍學號就變得麻煩了,我們可以引用信息表中的學生的學號,而這個時候,成績表中的id依賴於信息表的id,於是成績表中的id就變成了外鍵,並且因爲這個外鍵把信息表和成績表兩個表聯繫在一起,可以給這個外鍵起名,也可以不起名,根據自己的需求。信息表中的id和成績表中的id應該是一一對應的,這也就是外鍵關聯的必須是父表的主鍵,很好理解。

       設置表的唯一性約束,唯一,顧名思義就是獨一無二的,就是說已經設置好的字段不能重複。

       設置表的屬性值自動增加,也就是你插入一條新的數據,字段會自動增加1,而你強制插入一個值,MySQL會自動在你設置的這個值上增加。

       設置表的屬性的默認值,也就是你插入數據的時候沒有給字段指定的值,那麼它就會按照你原先設定的默認的值給數據。  


       做了那麼多對錶的操作,那麼怎麼了解我們表的結構呢?用DESC 表名; 這條語句來查看錶的定義。

       我們已經創建好了幾張表,當我們創建的時候忘記了一些需求,或者是增加了新的要求呢?那麼就需要修改表。

       修改表名,ALTER TABLE 舊錶名 RENAME [TO]新表名 ;當然中間的[TO]可以省略。

       修改字段的數據類型ALTER TABLE 表名 MODIFY 屬性名 數據類型 ;用modify的話是不需要重新給字段命名的。

       修改字段名ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新數據類型 ;change語句是需要舊、新兩個字段名的,所以很好理解,使用CHANGE修改字段的數據類型,那麼就需要把兩個相同的字段名放到之後。還有一條需要注意的是,更改的時候,一定要把約束條件在修改的時候加入進去,否則系統不會默認加入未更改的約束條件。

       如果數據需要完善,那就需要增加字段。MySQL中,ALTER TABLE語句增加字段是:ALTERTABLE 表名 ADD 屬性名1 數據類型 [完整性約束條件] [FIRST] | AFTER 屬性名 2] ;[]之中的根據需要的不同,可以選擇省略與否,FIRST顧名思義,在表的第一個位置增加字段,AFTER使用的話,根據需要的位置,在位置的後一個位置增加,如果都沒有修飾的話,那就會自動加入到表中的最後一個位置。

       數據中有累贅的地方,那麼就需要在表中刪除字段,刪除字段就是刪除已經定義好的表中的某個字段。ALTER TABLE 表名 DROP 屬性名 ;

       如果只需要修改字段的排列位置,ALTER TABLE 表名 MODIFY 屬性名1 數據類型 FIRST|AFTER 屬性名2;道理與增加字段的相同。

刪除表。如果沒有被關聯的普通表,DROP TABLE 表名 ;如果被其他表關聯的父表,那麼首先就需要刪除子表中外鍵約束,ALTER TABLE 表名 DROP FOREIGN KEY 外鍵別名 ;然後再刪除父表,這時候就可以刪除父表了。

       MySQL的字符集有很多,如果表中既有中文,又有英文的話,那麼最好使用國際編碼utf8,在選擇創建數據庫時不選擇字符集的話,在使用表的時候用default charset = utf8;設置存儲字符編碼,還有一種方法是ALTER TABLE 表名 convert to charset utf8;課本上是沒有介紹的,我們也不推薦這樣去做,只是告訴大家補救的方法。

       在創建好表增加字段之後,就需要插入、更新與刪除數據了。

       插入數據,插入不在指定具體的字段名INSERT INTO 表名 VALUES(值1,值2…,值n),沒有描述的話,插入的數據會根據你插入時候的順序爲表插入數據。

       INSERT語句中列出所有字段,爲表插入數據。INSERT INTO 表名(屬性1,屬性2,…,屬性n) VALUES(值1,值2,…,值n);這就是插入的每個值,與你輸入的字段對應,這樣缺點就是你必須要列出所有字段的名稱,當字段多的時候,就會比較冗長,但是優點特徵也很明顯,那就是不需要按照你表中的定義的順序來插入數據。

       爲表的指定字段插入數據INSERT INTO 表名(屬性1,屬性2,…,屬性m) VALUES(值1,值2,…,值m);這就很好理解,不用過多解釋了。

       值得注意的是,沒有賦值的字段,數據庫系統會爲其插入默認值。這個默認值是在創建表的時候定義的。

       一條一條的插入數據是會比較準確,可是效率不會太高,同時插入多條記錄,就解決了這個問題。INSERT INTO 表名 [(屬性列表)] VALUES(取值列表1) (取值列表2)…,(取值列表n);

       將查詢結果插入到表中,INSERT INTO 表名1 (屬性列表1) SELECT 屬性列表2 FROM 表名2 WHERE 條件表達式;在這裏“表名1”參數說明是往哪個表插入數據,“表名2”,是從哪個表中查詢出來,“屬性列表1”表示爲哪些字段賦值,“屬性列表2”表示從表中查詢出來的那些字段的數據,“條件表達式”參數設置了SELECT語句的查詢條件,“*”代表所有字段的數據,比較便捷的表達方式。

       更新數據,UPDATE 表名 SET 屬性名1=取值1,屬性名2=取值2,…,屬性名n=取值n WHERE 條件表達式;MySQL中可沒有撤銷,一旦更改了數據,那就是永久性的,所以在更新數據之前最好先執行SELECT語句判斷滿足WHERE條件的紀錄是否是確實需要更新的。

       刪除數據,DELETE FROM 表名 [WHERE 條件表達式],省略[]中的內容就會刪除表中的所有數據。

       更新和刪除對數據的破壞性極大,需要引起操作者的注意。

       修改數據的原則,先執行INSERT語句插入數據,在執行UPDATE更新部分數據。


        之前,我們接觸到了簡單的查詢語句,現在開始正式進入查詢數據的章節。

基本查詢語句,形式如下:

SELECT 屬性列表


   FROM 表名和視圖列表

   [WHERE 條件表達式]

[GROUP BY 屬性名1 [HAVING 條件表達式2]]

[ORDER BY 屬性名2 [ASC|DESC]]

屬性列表,表示需要查詢的字段名,屬性名1進行分組,屬性名2進行排序,其中ASC參數表示升序,DESC參數表示降序,升序是系統默認的。需要注意的是,單獨使用SELECT語句的話,是查詢“行”的,加上“WHERE”使用的話,是查詢“列”的。

         單表查詢,查詢所有字段有兩種方法,第一種是列出表的所有字段,SELECT 查詢字段 FROM 表名;第二種是使用“*”查詢所有字段,SELECT * FROM 表名;我們不難發現,第一種方式很靈活,查詢的順序也可以隨心所欲,但是字段比較多的情況下就麻煩起來,第二種方式言簡意賅,使用起來非常簡單,所以根據具體情況不同,選擇合適的查詢方式纔是明智的選擇。

          查詢指定字段,在屬性列表中列出需要查詢的字段。

          查詢指定記錄,WHERE + 條件表達式,指定查詢條件。

          帶IN關鍵字的查詢,如果不在,前綴加NOT,[NOT] IN (元素1,元素2,…,元素n),IN關鍵字的使用表示數據在一個集合中,也就是表達某個字段的取值在某個範圍中,這個範圍是括號裏的所有值,需要注意的是,IN是把所需所有元素都寫出來,這個範圍不是區間!加上NOT的話,就表示不在集合中滿足條件,就像集合中的補集。

          帶BETWEEN AND的範圍查詢,[NOT] BETWEEN 取值1  AND取值2,這兩個關鍵字把範圍定界的很標準,同時也可以用比較的符號=、<、<=、>、=>、!=,這幾個和C語言的用法相同,最爲常用。

          帶LIKE的字符匹配查詢,[NOT]LIKE ‘字符串’,關鍵字可以匹配字符串是否相等,經常與通配字符一同使用,兩種通配字符“%”可以代表任意長度的字符串,所以長度可以爲0,“_”只能表示單個字符,連續使用的話可以使查詢更精確。在不使用通配符時,LIKE關鍵字和“=”的作用是一樣。如果使用,那麼“=”不能代替LIKE完成查詢。

         查詢空值,IS [NOT] NULL。

         帶AND的多條件查詢。這個使用的頻率很高,因爲工作中,我們需要的條件往往不是那麼單一,經常需要符合很多條件,這樣AND就派上用場了,可以連接更多的條件表達式以應付更多的條件。

         帶OR的多條件查詢。條件表達式1OR 條件表達式 2 […OR 條件表示n],顧名思義,或者的話,就是滿足其中一個查詢條件即可。

        使用AND和OR關鍵字的時候,一定要考慮它們的優先級,不然結果就會大相徑庭,AND的優先級高於OR,也就是先執行AND,所以使用的時候考慮清楚。

        查詢結果不重複。SELECT DISTINCT 屬性名,字段沒有唯一性約束,那就加上DISTINCT讓你找出來的數據更明顯。

       對查詢結果排序。ORDER BY 屬性名 [ASC|DESC],升序或降序,符合你的心意。


       在MySQL中特有的關鍵字LIMIT。用LIMIT限制查詢結果的數量。查詢數據的時候,用戶只需要一部分數據,不需要大量全部數據,用LIMIT來控制顯示記錄的數量,不指定初始位置,LIMIT 記錄數,從第一條數據到你限定的個數,如果記錄數大於實際紀錄的數量,那隻會顯示全部紀錄;指定初始位置的話用LIMIT 初始位置,記錄數,初始位置參數是從指定位置開始的,記錄數指的是紀錄的條數,值得注意的是,第一條紀錄的位置是“0”,後面的紀錄以此類推。從第幾個位置,顯示幾條紀錄,這樣就能實現了。“LIMIT 0,2”ó“LIMIT 2”這樣是等價的。


       分組查詢應該是SQl語句中比較特別的了,GROUP BY關鍵字可以將查詢結果按字段或多個字段進行分組。單獨使用GROUP BY關鍵字來分組,對已有查詢結果進行分組,分組後對每組只顯示其第一條數據,以說明共有幾組,所以group by很特殊,它的主要作用就是用來和集合函數(count)、having子句配合使用,對所有數據進行分組,然後對各分組進行統計,然後提出約束條件選擇分組。GROUP BY 負責分組,集合函數負責統計各組內的數據。分組的話,是按照表中的列來分的,查詢函數也可以查其他的列。

       GROUP BY加上HAVING 條件表達式,可以限制輸出的結果,我們之前接觸過WHERE字句,它們很相似,都是來限制顯示的,不過有不同的作用,“WHERE 條件表達式”是用於查詢一條符合條件的記錄的,也就是表的一行,而“HAVING 條件表達式”作用在分組過後組中的符合條件的紀錄,區別還是比較大的。

       MySQL中,還可以用GROUP BY按多個字段來分組,也就是先按條件分一個組,在按第二個條件在第一個組的基礎上繼續分組,以此類推。

       GROUP BY關鍵字還可以和WITH ROLLUP一起使用,這樣查詢完成後會增加一條紀錄,來記錄每組紀錄的總和。

       使用集合函數查詢,可以用COUNT()函數統計紀錄的總數,與GROUP BY聯合使用的話,在()中寫入查詢的字段,可以針對需要的組來統計數據的總數,用SUM()函數來求出需要字段的總和,AVG()函數求平均值,MAX()函數求最大值,MIN()函數求最小值,剛纔一直強調GROUP BY和集合函數是一對“黃金搭檔”,一起使用可以發揮更大的作用。


         連接查詢是將兩個或兩個以上的表按公共字段連接起來,從中選取需要的數據。分兩種,內連接查詢,就是兩個表中根據公共字段連接兩個表,字段值相同,就查詢出紀錄。外連接查詢,可以查詢有公共字段的多個表,字段取值不相等的時候,系統會自動在不匹配的地方幫你補充NULL,爲你顯示一張表。外連接查詢包括左查詢和右查詢,就是根據顯示的順序不同來定義的,語法如下:

SELECT 屬性名列表

                   FROM 表名1 LEFT|RIGHT JOIN 表名2

                   ON 表名1.屬性名1 = 表名2.屬性名2 ;

根據查詢表的順序不同,左右連接也可以相互轉換。

       子查詢就是一種嵌套查詢。內層的查詢結果,爲外層查詢語句提供查詢條件。

       帶IN關鍵字的子查詢,一個SELECT語句查詢的結果在另一個查詢條件的範圍中,可以通過IN關鍵字來判斷,需要注意的是,當查詢的結果是一段數據的時候,IN和“=”是不能互相替代的,只有當內層查詢是一個數據的時候,IN和“=”的作用纔是相同的。

       帶比較運算符的子查詢。用比較運算符去選擇更合適的條件去查詢。

       帶EXISTS關鍵字的子查詢。EXISTS關鍵字表示存在,內層查詢語句不返回查詢的紀錄,而返回一個真假值。查詢到符合條件的數據,返回true,外層繼續查詢,返回false時,不進行。


       帶ANY關鍵字的子查詢。使用ANY關鍵字,表示滿足任一條件,內層查詢語句返回的結果任何一個,可以通過外層查詢語句查詢。

       帶ALL關鍵字的子查詢。ALL關鍵字表示滿足所有條件,只有這樣,才執行外層查詢條語句。

       合併查詢結果。使用UNION關鍵字,數據庫系統會將所有的數據不重複的查詢結果合併到一起, UNION ALL是全部合併。語法如下:

SELECT 語句1

   UNION | UNIONALL

SELECT 語句2

   UNION | UNIONALL…

SELECT 語句n ;需要的語句合併到一起。

       爲表取別名,這樣的目的是把複雜的表名化成簡單的表名,改名之後,在SELECT語句中查詢只能使用別名,原來的表名已經失效。

       爲字段去別名,把簡單的字段名改變成容易用戶理解的名字,方便閱讀。改變之後,原來的字段名和現有的別名都能用,字段別名只能在SELECT之後、FROM之前使用,不能用於WHERE子句。


       一般取別名都可以用空格隔開,然後後面跟上要起得新名字,只不過我們習慣上,爲表取別名就照這樣的格式,爲字段去別名加上AS關鍵字,用以區分。


       下面我們來學習一個比通配字符的查詢能力更強大,更靈活的方式——正則表達式。在MySQL中,使用REGEXP關鍵字來匹配查詢正則表達式,形式:屬性名 REGEXP  ‘匹配方式 ’。

       查詢以特定字符或字符串開頭的紀錄。使用字符“^”加上需要查詢的字符開頭。

       查詢以特定字符或字符串結尾的紀錄。字母結尾加上字符“&”。

       用符號“.”來代替字符串中任意一個字符。以“^”開頭,以“&”結尾,中間有幾個字符就使用幾個“.”。

       匹配指定字符中的任意一個。使用方括號([])將需要查詢字符組成一個字符集。正則表達式簡潔強大,匹配字母不需要用符號隔開,甚至空格也不需要。匹配一個範圍,使用“-”就代表一個範圍了。

       匹配指定字符串。正則表達式可以匹配字符串,放入單引號中,指定多個字符串的話,匹配任意一個,使用“|”來分隔需要的字符串。

       使用“*”和“+”來匹配多個字符。正則表達式中,使用“*”代表0個或多個字符,“+”代表至少一個字符,在這裏值得注意一下,教材上的實例有些不完整,如果表示一個字符前至少有一個字符的話,應該與“.”配合使用。

       使用{M}或者{M,N}來指定字符串連續出現的次數。“字符串{M}”表示字符串連續出現M次,“字符串{M,N}”表示字符串連續出現至少M次,最多N次。查詢出現重複字符串的個數,非常靈活,貼近生活。教材上有一些問題在使用上,字符串最好用“()”來包圍起來,不然根據結合的不同,查詢出來的結果出入會變得很大。

       從剛纔的介紹中不難看出正則表達式的強大,而且使用它可以靈活的設置字符串匹配的條件。不僅在MySQL中,Java語言、C#語言、PHP語言和Shell腳本語言都使用正則表達式,由此可以看出它的重要。


       之後我們來學習新的一章知識——索引。索引是一種特殊的數據結構,由表中的一列或多列組合而成,其實書上也沒有明確的定義索引究竟是什麼東西,我們只需知道它的作用是提高對錶中數據的查詢速度。

       索引有很顯著的優點,那就是可以提高檢索數據的速度,缺點也很明顯,創建和維護索引需要耗費時間。

       索引分爲六類:1.普通索引、2.唯一性索引、3.全文索引、4.單列索引、5.多列索引、6.空間索引。一般我們把重點放在1~3的索引,4、5兩種實際上可以是前面的3種任意一種或幾種組合,6對於初學者很少用到。

       普通索引,即不加任何限制條件的索引。

       唯一性索引,使用UNIQUE參數設置索引的唯一性,限制該索引的值也必須是唯一的。

       以上兩種索引適用的字段是數值。

       全文索引,使用FULLTEXT參數可以設置索引爲全文索引,只能在創建CHAR、VARCHAR或TEXT類型的字段上,查詢數據量較大的字符串類型的字段,可以提高查詢速度。

       單列索引,就是在表中的單個字段上創建索引。

       多列索引,就是在表中的多個字段上創建索引,需要注意的是,只有查詢條件中使用了這些字段中第一個字段纔會被使用。

       空間索引,使用SPATIAL參數設置爲空間索引。

       爲了把索引的使用效率變得更高,必須考慮合適的方式,索引有設置原則:

1.      選擇唯一性索引,可以快速確定紀錄。

2.      爲經常需要排序、分組和聯合操作的字段建立索引,有效避免排序。

3.      爲常作爲查詢條件的字段建立索引,這樣可以提高整個表的查詢速度。

4.      限制索引的數目,每個索引都佔用磁盤空間,越少越快。

5.      儘量使用數據量少的索引。

6.      儘量使用前綴來索引。

7.      刪除不再使用或者很少使用的索引。

       選擇索引還是爲了使查詢的速度更快,以上的原則要靈活運用。

       然後我們來看看如何創建索引。

       創建表的時候創建索引,這種方式更簡單。基本形式:

CREATE TABLE 表名 (……

[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY

[別名](屬性名1 [(長度)][ASC|DESC])

);

       UNIQUE可選,顧名思義,FULLTEXT爲全文索引,SPATIAL爲空間索引,INDEX和KEY參數指定字段,作用相同,別名可以取名稱,索引也可以升降序。也可以在已經存在的表中創建索引。還可以用ALTER TABLE語句來創建索引。

       有索引的情況下插入數據是相對慢的,最好的方式先刪除索引,然後插入數據,最後新建索引。刪除索引使用DROP INDEX 索引名 ON 表名;


         我們接下來看一個新的內容——視圖。


  視圖由數據庫中的一個表或多個表導出的虛擬表,它是來代替複雜的SELECT語句的,定義視圖爲複雜語句,然後直接查詢視圖,可以簡化SELECT語句。視圖可以隱藏表的部分信息,這樣保護數據的安全,還可以屏蔽原來表結構變化帶來的影響,提高表的邏輯獨立性。

         創建視圖通過SQL語句CREATE VIEW實現,之前我們一直沒有詳細的介紹如何觀察語法格式,[]內的內容是可有可無的,用|相隔的內容,是“或者”的關係,可以任取其一,{}只是把分散的一些值圈起來。

CREATE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]

VIEW 視圖名[(屬性清單)]

AS SELECT語句

[WITH [CASCADED|LOCAL] CHECK OPTION];

以上就是創建視圖的語法形式,ALGORITHM表示試圖選擇的算法;WITH CHECK OPTION保證更新視圖時在該視圖的權限範圍之內。

         ALGORITHM包括3個選擇,UNDEFINED表示MySQL將自動選擇要使用的算法、MERGE表示視圖語句與定義合併起來和TEMPTABLE表示將視圖存入臨時表,然後使用臨時表去執行語句。

         CASCADED是可選參數,表示更新視圖時要滿足所有相關視圖和表的條件,該參數爲默認值;LOCAL表示更新視圖時,要滿足定義的條件。

         視圖的左右總結有以下四點:

  第一點:使用視圖,可以定製用戶數據,聚焦特定的數據。

  解釋:在實際過程中,公司有不同角色的工作人員,我們以銷售公司爲例的話,

採購人員,可以需要一些與其有關的數據,而與他無關的數據,對他沒

有任何意義,我們可以根據這一實際情況,專門爲採購人員創建一個視

圖,以後他在查詢數據時,只需select * from view_caigou 就可以了。

  第二點:使用視圖,可以簡化數據操作。

  解釋:我們在使用查詢時,在很多時候我們要使用聚合函數,同時還要

顯示其它字段的信息,可能還會需要關聯到其它表,這時寫的語句可能

會很長,如果這個動作頻繁發生的話,我們可以創建視圖,這以後,我

們只需要select * from view1就可以了,很方便。

  第三點:使用視圖,基表中的數據就有了一定的安全性

  因爲視圖是虛擬的,物理上是不存在的,只是存儲了數據的集合,我們可以

將基表中重要的字段信息,可以不通過視圖給用戶,視圖是動態的數據的集

合,數據是隨着基表的更新而更新。同時,用戶對視圖,不可以隨意的更改

和刪除,可以保證數據的安全性。

  第四點:可以合併分離的數據,創建分區視圖。

  隨着社會的發展,公司的業務量的不斷的擴大,一個大公司,下屬都設有很

多的分公司,爲了管理方便,我們需要統一表的結構,定期查看各公司業務

情況,而分別看各個公司的數據很不方便,沒有很好的可比性,如果將這些

數據合併爲一個表格裏,就方便多了,這時我們就可以使用union關鍵字,

將各分公司的數據合併爲一個視圖。

         在多表上創建視圖,也就是在SELECT語句中用上連接查詢。

         查看視圖,就和查看錶的格式是一樣的,只不過把TABLE換成VIEW,查詢的語句都相仿。

         在MySQL中,使用CREATE ORREPLACE VIEW語句修改視圖,視圖存在就進行修改,視圖不存在,那就創建視圖,所有參數和創建視圖的參數是一樣的。

         ALTER語句可以修改表的定義,也可以創建索引,還可以作用於視圖,參數和創建視圖相同。

         更新視圖是指通過插入、更新和刪除表中的數據,視圖是一張虛擬的表其中當然沒有數據,更新實際上轉到基本表來完成操作。更新視圖,超出更新視圖權限的數據也不能完成更新。

         視圖中包涵函數、UNION、UNION ALL、DISTINCT、GROUP BY、HAVING等關鍵字、常量、子查詢、由不可更新的視圖導出的視圖、臨時表ALGORITHM爲TEMPTABLE、視圖對應的表存在沒有默認值的列,這些都不能使視圖完成更新。

         WITH[CASCADED|LOCAL]CHECKOPTION也同樣決定視圖能否更新,LOCAL表示更新滿足視圖本身定義,CASCADED表示滿足所有相關視圖和表的條件。

         刪除視圖,使用DROPVIEW來刪除視圖,只能刪除視圖的定義,不會刪除數據,DROP VIEW [IF EXISTS] 視圖名列表 [RESTRICT|CASCADE],IF EXISTS判斷視圖是否存在,存在就刪除,不存在則不會執行。


         接着,我們來學習一下觸發器。觸發器是由INSERT、UPDATE和DELETE等事件來觸發某種特定操作,滿足觸發器的觸發條件時,數據庫系統就會執行觸發器中定義的程序語句。

         在MySQL中,創建只有一個執行語句的觸發器的基本形式如下:

         CREATETRIGGER 觸發器名 BEFORE|AFTER 觸發事件

                            ON 表名 FOR EACHROW 執行語句

“BEFORE”指觸發事件之前執行觸發語句,“AFTER”則表示之後,FOR EACH ROW表示任何一條記錄上的操作滿足觸發事件就會觸發。

         創建有多個執行語句的觸發器,

CREATE TRIGGER 觸發器名BEFORE|AFTER 觸發事件

ON 表名 FOR EACH ROW

BEGIN

執行語句列表

END

BEGIN和END就像{}的作用一樣,表示一個語句塊。不同的執行語句之間用分號隔開,創建觸發器的過程需要用到“;”,當用戶在BEGIN和AND之間執行多條語句,“;”很容易影響數據庫的識別,爲了避免這種情況,用命令DELIMITER,來把MySQL的默認結束執行語句的“;”改成“&&”,最後記得創建觸發器之後,再次使用命令改回來。

         需要注意的是,一個表在相同觸發事件的相同觸發事件,只能創建一個觸發器。

         創建好觸發器之後,我們可以查看觸發器,SHOW TRIGGERS ;查看只能查詢全部的觸發器。

         在MySQL中,所有觸發器的定義都存在informantion_schema數據庫嚇得triggers表中,查詢tiggers表,SELECT  * FROM information_schema.triggers ;查詢數據庫中觸發器的詳細信息。

         觸發器執行的順序是BEFORE觸發器、表操作(INSERT、UPDATE和DELETE)、AFTER觸發器。

         不再使用的觸發器,使用DROPTRIGGER 觸發器名 ;來刪除觸發器,防止造成數據的變化。爲了確定刪除的情況,還可以到數據庫informantion_schema下的TRIGGER_NAME中再次確認。

  現在學習MySQL其實學習的也是SQL語句,當前階段只要學好SQL語句就很棒了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章