HETF-MySQL-核心技術指導手冊_第1頁
HETF-MySQL-核心技術指導手冊_第2頁
HETF-MySQL-核心技術指導手冊_第3頁
HETF-MySQL-核心技術指導手冊_第4頁
HETF-MySQL-核心技術指導手冊_第5頁
已閱讀5頁,還剩145頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

<HETF>MySQL核心技術指導手冊Author: fuqiangCreationDate: 2016-08-03LastUpdated: DocumentRef: MySQL核心技術指導手冊Version: 1.0DocRef:SAVEDATE\@"yyyy-MM-dd"2016-09-10文檔控制文檔控制更改記錄日期作者版本更改參考2016-09-11傅強1.0無前版本內容目錄文檔控制 i更改記錄 i內容目錄 ii1. Mysql概述 41.1. Mysql說明及特性 41.2. Mysql的安裝 51.3. Mysql的界面化工具 132. Mysql引擎 142.1. Mysql引擎介紹 142.2. 存儲引擎種類 142.3. InnoDB與Myisam對比 192.4. 常用的一些語句 203. Mysql的基本對象 213.1. 表 213.2. 索引 233.3. 視圖 304. 創(chuàng)建存儲過程/函數 344.1. 存儲過程 344.2. 函數 385. 鎖機制(事務控制) 425.1. 數據庫事務 425.2. 數據庫鎖機制 466. Mysql性能優(yōu)化 596.1. 系統(tǒng)優(yōu)化 596.2. Mysql優(yōu)化配置 626.3. 應用程序SQL語句+程序架構調整 737. 主從復制&集群 837.1. 集群 837.2. 主從復制 897.3. 集群實施方案 1128. MysqlDBA 1248.1. 數據備份和恢復 1248.2. 數據庫遷移 1279. Mysql與其他數據庫區(qū)別(ORACLE) 13010. 常用Mysql腳本 13710.1. 數據字典導出(PDMReader

) 13710.2. 數據庫監(jiān)控常用腳本 14510.3. 數據庫性能查看腳本 147未結與已結問題 148未接問題 148已結問題 148未結與已結問題PAGE4of8Mysql概述Mysql說明及特性概述MySQL是一個開放源碼的小型關聯式(關系型)數據庫管理系統(tǒng),開發(fā)者為瑞典MySQLAB公司。目前MySQL被廣泛地應用在Internet上的中小型網站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站數據庫。特性(代碼可移植)使用C和C++編寫,并使用了多種編譯器進行測試,保證源代碼的可移植性。*(多操作系統(tǒng))支持AIX、BSDi、FreeBSD、HP-UX、Linux、MacOS、NovellNetware、NetBSD、OpenBSD、OS/2Wrap、Solaris、SunOS、Windows等多種操作系統(tǒng)。*為多種編程語言提供了API。(例如c語言的一個api:intSTDCALLmysql_query(MYSQL*mysql,constchar*q);第一個參數為mysql很多重要變量的指針,第二個為sql語句)(多線程)支持多線程,充分利用CPU資源,支持多用戶。*(多語言)提供多語言支持,常見的編碼如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作數據表名和數據列名。提供TCP/IP、ODBC和JDBC等多種數據庫連接途徑。可以處理擁有上千萬條記錄的大型數據庫。四種數據庫對比Mysql的安裝1.2.1.mysql5.0安裝包/downloads/file/?id=4066591.2.2.mysql的安裝>mysql安裝圖文教程1mysql安裝向導啟動,按“Next”繼續(xù)>mysql圖文安裝教程2選擇安裝類型,有“Typical(默認)”、“Complete(完全)”、“Custom(用戶自定義)”三個選項,我們選擇“Custom”,有更多的選項,也方便熟悉安裝過程>mysql圖文安裝教程3在“DeveloperComponents(開發(fā)者部分)”上左鍵單擊,選擇“Thisfeature,andallsubfeatures,willbeinstalledonlocalharddrive.”,即“此部分,及下屬子部分內容,全部安裝在本地硬盤上”。在上面的“MySQLServer(mysql服務器)”、“ClientPrograms(mysql客戶端程序)”、“Documentation(文檔)”也如此操作,以保證安裝所有文件。點選“Change...”,手動指定安裝目錄。>mysql圖文安裝教程4

填上安裝目錄,我的是“F:\Server\MySQL\MySQLServer5.0”,也建議不要放在與操作系統(tǒng)同一分區(qū),這樣可以防止系統(tǒng)備份還原的時候,數據被清空。按“OK”繼續(xù)。>mysql圖文安裝教程5

返回剛才的界面,按“Next”繼續(xù)>mysql圖文安裝教程7正在安裝中,請稍候,直到出現下面的界面>mysql圖文安裝教程8

現在軟件安裝完成了,出現上面的界面,這里有一個很好的功能,mysql配置向導,不用向以前一樣,自己手動亂七八糟的配置my.ini了,將“ConfiguretheMysqlServernow”前面的勾打上,點“Finish”結束軟件的安裝并啟動mysql配置向導。>mysql圖文安裝教程9mysql配置向導啟動界面,按“Next”繼續(xù)>mysql圖文安裝教程10

選擇配置方式,“DetailedConfiguration(手動精確配置)”、“StandardConfiguration(標準配置)”,我們選擇“DetailedConfiguration”,方便熟悉配置過程>mysql圖文安裝教程11

選擇服務器類型,“DeveloperMachine(開發(fā)測試類,mysql占用很少資源)”、“ServerMachine(服務器類型,mysql占用較多資源)”、“DedicatedMySQLServerMachine(專門的數據庫服務器,mysql占用所有可用資源)”,大家根據自己的類型選擇了,一般選“ServerMachine”,不會太少,也不會占滿。>mysql圖文安裝教程12

選擇mysql數據庫的大致用途,“MultifunctionalDatabase(通用多功能型,好)”、“TransactionalDatabaseOnly(服務器類型,專注于事務處理,一般)”、“Non-TransactionalDatabaseOnly(非事務處理型,較簡單,主要做一些監(jiān)控、記數用,對MyISAM數據類型的支持僅限于non-transactional),隨自己的用途而選擇了,我這里選擇“TransactionalDatabaseOnly”,按“Next”繼續(xù)。>mysql圖文安裝教程13對InnoDBTablespace進行配置,就是為InnoDB數據庫文件選擇一個存儲空間,如果修改了,要記住位置,重裝的時候要選擇一樣的地方,否則可能會造成數據庫損壞,當然,對數據庫做個備份就沒問題了,這里不詳述。我這里沒有修改,使用用默認位置,直接按“Next”繼續(xù)>mysql圖文安裝教程14選擇您的網站的一般mysql訪問量,同時連接的數目,“DecisionSupport(DSS)/OLAP(20個左右)”、“OnlineTransactionProcessing(OLTP)(500個左右)”、“ManualSetting(手動設置,自己輸一個數)”,我這里選“OnlineTransactionProcessing(OLTP)”,自己的服務器,應該夠用了,按“Next”繼續(xù)>mysql圖文安裝教程15是否啟用TCP/IP連接,設定端口,如果不啟用,就只能在自己的機器上訪問mysql數據庫了,我這里啟用,把前面的勾打上,PortNumber:3306,在這個頁面上,您還可以選擇“啟用標準模式”(EnableStrictMode),這樣MySQL就不會允許細小的語法錯誤。如果您還是個新手,我建議您取消標準模式以減少麻煩。但熟悉MySQL以后,盡量使用標準模式,因為它可以降低有害數據進入數據庫的可能性。按“Next”繼續(xù)>mysql圖文安裝教程16西文編碼,第二個是多字節(jié)的通用utf8編碼,都不是我們通用的編碼,這里選擇第三個,然后在CharacterSet那里選擇或填入“gbk”,當然也可以用“gb2312”,區(qū)別就是gbk的字庫容量大,包括了gb2312的所有漢字,并且加上了繁體字、和其它亂七八糟的字——使用mysql的時候,在執(zhí)行數據操作命令之前運行一次“SETNAMESGBK;”(運行一次就行了,GBK可以替換為其它值,視這里的設置而定),就可以正常的使用漢字(或其它文字)了,否則不能正常顯示漢字。按“Next”繼續(xù)。(選utf8就好)>mysql圖文安裝教程17

選擇是否將mysql安裝為windows服務,還可以指定ServiceName(服務標識名稱),是否將mysql的bin目錄加入到WindowsPATH(加入后,就可以直接使用bin下的文件,而不用指出目錄名,比如連接,“mysql.exe-uusername-ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我這里全部打上了勾,ServiceName不變。按“Next”繼續(xù)。選擇是否將mysql安裝為windows服務,還可以指定ServiceName(服務標識名稱),是否將mysql的bin目錄加入到WindowsPATH(加入后,就可以直接使用bin下的文件,而不用指出目錄名,比如連接,“mysql.exe-uusername-ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我這里全部打上了勾,ServiceName不變。按“Next”繼續(xù)。>mysql圖文安裝教程18這一步詢問是否要修改默認root用戶(超級管理)的密碼(默認為空),“Newrootpassword”如果要修改,就在此填入新密碼(如果是重裝,并且之前已經設置了密碼,在這里更改密碼可能會出錯,請留空,并將“ModifySecuritySettings”前面的勾去掉,安裝配置完成后另行修改密碼),“Confirm(再輸一遍)”內再填一次,防止輸錯。“Enablerootaccessfromremotemachines(是否允許root用戶在其它的機器上登陸,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“CreateAnAnonymousAccount(新建一個匿名用戶,匿名用戶可以連接數據庫,不能操作數據,包括查詢)”,一般就不用勾了,設置完畢,按“Next”繼續(xù)。>mysql圖文安裝教程19確認設置無誤,如果有誤,按“Back”返回檢查。按“Execute”使設置生效。>mysql圖文安裝教程20設置完畢,按“Finish”結束mysql的安裝與配置——這里有一個比較常見的錯誤,就是不能“Startservice”,一般出現在以前有安裝mysql的服務器上,解決的辦法,先保證以前安裝的mysql服務器徹底卸載掉了;不行的話,檢查是否按上面一步所說,之前的密碼是否有修改,照上面的操作;如果依然不行,將mysql安裝目錄下的data文件夾備份,然后刪除,在安裝完成后,將安裝生成的data文件夾刪除,備份的data文件夾移回來,再重啟mysql服務就可以了,這種情況下,可能需要將數據庫檢查一下,然后修復一次,防止數據出錯。Mysql的界面化工具SQLiteNavicat等等下載地址:/soft/7075.htmlnavicat注冊碼名和組織都是:iNViSiBLETEAMNavicatforMySQLEnterpriseEdition8注冊碼:NAVJ-W56S-3YUU-MVHVMysql引擎Mysql引擎介紹存儲引擎說白了就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。因為在關系數據庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和操作此表的類型)。在Oracle和SQLServer等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的。而MySql數據庫提供了多種存儲引擎。用戶可以根據不同的需求為數據表選擇不同的存儲引擎,用戶也可以根據自己的需要編寫自己的存儲引擎。

MySQL插件式存儲引擎的體系結構存儲引擎種類2.2.1.InnoDB(默認的Mysql引擎)>概要說明:InnoDB表類型可以看作是對MyISAM(最原始)的進一步更新產品,它提供了事務、行級鎖機制和外鍵約束的功能。(適用于頻繁的進行更新、刪除操作)InnoDB給Mysql的表提供了事務、回滾、崩潰修復能力、多版本并發(fā)控制的事務安全、間隙鎖(可以有效的防止幻讀的出現)、支持輔助索引、聚簇索引、自適應hash索引、支持熱備、行級鎖。還有InnoDB是Mysql上唯一一個提供了外鍵約束的引擎。InnoDB存儲引擎中,創(chuàng)建的表的表結構是單獨存儲的并且存儲在.frm文件中。數據和索引存儲在一起的并且存儲在表空間中。但是默認情況下mysql會將數據庫的所有InnoDB表存儲在一個表空間中的。其實這種方式管理起來非常的不方便而且還不支持高級功能所以建議每個表存儲為一個表空間實現方式為:使用服務器變量innodb_file_per_table=1。缺點:InnoDB的備份恢復要麻煩一點,除非你使用了4.1以后版本提供的Mulit-tablespace支持,因為InnoDB和MyISAM不同,他的數據文件并不是獨立對應于每張表的。而是使用的共享表空間,簡單的拷貝覆蓋方法對他不適用,必須在停掉MYSQL后對進行數據恢復。>設計原理:從物理意義上來講,InnoDB表由共享表空間、日志文件組(redo文件組)、表結構定義文件組成。若將innodb_file_per_table設置為on,則系統(tǒng)將為每一個表單獨的生成一個table_name.ibd的文件,在此文件中,存儲與該表相關的數據、索引、表的內部數據字典信息。表結構文件則以.frm結尾,這與存儲引擎無關。InnoDB存儲引擎的管理是由引擎本身完成的,表空間是由分散的頁和段組成。區(qū)由64個連續(xù)的頁組成,每個頁大小為16K,即每個區(qū)大小為1MB,創(chuàng)建新表時,先有32頁大小的碎片頁存放數據,使用完后才是區(qū)的申請,(InnoDB最多每次申請4個區(qū),保證數據的順序性能)頁類型有:數據頁、Undo頁、系統(tǒng)頁、事務數據頁、插入緩沖位圖頁、以及插入緩沖空閑列表頁。以下為InnoDB的表空間結構圖:在InnoDB存儲引擎中,默認表空間文件是ibdata1,初始化為10M,且可以擴展,如下圖所示:修改表空間語句:Innodb_data_file_path=ibdata1:370M;ibdata2:50M:autoextend使用共享表空間存儲方式時,Innodb的所有數據保存在一個單獨的表空間里面,而這個表空間可以由很多個文件組成,一個表可以跨多個文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關數據。而在使用單獨表空間存儲方式時,每個表的數據以一個單獨的文件來存放,這個時候的單表限制,又變成文件系統(tǒng)的大小限制了。>共享表空間和獨立表空間共享表空間與獨占表空間可以通過參數innodb_file_per_table來轉換,若為1,則開啟獨占表空間,否則,開啟共享表存儲。在服務器資源有限,單表數據不是特別多的情況下,

獨立表空間明顯比共享方式效率更高.但是MySQL默認是共享表空間

。具體的共享表空間和獨立表空間優(yōu)缺點如下:共享表空間:優(yōu)點:可以放表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分布在不同步的文件上)。數據和文件放在一起方便管理。缺點:所有的數據和索引存放到一個文件中以為著將有一個很常大的文件,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,這樣對于一個表做了大量刪除操作后表空間中將會有大量的空隙,特別是對于統(tǒng)計分析,日值系統(tǒng)這類應用最不適合用共享表空間。獨立表空間:在配置文件(f)中設置:

innodb_file_per_table優(yōu)點:1.每個表都有自已獨立的表空間。2.每個表的數據和索引都會存在自已的表空間中。3.可以實現單表在不同的數據庫中移動。4.空間可以回收(除drop

table操作處,表空不能自已回收)a)Drop

table操作自動回收表空間,如果對于統(tǒng)計分析或是日值表,刪除大量數據后可以通過:alter

table

TableName

engine=innodb;回縮不用的空間。b)對于使innodb-plugin的Innodb使用truncate

table也會使空間收縮。c)對于使用獨立表空間的表,不管怎么刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。缺點:單表增加過大對于啟用了innodb_file_per_table

的參數選項之后,在每個表對應的.idb文件內只是存放了數據、索引和插入緩沖,而撤銷(undo)信息,系統(tǒng)事務信息,二次寫緩沖等還是存放在了原來的共享表空間內。2.2.2.MyISAM存儲引擎MyISAM存儲引擎是Mysql中常見的存儲引擎,MyISAM存儲引擎是基于ISAM存儲引擎發(fā)展起來的。MyISAM支持全文索引、壓縮存放、空間索引(空間函數)、表級鎖、延遲更新索引鍵。但是MyISAM不支持事務、行級鎖、更無法忍受的是崩潰后不能保證完全恢復(只能手動修復)。MyISAM存儲引擎的表存儲成3個文件。文件的名字和表的名字相同。擴展名包含frm、MYD、MYI。其中frm為擴展名的文件存儲表的結構;MYD為擴展名的文件存儲數據,其是MYData的縮寫;MYI為擴展名的文件存儲索引,其為MYIndex的縮寫。MyISAM存儲引擎的插入數據很快,空間和內存使用比較低。如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM存儲引擎能夠實現處理的高效率。如果應用的完整性、并發(fā)性要求很低,也可以選擇MyISAM存儲引擎。三種MyIsAm引擎:靜態(tài)MyISAM:如果數據表中的各數據列的長度都是預先固定好的,服務器將自動選擇這種表類型。因為數據表中每一條記錄所占用的空間都是一樣的,所以這種表存取和更新的效率非常高。當數據受損時,恢復工作也比較容易做。動態(tài)MyISAM:如果數據表中出現varchar、xxxtext或xxxBLOB字段時,服務器將自動選擇這種表類型。相對于靜態(tài)MyISAM,這種表存儲空間比較小,但由于每條記錄的長度不一,所以多次修改數據后,數據表中的數據就可能離散的存儲在內存中,進而導致執(zhí)行效率下降。同時,內存中也可能會出現很多碎片。因此,這種類型的表要經常用optimizetable命令或優(yōu)化工具來進行碎片整理。壓縮MyISAM:以上說到的兩種類型的表都可以用myisamchk工具壓縮。這種類型的表進一步減小了占用的存儲,但是這種表壓縮之后不能再被修改。另外,因為是壓縮數據,所以這種表在讀取的時候要先時行解壓縮。但是,不管是何種MyISAM表,目前它都不支持事務,行級鎖和外鍵約束的功能。2.23.Memory存儲引擎這種類型的數據表只存在于內存中。它使用散列索引,所以數據的存取速度非常快。因為是存在于內存中,所以這種類型常應用于臨時表中。MEMORY存儲引擎是Mysql中的一類特殊的存儲引擎。其使用存儲在內存中的內存來創(chuàng)建表,而且所有數據保存在內存中。數據安全性很低,但是查找和插入速度很快。如果內存出現異常就會影響到數據的完整性,如果重啟或關機,表中的所有數據就會丟失,因此基于MEMORY存儲引擎的表的生命周期很短,一般都是一次性的。適用于某些特殊場景像查找和映射,緩存周期性的聚合數據等等。2.24.Archive存儲引擎這種類型只支持select和insert語句,而且不支持索引。常應用于日志記錄和聚合分析方面。ARCHIVE,見名之意可看出是歸檔,所以歸檔之后很多的高級功能就不再支持了僅支持插入(insert)和查詢(select)兩種功能,

ARCHIVE存儲引擎之前還不支持索引(在Mysql5.5以后開始支持索引了),但是它擁有很好的壓縮機制。通常用于做倉庫使用。ARCHIVE存儲引擎適用于存儲日志信息或其他按時間序列實現的數據采集類的應用場景中。InnoDB與Myisam對比InnoDB與Myisam的六大區(qū)別MyISAMInnoDB構成上的區(qū)別:每個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名為.MYD(MYData)。索引文件的擴展名是.MYI(MYIndex)。基于磁盤的資源是InnoDB表空間數據文件和它的日志文件,InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB事務處理上方面:MyISAM類型的表強調的是性能,其執(zhí)行數度比InnoDB類型更快,但是不提供事務支持InnoDB提供事務支持事務,外部鍵等高級數據庫功能SELECT\o"UPDATE"UPDATE,INSERT,Delete操作如果執(zhí)行大量的SELECT,MyISAM是更好的選擇1.如果你的數據執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表2.DELETEFROMtable時,InnoDB不會重新建立表,而是一行一行的刪除。3.LOADTABLEFROMMASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用對AUTO_INCREMENT的操作每表一個AUTO_INCREMEN列的內部處理。MyISAM為INSERT和UPDATE操作自動更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂的值被刪除之后就不能再利用。(當AUTO_INCREMENT列被定義為多列索引的最后一列,可以出現重使用從序列頂部刪除的值的情況)。AUTO_INCREMENT值可用ALTERTABLE或myisamch來重置對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引更好和更快的auto_increment處理如果你為一個表指定AUTO_INCREMENT列,在數據詞典里的InnoDB表句柄包含一個名為自動增長計數器的計數器,它被用在為該列賦新值。自動增長計數器僅被存儲在主內存中,而不是存在磁盤上關于該計算器的算法實現,請參考AUTO_INCREMENT列在InnoDB里如何工作表的具體行數selectcount(*)fromtable,MyISAM只要簡單的讀出保存好的行數,注意的是,當count(*)語句包含where條件時,兩種表的操作是一樣的InnoDB中不保存表的具體行數,也就是說,執(zhí)行selectcount(*)fromtable時,InnoDB要掃描一遍整個表來計算有多少行鎖表鎖提供行鎖(lockingonrowlevel),提供與\o"Oracle"Oracle

類型一致的不加鎖讀取(non-lockingreadin

SELECTs),另外,InnoDB表的行鎖也不是絕對的,如果在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如updatetablesetnum=1where

\o"name"name

like“%aaa%”常用的一些語句查看數據庫可以支持的存儲引擎查看表的結構等信息的若干命令Desc[ribe]tablename;

//查看數據表的結構Showcreatetabletablename;

//顯示表的創(chuàng)建語句Showtablestatuslike‘tablename’//顯示表的當前狀態(tài)值創(chuàng)建數據庫表時設置存儲存儲引擎CreatetabletableName(columnName(列名1)

type(數據類型)

attri(屬性設置),columnName(列名2)

type(數據類型)

attri(屬性設置),……..)engine=engineName修改存儲引擎假如,若需要將表user的存儲引擎修改為archive類型,則可使用命令altertableuserengine=archiveMysql的基本對象表3.1.1.數據表數據列基本類型(紅色代表常用)//表的基本類型M指出最大的顯示尺寸。最大的合法的顯示尺寸是255。D適用于浮點類型并且指出跟隨在十進制小數點后的數碼的數量。方括號(“[”和“]”)指出可選的類型修飾符的部分。注意,如果你指定一個了為ZEROFILL,MySQL將為該列自動地增加UNSIGNED屬性。TINYINT[(M)][UNSIGNED][ZEROFILL],紅色代表常用。一個很小的整數。有符號的范圍是-128到127,無符號的范圍是0到255。SMALLINT[(M)][UNSIGNED][ZEROFILL]一個小整數。有符號的范圍是-32768到32767,無符號的范圍是0到65535。MEDIUMINT[(M)][UNSIGNED][ZEROFILL]一個中等大小整數。有符號的范圍是-8388608到8388607,無符號的范圍是0到16777215。INT[(M)][UNSIGNED][ZEROFILL]一個正常大小整數。有符號的范圍是-2147483648到2147483647,無符號的范圍是0到4294967295。INTEGER[(M)][UNSIGNED][ZEROFILL]這是INT的一個同義詞。BIGINT[(M)][UNSIGNED][ZEROFILL]一個大整數。有符號的范圍是-9223372036854775808到9223372036854775807,無符號的范圍是0到FLOAT[(M,D)][ZEROFILL]一個小(單精密)浮點數字。不能無符號。允許的值是-3.402823466E+38到-1.175494351E-38,0和1.175494351E-38到3.402823466E+38。M是顯示寬度而D是小數的位數。沒有參數的FLOAT或有<24的一個參數表示一個單精密浮點數字。DOUBLE[(M,D)][ZEROFILL]一個正常大小(雙精密)浮點數字。不能無符號。允許的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。M是顯示寬度而D是小數位數。沒有一個參數的DOUBLE或FLOAT(X)(25<=X<=53)代表一個雙精密浮點數字。DECIMAL[(M[,D])][ZEROFILL]一個未壓縮(unpack)的浮點數字。不能無符號。行為如同一個CHAR列:“未壓縮”意味著數字作為一個字符串被存儲,值的每一位使用一個字符。小數點,并且對于負數,“-”符號不在M中計算。如果D是0,值將沒有小數點或小數部分。DECIMAL值的最大范圍與DOUBLE相同,但是對一個給定的DECIMAL列,實際的范圍可以通過M和D的選擇被限制。如果D被省略,它被設置為0。如果M被省掉,它被設置為10。注意,在MySQL3.22里,M參數包括符號和小數點。NUMERIC(M,D)[ZEROFILL]這是DECIMAL的一個同義詞。DATE一個日期。支持的范圍是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式來顯示DATE值,但是允許你使用字符串或數字把值賦給DATE列。DATETIME一個日期和時間組合。支持的范圍是'1000-01-0100:00:00'到'9999-12-3123:59:59'。MySQL以'YYYY-MM-DDHH:MM:SS'格式來顯示DATETIME值,但是允許你使用字符串或數字把值賦給DATETIME的列。TIMESTAMP[(M)]一個時間戳記。范圍是'1970-01-0100:00:00'到2037年的某時。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式來顯示TIMESTAMP值,取決于是否M是14(或省略)、12、8或6,但是允許你使用字符串或數字把值賦給TIMESTAMP列。一個TIMESTAMP列對于記錄一個INSERT或UPDATE操作的日期和時間是有用的,因為如果你不自己給它賦值,它自動地被設置為最近操作的日期和時間。你以可以通過賦給它一個NULL值設置它為當前的日期和時間。TIME一個時間。范圍是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式來顯示TIME值,但是允許你使用字符串或數字把值賦給TIME列。YEAR[(2|4)]一個2或4位數字格式的年(缺省是4位)。允許的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069(70-69)。MySQL以YYYY格式來顯示YEAR值,但是允許你把使用字符串或數字值賦給YEAR列。(YEAR類型在MySQL3.22中是新類型。)CHAR(M)[BINARY]一個定長字符串,當存儲時,總是是用空格填滿右邊到指定的長度。M的范圍是1~255個字符。當值被檢索時,空格尾部被刪除。CHAR值根據缺省字符集以大小寫不區(qū)分的方式排序和比較,除非給出BINARY關鍵詞。NATIONALCHAR(短形式NCHAR)是ANSISQL的方式來定義CHAR列應該使用缺省字符集。這是MySQL的缺省。CHAR是CHARACTER的一個縮寫。[NATIONAL]VARCHAR(M)[BINARY]一個變長字符串。注意:當值被存儲時,尾部的空格被刪除(這不同于ANSISQL規(guī)范)。M的范圍是1~255個字符。VARCHAR值根據缺省字符集以大小寫不區(qū)分的方式排序和比較,除非給出BINARY關鍵詞值。VARCHAR是CHARACTERVARYING一個縮寫。TINYBLOBTINYTEXT一個BLOB或TEXT列,最大長度為255(2^8-1)個字符。BLOBTEXT一個BLOB或TEXT列,最大長度為65535(2^16-1)個字符。MEDIUMBLOBMEDIUMTEXT一個BLOB或TEXT列,最大長度為16777215(2^24-1)個字符。LONGBLOBLONGTEXT一個BLOB或TEXT列,最大長度為4294967295(2^32-1)個字符。ENUM('value1','value2',...)枚舉。一個僅有一個值的字符串對象,這個值式選自與值列表'value1'、'value2',...,或NULL。一個ENUM最多能有65535不同的值。SET('value1','value2',...)一個集合。能有零個或多個值的一個字符串對象,其中每一個必須從值列表'value1','value2',...選出。一個SET最多能有64個成員。3.1.2.操作數據表語句>usedatabase數據庫名;//創(chuàng)建表之前先要選擇數據庫,如果沒有數據庫,則創(chuàng)建數據庫createdatabase數據庫名;>createtable商品表(//創(chuàng)建數據表PIDintAUTO_INCREMENT,//設置id自增namevarchar(20),primarykey(PID));>droptable數據庫名>altertable舊表名renameto新表名;//修改表名>altertable<表名>modify<字段名><數據類型>//修改表字段類型>altertable<表名>change<舊字段名><新字段名><新數據類型>//改字段名>altertable<表名>add<字段名><數據類型>[約束條件][first|after已存在字段名];//添加一個數據表字段>altertable<表名>modify<字段1><數據類型>first|after<字段類型2>//改變現有字段的位置3.1.3.一般原則(1)越小的數據類型通常更好:越小的數據類型通常在磁盤、內存和CPU緩存中都需要更少的空間,處理起來更快。

(2)簡單的數據類型更好:整型數據比起字符,處理開銷更小,因為字符串的比較更復雜。在MySQL中,應該用內置的日期和時間數據類型,而不是用字符串來存儲時間;以及用整型數據類型存儲IP地址。

(3)盡量避免NULL:應該指定列為NOTNULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優(yōu)化,因為它們使得索引、索引的統(tǒng)計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值。索引索引就是加快檢索表中數據的方法。數據庫的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。在數據庫中,索引也允許數據庫程序迅速地找到表中的數據,而不必掃描整個數據庫。先掃描索引表的內容,如果有索引就可以迅速定位到該位置。innodb存儲引擎支持兩種常見的索引:B+樹索引和哈希索引。innodb支持哈希索引是自適應的,innodb會根據表的使用情況自動生成哈希索引。B+樹索引就是傳統(tǒng)意義上的索引,是關系型數據庫中最常用最有效的索引。B+樹是從最早的平衡二叉樹演變而來,但是B+樹不是一個二叉樹。B+中的B不代表二叉(Binary),而是代表平衡(Balance)。本章主要講B+樹索引。3.2.1.索引原理數據庫中B+樹索引分為聚集索引(clusteredindex)和非聚集索引(secondaryindex).這兩種索引的共同點是內部都是B+樹,高度都是平衡的,葉節(jié)點存放著所有數據。不同點是葉節(jié)點是否存放著一整行數據。聚簇索引(創(chuàng)建主鍵的時候,自動就創(chuàng)建了主鍵的聚集索引。)聚簇索引保證關鍵字的值相近的元組存儲的物理位置也相同(所以字符串類型不宜建立聚簇索引,特別是隨機字符串,會使得系統(tǒng)進行大量的移動操作),且一個表只能有一個聚簇索引。因為由存儲引擎實現索引,所以,并不是所有的引擎都支持聚簇索引。目前,只有solidDB和InnoDB支持。聚簇索引的結構大致如下聚簇索引也稱為聚集索引,聚類索引,簇集索引,聚簇索引確定表中數據的物理順序。聚簇索引類似于電話簿,后者按姓氏排列數據。由于聚簇索引規(guī)定數據在表中的物理存儲順序,因此一個表只能包含一個聚簇索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。漢語字典也是聚簇索引的典型應用,在漢語字典里,索引項是字母+聲調,字典正文也是按照先字母再聲調的順序排列。聚簇索引對于那些經常要搜索范圍值的列特別有效。使用聚簇索引找到包含第一個值的行后,便可以確保包含后續(xù)索引值的行在物理相鄰。例如,如果應用程序執(zhí)行的一個查詢經常檢索某一日期范圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然后檢索表中所有相鄰的行,直到到達結束日期。這樣有助于提高此類查詢的性能。同樣,如果對從表中檢索的數據進行排序時經常要用到某一列,則可以將該表在該列上聚簇(物理排序),避免每次查詢該列時都進行排序,從而節(jié)省成本。非聚簇索引(普通索引)每個表只能有一個聚簇索引,因為一個表中的記錄只能以一種物理順序存放。但是,一個表可以有不止一個非聚簇索引。實際上,對每個表你最多可以建立249個非聚簇索引。非聚簇索引需要大量的硬盤空間和內存。另外,雖然非聚簇索引可以提高從表中取數據的速度,它也會降低向表中插入和更新數據的速度。每當你改變了一個建立了非聚簇索引的表中的數據時,必須同時更新索引。因此你對一個表建立非聚簇索引時要慎重考慮。如果你預計一個表需要頻繁地更新數據,那么不要對它建立太多非聚簇索引。另外,如果硬盤和內存空間有限,也應該限制使用非聚簇索引的數量。非聚簇索引,葉級頁指向表中的記錄,記錄的物理順序與邏輯順序沒有必然的聯系。非聚簇索引則更像書的標準索引表,索引表中的順序通常與實際的頁碼順序是不一致的。非聚簇索引查找數據示意圖。B+樹算法B+樹是為磁盤及其他存儲輔助設備而設計一種平衡查找樹(不是二叉樹)。B+樹中,所有記錄的節(jié)點按大小順序存放在同一層的葉節(jié)點中,各葉節(jié)點用指針進行連接。下面演示一個B+數結構,高度為2,每頁可放4條記錄,扇出(fanout)為5。從下圖1可以看出,所有記錄都在頁節(jié)點中,并且為順序存放,我們從最左邊的葉節(jié)點開始遍歷,可以得到所有鍵值的順序排序:5、10、15、20、25、30、50、55、60、65、75、80、85、90.圖1

高度為2的B+樹(1)B+樹的插入操作B+樹的插入必須保證插入后葉節(jié)點的記錄依然排序。同時要考慮插入B+樹的三種情況,每種情況都可能導致不同的插入算法。如下表所示:我們實例分析B+樹的插入,在圖1的B+樹中,我們需要插入28這個值。因為LeafPage和Indexpage都沒有滿,我們直接將記錄插入葉節(jié)點就可以了。如下圖2所示:圖2

插入鍵值28下面我們再插入70這個值,這時LeafPage已經滿了,但是IndexPage還沒有滿,符合上面的第二種情況。這時插入LeafPage的情況為50、55、60、65、70.我們根據中間的值60拆分葉節(jié)點,可得到下圖3所示(雙項鏈表指針依然存在,沒有畫出):圖3插入鍵值70最后我們再插入95,這個LeafPage和IndexPage都滿了,符合上面第三種情況。需要做2次拆分,如下圖4所示:圖4插入鍵值95可以看到,不管怎么變化,B+樹總會保持平衡。但是為了保持平衡,對于新插入的鍵值可能需要做大量的拆分頁操作。B+樹主要用于磁盤,拆分意味著磁盤的操作,應該在可能的情況下盡量減少頁的拆分。因此,B+樹提供了旋轉功能。旋轉發(fā)生在LeafPage已經滿了,但是左右兄弟節(jié)點沒有滿的情況下。這時B+樹并不是急著做頁的拆分,而是旋轉。旋轉結果如圖5所示,可以看到旋轉操作使B+樹減少了一次頁的拆分操作,高度仍然為2.圖5B+樹的旋轉操作(2)B+樹的刪除操作B+樹使用填充因子來控制數的刪除變化。填充因子可以設置的最小值為50%。B+樹的刪除操作同樣保證刪除后葉節(jié)點的記錄依然排序。根據填充因子的變化,B+樹刪除依然需要考慮三種情況,如下表所示:根據圖4的B+樹,我們進行刪除操作,首先刪除鍵值為70的這條記錄,該記錄符合上表第一種情況,刪除后如下圖6所示:圖6刪除鍵值70接著我們刪除鍵值為25的記錄,這也是屬于上表第一種情況,不同的是該值還是indexpage中的值。因此在刪除LeafPage中的25后,還需要將25的右兄弟節(jié)點28更新到IndexPage中,如下圖7所示(圖中有兩個筆誤,紅色為修正值):圖7刪除鍵值28最后我們刪除鍵值為60的記錄。刪除Leafpage鍵值為60的記錄后,其填充因子小于50%。需要做合并操作。同樣在刪除Indexpage中相關記錄后需要做IndexPage的合并操作。3.2.2.創(chuàng)建和刪除索引(1)使用ALTERTABLE語句創(chuàng)建索引。語法如下:altertabletable_nameaddindexindex_name(column_list);altertabletable_nameaddunique(column_list);altertabletable_nameaddprimarykey(column_list);其中包括普通索引、UNIQUE索引和PRIMARYKEY索引3種創(chuàng)建索引的格式,table_name是要增加索引的表名,column_list指出對哪些列進行索引,多列時各列之間用逗號分隔。索引名index_name可選,缺省時,MySQL將根據第一個索引列賦一個名稱。另外,ALTERTABLE允許在單個語句中更改多個表,因此可以同時創(chuàng)建多個索引。創(chuàng)建索引的示例如下:mysql>usetpscDatabasechangedmysql>altertabletpscaddindexshili(tpmc);(2)使用CREATEINDEX語句對表增加索引。能夠增加普通索引和UNIQUE索引兩種。其格式如下:createindexindex_nameontable_name(column_list);createuniqueindexindex_nameontable_name(column_list);說明:table_name、index_name和column_list具有與ALTERTABLE語句中相同的含義,索引名不可選。另外,不能用CREATEINDEX語句創(chuàng)建PRIMARYKEY索引。(3)刪除索引。刪除索引可以使用ALTERTABLE或DROPINDEX語句來實現。DROPINDEX可以在ALTERTABLE內部作為一條語句處理,其格式如下:dropindexindex_nameontable_name;altertabletable_namedropindexindex_name;altertabletable_namedropprimarykey;其中,在前面的兩條語句中,都刪除了table_name中的索引index_name。而在最后一條語句中,只在刪除PRIMARYKEY索引中使用,因為一個表只可能有一個PRIMARYKEY索引,因此不需要指定索引名。如果沒有創(chuàng)建PRIMARYKEY索引,但表具有一個或多個UNIQUE索引,則MySQL將刪除第一個UNIQUE索引。如果從表中刪除某列,則索引會受影響。對于多列組合的索引,如果刪除其中的某列,則該列也會從索引中刪除。如果刪除組成索引的所有列,則整個索引將被刪除。刪除索引的操作,如下面的代碼:mysql>dropindexshiliontpsc;視圖視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖并不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。對其中所引用的基礎表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當前或其它數據庫的一個或多個表,或者其它視圖。通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。用戶只能看到視圖給他看到的內容,所以更安全。好處:1、視圖能簡化用戶操作視圖機制使用戶可以將注意力集中在所關心地數據上。如果這些數據不是直接來自基本表,則可以通過定義視圖,使數據庫看起來結構簡單、清晰,并且可以簡化用戶的的數據查詢操作。例如,那些定義了若干張表連接的視圖,就將表與表之間的連接操作對用戶隱藏起來了。換句話說,用戶所作的只是對一個虛表的簡單查詢,而這個虛表是怎樣得來的,用戶無需了解。2、視圖使用戶能以多種角度看待同一數據

視圖機制能使不同的用戶以不同的方式看待同一數據,當許多不同種類的用戶共享同一個數據庫時,這種靈活性是非常必要的。3、視圖對重構數據庫提供了一定程度的邏輯獨立性數據的物理獨立性是指用戶的應用程序不依賴于數據庫的物理結構。數據的邏輯獨立性是指當數據庫重構造時,如增加新的關系或對原有的關系增加新的字段,用戶的應用程序不會受影響。層次數據庫和網狀數據庫一般能較好地支持數據的物理獨立性,而對于邏輯獨立性則不能完全的支持。3.3.1.視圖語句>CREATE[ORREPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}][DEFINER={user|CURRENT_USER}][SQLSECURITY{DEFINER|INVOKER}]VIEWview_name[(column_list)]ASselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]//創(chuàng)建視圖語法例子:創(chuàng)建一個員工表并插入數據CREATETABLEt_employee(IDINTPRIMARYKEYAUTO_INCREMENT,NAMECHAR(30)NOTNULL,SEXCHAR(2)NOTNULL,AGEINTNOTNULL,DEPARTMENTCHAR(10)NOTNULL,SALARYINTNOTNULL,HOMECHAR(30),MARRYCHAR(2)NOTNULLDEFAULT'否',HOBBYCHAR(30));INSERTINTOlearning.t_employee(ID,NAME,SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY)VALUES(NULL,'小紅','女',20,'人事部','4000','廣東','否','網球');INSERTINTOlearning.t_employee(ID,NAME,SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY)VALUES(NULL,'明日','女',21,'人事部','9000','北京','否','網球');INSERTINTOlearning.t_employee(ID,NAME,SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY)VALUES(NULL,'天天','男',22,'研發(fā)部','8000','上海','否','音樂');INSERTINTOlearning.t_employee(ID,NAME,SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY)VALUES(NULL,'大大','女',23,'研發(fā)部','9000','重慶','否','無');INSERTINTOlearning.t_employee(ID,NAME,SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY)VALUES(NULL,'王下','女',24,'研發(fā)部','9000','四川','是','足球');INSERTINTOlearning.t_employee(ID,NAME,SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY)VALUES(NULL,'無名','男',25,'銷售部','6000','福建','否','游戲');INSERTINTOlearning.t_employee(ID,NAME,SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY)VALUES(NULL,'不知道','女',26,'銷售部','5000','山西','否','籃球');(2)創(chuàng)建員工信息表并插入數據createTABLEt_employee_detail(IDINTPRIMARYKEY,POSCHAR(10)NOTNULL,EXPERENCECHAR(10)NOTNULL,CONSTRAINT`FK_ID`FOREIGNKEY(ID)REFERENCESt_employee(ID))INSERTINTOt_employee_detail(ID,POS,EXPERENCE)VALUES(1,'人事管理','工作二年');INSERTINTOt_employee_detail(ID,POS,EXPERENCE)VALUES(2,'人事招聘','工作二年');INSERTINTOt_employee_detail(ID,POS,EXPERENCE)VALUES(3,'初級工程師','工作一年');INSERTINTOt_employee_detail(ID,POS,EXPERENCE)VALUES(4,'中級工程師','工作二年');INSERTINTOt_employee_detail(ID,POS,EXPERENCE)VALUES(5,'高級工程師','工作三年');INSERTINTOt_employee_detail(ID,POS,EXPERENCE)VALUES(6,'銷售代表','工作二年');INSERTINTOt_employee_detail(ID,POS,EXPERENCE)VALUES(7,'銷售員','工作一年');(3)在創(chuàng)建視圖前應先看看是否有權限SELECTSELECT_priv,create_view_privfrommysql.userWHEREuser='root'(4)創(chuàng)建視圖CREATEVIEWV_VIEW2(ID,NAME,SEX,AGE,DEPARTMENT,POS,EXPERENCE)ASSELECTa.ID,a.NAME,a.SEX,a.AGE,a.DEPARTMENT,b.POS,b.EXPERENCEFROMlearning.t_employeea,learning.t_employee_detailbWHEREa.ID=b.ID;SELECT*FROMV_VIEW2(5)查看視圖DESCRIBEV_VIEW2(5)修改視圖ALTERVIEWV_VIEW1(ID,NAME)ASSELECTID,NAMEFROMlearning.t_employee;SELECT*FROMlearning.v_view1不可更新的視圖:(如果值和表數據是一一對應的,那么可以直接更新視圖,真實表的數據也會有相應改變)

某些視圖是可更新的。也就是說,可以在諸如UPDATE、DELETE或INSERT等語句中使用它們,以更新基表的內容。對于可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關系。還有一些特定的其他結構,這類結構會使得視圖不可更新。比如:·聚合函數(SUM(),MIN(),MAX(),COUNT()等)。

·DISTINCT

·GROUPBY

·HAVING

·UNION或UNIONALL

·位于選擇列表中的子查詢

·Join

·FROM子句中的不可更新視圖

·WHERE子句中的子查詢,引用FROM子句中的表。

·僅引用文字值(在該情況下,沒有要更新的基本表)。

·ALGORITHM=TEMPTABLE(使用臨時表總會使視圖成為不可更新的)。創(chuàng)建存儲過程/函數存儲過程存儲過程(StoredProcedure)是在大型數據庫系統(tǒng)中,一組為了完成特定功能的SQL語句集,存儲在數據庫中,經過第一次編譯后再次調用不需要再次編譯,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執(zhí)行它。優(yōu)點:1.由于數據庫執(zhí)行動作時,是先編譯后執(zhí)行的。然而存儲過程是一個編譯過的代碼塊,所以執(zhí)行效率要比T-SQL語句高。

2.一個存儲過程在程序在網絡中交互時可以替代大堆的T-SQL語句,所以也能降低網絡的通信量,提高通信速率。

3.通過存儲過程能夠使沒有權限的用戶在控制之下間接地存取數據庫,從而確保數據的安全。4.1.1.創(chuàng)建語句CREATEPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[...n]調用存儲過程EXECUTEProcedure_name''--存儲過程如果有參數,后面加參數格式為:@參數名=value,也可直接為參數值value刪除存儲過程dropprocedureprocedure_name--在存儲過程中能調用另外一個存儲過程,而不能刪除另外一個存儲過程1.procedure_name

:存儲過程的名稱,在前面加#為局部臨時存儲過程,加##為全局臨時存儲過程。

2.number:可選的整數,用來對同名的過程分組,以便用一條DROPPROCEDURE語句即可將同組的過程一起除去。例如,名為orders的應用程序使用的過程可以命名為orderproc;1、orderproc;2等。DROPPROCEDUREorderproc語句將除去整個組。如果名稱中包含定界標識符,則數字不應包含在標識符中,只應在procedure_name前后使用適當的定界符。

3.@parameter:存儲過程的參數。可以有一個或多個。用戶必須在執(zhí)行過程時提供每個所聲明參數的值(除非定義了該參數的默認值)。存儲過程最多可以有2.100個參數。

使用@符號作為第一個字符來指定參數名稱。參數名稱必須符合標識符的規(guī)則。每個過程的參數僅用于該過程本身;相同的參數名稱可以用在其它過程中。默認情況下,參數只能代替常量,而不能用于代替表名、列名或其它數據庫對象的名稱。有關更多信息,請參見EXECUTE。

4.data_type:參數的數據類型。所有數據類型(包括text、ntext和image)均可以用作存儲過程的參數。不過,cursor數據類型只能用于OUTPUT參數。如果指定的數據類型為cursor,也必須同時指定VARYING和OUTPUT關鍵字。有關SQLServer提供的數據類型及其語法的更多信息,請參見數據類型。

說明對于可以是cursor數據類型的輸出參數,沒有最大數目的限制。

5.VARYING:

指定作為輸出參數支持的結果集(由存儲過程動態(tài)構造,內容可以變化)。僅適用于游標參數。

6.default:

參數的默認值。如果定義了默認值,不必指定該參數的值即可執(zhí)行過程。默認值必須是常量或NULL。如果過程將對該參數使用LIKE關鍵字,那么默認值中可以包含通配符(%、_、[]和[^])。7.OUTPUT

:表明參數是返回參數。該選項的值可以返回給EXEC[UTE]。使用OUTPUT參數可將信息返回給調用過程。Text、ntext和image參數可用作OUTPUT參數。使用OUTPUT關鍵字的輸出參數可以是游標占位符。

8.RECOMPILE:

表明SQLServer不會緩存該過程的計劃,該過程將在運行時重新編譯。在使用非典型值或臨時值而不希望覆蓋緩存在內存中的執(zhí)行計劃時,請使用RECOMPILE選項。9.ENCRYPTION:

表示SQLServer加密syscomments表中包含CREATEPROCEDURE語句文本的條目。使用ENCRYPTION可防止將過程作為SQLServer復制的一部分發(fā)布。說明在升級過程中,SQLServer利用存儲在syscomments中的加密注釋來重新創(chuàng)建加密過程。

10.FORREPLICATION

:指定不能在訂閱服務器上執(zhí)行為復制創(chuàng)建的存儲過程。.使用FORREPLICATION選項創(chuàng)建的存儲過程可用作存儲過程篩選,且只能在復制過程中執(zhí)行。本選項不能和WITHRECOMPILE選項一起使用。

11.AS

:指定過程要執(zhí)行的操作。12.sql_statement

:過程中要包含的任意數目和類型的Transact-SQL語句。但有一些限制。4.1.2.存儲過程例子只返回單一記錄集的存儲過程createProcedureGetUserAccountbeginselect*fromuseraccount;end調用:callGetUserAccount();帶有out參數的存儲過程

CREATEPROCEDUREdemo_out_parameter(OUTp_outint)BEGINSELECTp_out;SETp_out=2;SELECTp_out;END;調用:SET@p_out=1;CALLdemo_out_parameter(@p_out);帶有in參數的存儲過程

CREATEPROCEDUREdemo_inout_parameter(INOUTp_inoutint)BEGINSELECTp_inout;SETp_inout=2;SELECTp_inout;END;調用:SET@p_inout=1;CALLdemo_inout_parameter(@p_inout);定義變量以及游標使用的存儲過程

BEGIN/*定義變量*/declaretmp0VARCHAR(1000);declaretmp1VARCHAR(1000);declaredoneintdefault-1;--用于控制循環(huán)是否結束/*聲明游標*/declaremyCursorcursorforselectUserName,PassWordfromuseraccount;/*當游標到達尾部時,mysql自動設置done=1*/declarecontinuehandlerfornotfoundsetdone=1;/*打開游標*/openmyCursor;/*循環(huán)開始*/myLoop:LOOP/*移動游標并賦值*/fetchmyCursorintotmp0,tmp1;--游標到達尾部,退出循環(huán)ifdone=1thenleavemyLoop;endif;/*dosomething*/--循環(huán)輸出信息selecttmp0,tmp1;--可以加入insert,update等語句/*循環(huán)結束*/endloopmyLoop;/*關閉游標*/closemyCursor;END定義條件控制的存儲過程

CREATEPROCEDUREproc2(INparameterint)begindeclarevarint;setvar=parameter+1;ifvar=0theninsertintotvalues(17);endif;ifparameter=0thenupdatetsets1=s1+1;elseupdatetsets1=s1+2;endif;end;函數MySQL函數,是一種控制流程函數,屬于數據庫用語言。4.2.1.系統(tǒng)函數(列舉部分常用函數)流程控制函數a)IF函數用法語法:IF(expr1,expr2,expr3)函數用法說明:如果expr1是TRUE(expr1<>0andexpr1<>NULL),則IF()的返回值為expr2;否則返回值則為expr3。IF()的返回值為數字值或字符串值,具體情況視其所在語境而定b)IFNULL函數語法:IFNULL(expr1,expr2)函數用法說明:假如expr1不為NULL,則IFNULL()的返回值為expr1;否則其返回值為expr2。IFNULL()的返回值是數字或是字符串,具體情況取決于其所使用的語境字符串函數a)函數ascii(str)函數用法說明:返回值為字符串str的最左字符的數值。假如str為空字符串,則返回值為0。假如str為NULL,則返回值為NULL。ASCII()用于帶有從0到255的數值的字符b)函數BIN(N)函數用法說明:返回值為N的二進制值的字符串表示,其中N為一個longlong(BIGINT)數字。這等同于CONV(N,10,2)。假如N為NULL,則返回值為NULL。c)函數FORMAT(X,D)函數使用說明:將numberX設置為格式'#,###,###.##',以四舍五入的方式保留到小數點后D位,而返回結果為一個字符串。d)函數LEFT(str,len)函數使用說明:返回從字符串str開始的len最左字符e)函數LENGTH(str)函數使用說明:返回值為字符串str的長度,單位為字節(jié)。一個多字節(jié)字符算作多字節(jié)。這意味著對于一個包含5個2字節(jié)字符的字符串,LENGTH()的返回值為10,而CHAR_LENGTH()的返回值則為5。f)函數LOWER(str)函數使用說明:返回字符串str以及所有根據最新的字符集映射表變?yōu)樾懽帜傅淖址鹓)函數LPAD(str,len,padstr)函數使用說明:返回字符串str,其左邊由字符串padstr填補到len

字符長度。假如str的長度大于len,則返回值被縮短至len字符。有用到可以直接搜索/sugang_ximi/article/details/66647484.2.2.自定義函數創(chuàng)建一個時間轉換函數DELIMITER$$DROPFUNCTIONIFEXISTS`test`.`getdate`$$CREATEFUNCTION`test`.`getdate`(gdatedatetime)RETURNSvarchar(255)BEGINDECLARExVARCHAR(255)DEFAULT'';SETx=date_format(gdate,'%Y年%m月%d日%h時%i分%s秒');RETURNx;END$$DELIMITER;第一句是定義一個結束標識符,因為MySQL默認是以分號作為SQL語句的結束符的,而函數體內部要用到分號,所以會跟默認的SQL結束符發(fā)生沖突,所以需要先定義一個其他的符號作為SQL的結束符;第二句是如果這個函數已經存在了,就刪除掉,test是數據庫的名字,函數是跟數據庫相關聯的,getdate是函數的名字;第三句是創(chuàng)建一個函數,()里是參數的名字和類型,RETURNS定義這個函數返回值的類型;函數體必須放在BEGINEND之間;DECLARE是定義函數體的變量,這里定義一個變量x,默認是空,然后SET給x變量賦值;RETURN是返回值,這里把變量x返回,x的類型必須與第三句中定義的返回類型一致。運行:SELECTgetdate('2009-06-2300:00:00');分支結構DELIMITER$$DROPFUNCTIONIFEXIS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論