MySQL學習總結
前言
春節期間看了一本mysql書《MySQL數據庫應用從入門到精通》
覺得這本書相對簡單、基礎、實用、全面,我們大多數人喜歡搞一些高深的東西,而忽視一些簡單基礎的東西,在工作當中我們犯錯的地方往往是那些簡單基礎的地方,有的時候一些基礎的DDL、DML並不一定是信手拈來,有些概念和用法也並不一定掌握的很準確,還需要百度的幫助。
下面簡單的總結些容易犯錯或者是容易模糊的概念和用法分享給大家,抽時間整理了下 以便後續review,目前完成了兩篇《基礎篇》《操作應用篇》,還有一篇《數據庫管理篇》主要是安全、日誌、性能、維護的知識。後續整理完補發給大家,希望大家能從中受益一點點,也希望大家多分享,共同切磋、共同進步。
第1篇 MySQL數據庫基礎篇
1. 概念
1. 數據庫(DataBase,DB):是指長期保存在計算機的存儲設備上,按照一定規則組織起來,可以被各種用戶或應用共享的數據集合。
2. 數據庫管理系統(DataBase Management System,DBMS):是一種操作和管理數據庫的大型軟件,用於建立、使用和維護數據庫,對數據庫進行統一管理和控制,以保證數據庫的安全性和完整性。用戶通過數據庫管理系統訪問數據庫中的數據。當前比較流行和常用的數據庫管理系統有Oracle、MySQL、SQL Server和DB2等。
3. 數據庫系統(DataBase System,DBS):是指在計算機系統中引入數據庫後的系統,通常由計算機硬件、軟件、數據庫管理系統和數據管理員組成。
在通常情況下,經常會用數據庫來表示它們使用的數據庫軟件。這經常會引起混淆,確切地說,數據庫軟件應該爲數據庫管理系統,數據庫是通過數據庫管理系統創建和操作的容器。
2. 數據庫管理系統提供的功能
l 數據定義語義(Data Definition Language,DDL):數據庫管理系統提供了數據定義語言定義數據庫涉及各種對象,定義數據的完整性約束,保密限制等約束。
l 數據操作語言(Data Manipulation Language,DML):數據庫管理系統提供了數據操作語言實現對數據的操作。基本的數據操作有兩類:檢索(查詢)和更新(插入、刪除和更新)。
l 數據控制語言(Data Control Language,DCL):數據庫管理系統提供了數據控制語言實現對數據庫的控制,包含數據完整性控制、數據安全性控制和數據庫的恢復等。
l 什麼是 SQL:其發音爲字母S-Q-L或sequel [ˈsikwəl],是Structure QueryLanguage(結構化查詢語言)的縮寫,是目前廣泛使用的關係數據庫標準語言。
3. 安裝和配置
MySQL基於客戶端---服務器(C\S)的數據庫管理系統,即服務器軟件和客戶端軟件。
服務器軟件是負責所有數據訪問和處理的一個軟件,而關於數據添加、刪除等所有請求都來自於客戶端軟件。
ü 服務器端軟件爲MySQL數據庫管理系統,可以在本地計算機上或者具有訪問權限的遠程服務器上安裝該軟件。
ü 客戶端軟件爲可以操作MySQL服務器的軟件。
5.MySQL的版本
目前MySQL數據庫按照用戶羣分爲社區版(Community Server)和企業版(Enterprise)
從MySQL版本5開始,開始支持觸發器、師徒、存儲過程等數據庫對象。
常見軟件版本:
ü GA(General Availablity):官方推崇廣泛使用的版本。
ü RC(Release Candidate):候選版本的意思,該版本深思最接近正式版的版本。
ü Alpha和Bean都屬於測試中版本,其中Alpha是指內側版本,Bean是指公測版本。
注意:如果MySQL安裝在服務器上,一定要選擇“Add Firewall exception for this port”複選框,這樣就可以在同一網絡內的用戶可以訪問該端口;
如果MySQL安裝在服務器上,需要選擇“Enable root access from remove machines”複選框來設置可以讓遠程計算機通過用戶root來登陸MySQL。
6.MySQL目錄說明
l Bin文件夾:存放可執行文件。
l Include文件夾:存放頭文件。
l Lib文件夾:存放庫文件。
l Share文件夾:存放字符集、語言等信息。
各個.ini文件的含義如下:
l my.ini文件:MySQL軟件正在使用的配置文件。
l my-huge.ini文件:當MySQL軟件爲超大型數據庫時時用的配置文件。
l my-innodb-heavy-4G.ini:當MySQL軟件的存儲引擎爲InnoDB,而且內存不小於4GB時使用的配置文件。
l my-large.ini:當MySQL軟件爲大型數據庫時使用的配置文件。
l my-medium.ini:當MySQL軟件爲中型數據庫時使用的配置文件。
l my-small.ini:當MySQL軟件爲小型數據庫時使用的配置文件。
l my-template.ini:配置文件模板。
在DOS窗口查看window是系統已經啓動的服務命令:
net start
net start MySQL 啓動
net stop MySQL 停止
DOS窗口連接MySQL
mysql –h 127.0.0.1 –u root –p
執行上面命令時,如果出現 mysql 不是內部或外部命令,也不是可運行的程序或批處理文件。
說明在安裝時沒有勾選“Include Bin Directory in windows PATH”複選框。
可以在通過設置環境變量path來完成,變量值爲MySQL安裝的目錄到\bin目錄;
提示:如果是免安裝版的也可以設置成爲windows服務,自己查找下資料吧,也是很簡單。
My.ini中添加[WindowsMySQLServer]
Server=” C:\\mysql\\bin\\mysqld.exe”
運行中:C:\\mysql\\bin\\mysqld.exe–install
第2篇 MySQL數據庫操作和應用篇
1.數據庫和數據庫對象
數據庫是一種可以通過某種方式存儲數據庫對象的容器。
各個系統數據庫作用:
l information_schema:主要存儲了系統中的一些數據庫對象信息,例如用戶表信息、列信息、權限信息、字符集信息和分區信息等。
l performance_schema:主要存儲數據庫服務器性能參數。
l mysql:主要存儲了系統的用戶權限信息。
l test:該數據庫爲MySQL數據庫管理系統自動創建的測試數據庫,任何用戶都可以使用。
所謂數據庫對象是存儲、管理和使用數據的不同結構形式,主要包含表、視圖、存儲過程、函數、觸發器和事件等。
2.存儲引擎
在MySQL中查看數據庫的存儲引擎:
ü show engines; 或者 showengines \G 或者 show engines \g
ü show variables like ‘have%’; 查看所支持的存儲引擎。
ü show variables like ‘storage_engine%’; 查詢默認存儲引擎。
注:在具體執行SQL語句中,可以用“;”、“\g”和“\G”符號表示語句結束。
以“;”、“\g”結束符作用一樣,而“\G”符號除了表示語句結束外,還可以使得結果顯示更美觀,相當於格式化的作用。
MySQL 5.5支持9種存儲引擎,分別爲FEDERATED、MRG_MYISAM、MyISAM、BLACKHOLE、CSV、MEMORY、ARCHIVE、InnoDB和PERFORMANCE_SCHEMA。
主要介紹MyISAM、InnoDb和MEMORY三種存儲引擎特性的對比:
l MyISAM:不支持事物、也不支持外鍵,所以訪問速度比較快。因此對事物完整性沒有要求並以訪問爲主的應用適合使用該存儲引擎。
l InnoDB:支持具有提交、回滾和崩潰恢復能力的事物,所以比MyISAM存儲引擎佔用更多的磁盤空間。因此當需要進行頻繁的更新、刪除操作,同時還對事物的完整性要求比較高,需要實現併發控制,此時適合使用該存儲引擎。
l MEMORY:使用內存來存儲數據,因此訪問速度快,但沒有安全保障。如果應用中涉及數據比較小,需要進行快速的訪問,則適合使用該存儲引擎。
3.數據類型
浮點數類型
l FLOAT(4字節)
l DOUBLE(8字節)
當存儲小數數據,兩者皆可,但需要精確到小數點後10位以上,就需要選擇DOUBLE類型。
定點數類型
l DEC(M,D)
l DECIMAL(M,D)
字節M+2 最大和最小值取值範圍與DOUBLE一樣。但是有效取值範圍由M和D來決定。
如果存儲小數數據,除了可以選擇FLOAT和DOUBLE類型外,還可選擇DEC和DECIMAL類型,當要求小數數據精確度非常高時,則可選擇DEC和DECIMAL類型,它們的精度比DOUBLE類型還要高。
位類型
l BIT(M)字節是M,M的取值範圍爲1---8,該類型的存儲空間是根據精度決定的。
日期和時間類型
l 表示年月日,一般使用DATE類型。(4字節)
l 表示年月日時分秒,DATETIME類型。(8字節)
l 需要經常插入或者更新日期爲當前系統時間,TIMESTAMP類型。(4字節)
l 時分秒,TIME類型。(3字節)
l 年份,YEAR類型。因爲該類型比DATE類型佔用更少的空間。(1字節)
注:要根據實際應用來選擇滿足需求的最小存儲的日期類型。
ü 如果只需要存儲“年份”,則可以選擇存儲字節爲1的YEAR類型。
ü 如果要存儲年月日時分秒,並且年份的取值可能比較久遠,最好使用DATETIME類型而不是TIMESTAMP類型,因爲前者比後者所表示的日期範圍要長一些。
ü 如果存儲的日期需要讓不同時區的用戶使用,則可以使用TIMESTAMP類型,因爲只有該類型日期能夠跟實際時區相對應。
字符串類型
l CHAR(M)
l VARCHAR(M)
VARCHAR類型的長度是可變得,範圍0---65535。
如果需要存儲少量字符串,則可以選擇CHAR和VARCHAR類型,至於選擇哪個?需要判斷所存儲字符串長度是否經常變換,如果經常變化則可以選擇VARCHAR類型,否則選擇CHAR類型。
4.表的操作
表是一種很重要的數據庫對象,是組成數據庫的基本元素,由若干個字段組成,主要用來實現存儲數據記錄。
表中的數據庫對象包含
l 列(Column) 也叫屬性列,創建表時,必須指定列的名字和數據類型。
l 索引(Index) 指根據指定的數據庫表列建立起來的順序,提供快速訪問數據的途徑且可監督表的數據,使其索引所指向的列中的數據不重複。
l 觸發器(Triger)是指用戶定義的事物命令的集合。
查看錶結構語句
l DESCRIBLE/DESC table_name; 查看錶定義
l show create table table_name \G 查看錶詳細定義
增加字段
1. 在表的最後一個位置增加字段
alter table table_name add 屬性名 屬性類型;
2. 在表的第一個位置增加字段
Alter table table_name add 屬性名 屬性類型 first;
3. 在表指定字段之後增加字段
Alter table table_name add 屬性名 屬性類型 after 屬性名;
刪除字段
4. Alter table table_name drop 屬性名;
修改字段
5. Alter table table_name modify 屬性名數據類型;
6. 修改字段的名字:alter table table_name change 舊屬性名 新屬性名 舊數據類型;
7. 同時修改字段的名字和屬性:alter table table_name change 舊屬性名 新屬性名 新數據類型;
8. 修改字段的順序:alter table table_name modify 屬性名1 數據類型 first|after 屬性名2;
5.索引操作
根據索引的存儲類型,分爲B型樹索引(BTREE)和哈希索引(HASH)。
注:InnoDB和MyISAM存儲引擎支持BTREE類型索引,MEMORY存儲引擎支持HASH類型索引,默認爲前者索引。
查看幫助文檔,MySQL支持6種索引,普通索引、唯一索引、全文索引、單列索引、多列索引和空間索引。
一般下面情況適合創建索引:
l 經常被查詢的字段,即在where子句中出現的字段。
l 在分組的字段,即在groupby子句中出現的字段。
l 存在依賴關係的子表和父表之間的聯合查詢,即主鍵或外鍵字段。
l 設置唯一完整性約束的字段。
一般下面情況不適合創建索引:
l 在查詢中很少被使用的字段。
l 擁有許多重複值的字段。
創建索引
1. 創建表時創建普通索引:
Create table table_name(
屬性名 數據類型,
…………
普通索引:Index|key[索引名] (屬性名1 (長度) ASC|DESC)
唯一索引:uniqueindex|key [索引名] (屬性名1 (長度) ASC|DESC)
全文索引:fulltext index|key [索引名] (屬性名1 (長度) ASC|DESC) ; engine=MyISAM
);
注:只能在存儲引擎MyISAM的數據庫表上創建全文索引,在默認情況下,全文索引的搜索執行方式爲不區分大小寫,如果全文索引所關聯的字段爲二進制數據類型,則以區分大小寫的搜索方式執行。
2. 在已存在的表上創建普通索引:
Create index 索引名 on 表名屬性名 (長度) ASC|DESC
3. 通過SQL語句ALTER TABLE創建普通索引:
Alter table table_name add index|key 索引名 屬性名(長度) ASC|DESC
注:在創建索引時,可以指定索引的長度。這是因爲不同存儲引擎定義了表的最大索引數和最大索引長度。MySQL所支持的存儲引擎對每個表至少支持16個索引,總索引長度至少爲256字節。
查看索引
l 查看錶中的索引是否創建成功:Show create table table_name \G;
l 查看錶中索引是否被啓用:explainselect * from table_name where 屬性名=1;
6.視圖操作
視圖:本質上是一種虛擬表,其內容與真實表相似,包含一系列帶有名稱的列和行數據。但是,視圖並不是在數據庫中以存儲的數據值形式存在。行和列數據來自定義視圖的查詢所引用基本表,並且在具體引用視圖時動態生成。
視圖的特點:
l 視圖的列可以來自不同的表,是表的抽象和在邏輯意義上建立的新關係。
l 視圖是由基本表(實表)產生的表(虛表)。
l 視圖的建立和刪除不影響基本表。
l 對視圖內容的更新(添加、刪除和修改)直接影響基本表。
l 當視圖來自多個基本表時,不允許添加和刪除數據。
注:MySQL數據庫管理系統從5.0.1版本開始提供視圖新特性。
創建視圖
Create viewview_name as 查詢語句;
查看視圖
l 進入數據庫view,查看該數據庫裏所有表名和視圖名。
Use view ;
Show tables;
l 查看視圖詳細信息
Show table status [from db_name] [like ‘pattern’]
Show table status from view \G 返回表示表和視圖各種信息的各種字段。
Show table status FROM view LIKE “view_name” \G 查看指定視圖的詳細信息。
l 查看視圖定義信息
Show create view view_name
l 查看視圖設計信息
DESCRIBE | DESC view_name
l 通過系統表查看視圖信息
系統數據庫information_schema 中存在一個包含視圖信息的表格views,可以通過查看錶格views來查看所有視圖的相關信息。
Use information_schema;
Select * from views where table_name=’view_name’ \G
修改視圖
l Use view ;
Create or replace view view_name as 查詢語句; 此法先刪除原視圖在重新創建
l Alter 語句修改視圖
Alter view view_name as 查詢語句
7.觸發器操作
l 創建有一條執行語句的觸發器
Create triggertrigger_name
BEFORE|AFTER trigger_EVENT
ON TABLE_NAME FOR EACHROW trigger_STMT
Trigger_EVENT 包括 insert、update、delete;
l 創建包含多條執行語句的觸發器
Create trigger trigger_name
BEFORE|AFTER trigger_EVENT
ON TABLE_NAME FOR EACH ROW
BEGIN
Trigger_STMT
END
在關鍵字BEGIN和END之間爲所要執行的多個執行語句的內容,語句之間用分號隔開。
注:在MySQL軟件中,一般情況下用“;”符號作爲語句的結束符號,可是在創建觸發器的時候,需要用到“;”符號作爲執行語句的結束符號。爲了解決該問題,可以使用關鍵字DELIMITER語句,例如“DELIMITER$$”,可以用來實現將結束符合設置成“$$”。
DELIMITER $$
CREATE TRIGGER tri_diarytime2
AFTER INSERT
ON t_dept FOR EACH ROW
BEGIN
INSER INTO t_diaryVALUES(null, ‘t_dept’,now());
INSERINTO t_diary VALUES(null, ‘t_dept’,now());
END
$$
DELIMITER ;
上述語句中首先通過“DELIMITER $$”語句設置結束符號爲“$$”,然後在關鍵字BEGIN和END之間編寫了執行語句列表,最後通過“DELIMITER;”語句將結束符號還原成默認結束符號“;”。
查看觸發器
l 通過 SHOWTRIGGERS語句查看觸發器
Show triggers \G
l 通過查看系統表triggers實現查看觸發器
於系統數據庫information_schema中存在一個存儲所有觸發器信息的系統表triggers。
USE information_schema;
Select * from triggers \G 查詢系統表triggers中的所有記錄
SELECT * FORM triggers WHERE TRIGGER_NAME=’tri_diarytime2’ \G 查詢具體觸發器對象。
9. 表查詢數據記錄
注:在具體使用關鍵字IN時,查詢的集合中如果存在NULL,則不會影響查詢;如果使用關鍵字NOT IN,查詢的集合中如果存在NULL,則不會有任何的查詢結果。
SELECT ename FROM t_employee WHERE empno IN (1,2,3,4,NULL); 查詢有結果集
SELECT ename FROM t_employee WHERE empno NOT IN (1,2,3,4,NULL);沒有查詢結果集。
LIKE 關鍵字支持的通配符如下:
l “_”通配符,該通配符值能匹配但個字符。
l “%”通配符,該通配符值可以匹配任意長度的字符串,即可以是0個字符,1個字符,也可以很多個字符。
LIKEA% 和 LIKE a% 查詢結果是一樣的,MySQL軟件不僅對於關鍵字不區分大小寫,對於字段數據記錄也不區分大小寫。
對於LIKE關鍵字,如果匹配“%%”則表示查詢所有數據記錄。
排序數據記錄查詢
MySQL軟件中關鍵字ORDER BY 默認的排序順序爲升序。
注:在MySQL軟件中,如果字段的值爲空值(NULL),則該值爲最小值,因此在降序排序中將最後顯示(即最後一行);在升序排序中則將最先顯示(即第一行)。
多字段排序
具體運行過程中,首先按照第一個字段進行排序,如果遇到值相同的字段則會按照第二個字段進行排序,依次進行類推。
限制數據記錄查詢數量
SELECT field1 field2 fieldn FROM table_name WHERE CONDITION LIMIT OFFSET_START, ROW_COUNT
關鍵字LIMIT來限制數據查詢結果數量,其中參數OFFSET_START表示數據記錄的起始偏移量,參數ROW_COUNT表示顯示的行數。
對於MySQL軟件提供的關鍵字LIMIT,如果不指定初始位置,默認值爲0,表示從第一條記錄開始顯示。
統計函數和分組數據記錄查詢
l COUNT(*)使用方式:對錶中記錄統計,不管表字段中包含的是NULL值還是非NULL值。
l COUNT(field)使用方式:指定字段的記錄進行統計,統計時忽略NULL值,但不忽略值爲0的數據記錄。
l AVG(field)使用方式:平均值計算,忽略NULL值,但是沒有忽略0數據記錄。
l SUM(field)使用方式:計算指定字段值之和,忽略NULL值,不忽略值爲0的記錄。
l MAX(field)、MIN(field):忽略NULL值,不忽略值爲0的記錄。
注:MySQL中統計函數,如果所操作的表中沒有任何數據記錄,則COUNT()函數會返回數據0,而AVG()、SUM()、MAX()、MIN()函數則會返回NULL。
在具體進行分組查詢時,分組所依據的字段上的值一定要具有重複值,否則將沒有任何實際意義。
分組數據查詢----實現統計功能分組查詢
MySQL軟件如果只實現簡單的分組查詢,是沒有任何實際意義的。因爲關鍵字GROUP BY單獨使用時,默認查詢出每個分組中隨機一條記錄,具有很大的不確定性。。分組關鍵字建議與統計函數一起使用。
想顯示分組中的字段,可以通過函數GROUP_CONCAT()來實現。
SELECT GROUP_CONCAT(field)
FROM table_name
WHERE CONDITION
GROUP BY field
分組數據查詢------實現HAVING字句限定分組查詢
SELECT function(field)
FROM table_name
WHERE CONDITION
GROUP BY field1,field2,……..fieldn
HAVING CONDITION; ----- (AVG(sal)>2000)
多表數據記錄查詢
l UNION :查詢結果集直接合並,並去掉重複數據記錄。
l UNION ALL :查詢結果集直接合並,沒有去掉重複數據記錄。
爲什麼使用子查詢
例如:SELECT * FROM t_dept t, t_emp e WHERE t.deptno = e.deptno ;
首先會對兩個表進行笛卡兒積操作,然後在選取符合匹配條件的數據記錄。進行笛卡兒積操作時,會生成連個數據表數據記錄數的乘積條數據記錄,如果這兩張表的數據記錄比較大,則在進行笛卡兒積操作時會造成死機。
對於有經驗的用戶,首先會通過統計函數查看所操作表笛卡兒積後的數據記錄數,然後纔會進行多表查詢。
因此多表查詢一般會經過如下步驟:
ü 通過統計函數(COUNT())查詢所關聯表笛卡兒積後的數據記錄數,具體SQL語句如下:
SELECT COUNT(*) FROM t_dept , t_emp ;
ü 如果查詢到的數據記錄數MySQL軟件可以接受,然後才進行多表連接查詢,否則就應該考慮通過其他方式來實現。
爲了解決查詢到笛卡兒積後的數據記錄數遠遠大於MySQL軟件可接受的範圍,MySQL提供了子查詢來實現多表查詢。
所謂子查詢,就是在一個查詢中嵌套了其他的若干查詢,即在一個SELECT查詢語句的WHERE或FROM子句中包含另一個SELECT查詢語句。理論上子查詢可以出現在查詢語句的任意位置,但實際開發中,子查詢經常出現在WHERE和FROM子句中。
l WHERE子句中的子查詢:該位置處的子查詢一般返回單行單列、多行單列、單行多列數據記錄。
l FROM子句中的子查詢:該位置處的子查詢一般返回多行多列數據記錄,可以當做一張臨時表。
注:此處關於笛卡兒積、多表操作等不多介紹了,自己找找相關資料吧。
10. MySQL運算符
l 算術運算符;
加(+)、減(-)、乘(*)、除(/ (DIV))、除(% (MOD));
注:所有的算術運算符都可以同時運算多個操作數,但是除運算符(/和DIV)和求模運算符(%和MOD)的操作數最好是兩個。在MySQL中對於除和模操作,如果除數爲0將是非法運算,返回結果爲NULL。·
l 比較運算符;
1. 等於:=(< = >):判斷數值、字符串和表達式等是否相等。如果相等則返回1;否則返回0。依據字符的ASCII碼來進行判斷。= 不能操作NULL值,< = > 可以操作NULL。 SELECT NULL < = > NULL , NULL = NULL ; 結果返回 1 、NULL。
2. 不等於:!=(<>):判斷不相等,如果不相等則返回1,否則返回0。這兩個比較運算符不能操作NULL(空值)。
3. “>”、“>=”、“<”、“<=”比較運算符主要判斷數值、字符串和表達式等的相關比較,如果表達式成立則返回1,否則將返回0。不能操作NULL。
4. 實現特殊功能比較運算符:MySQL支持的模式字符
^ :匹配字符串的開始部分。
$ :匹配字符串的結束部分。
. :匹配字符串中的任意一個字符。
* :匹配字符,包含0個和1個。
+ :匹配字符,包含1個。
[字符集合] :匹配字符集合中的任意一個字符。
[^字符集合] :匹配字符集合外的任意一個字符。
字符串{N} :字符串出現N次。
字符串{M,N}:字符串出現至少M次,最多N次。
l 邏輯運算符;
AND(&&):與;
OR(||):或;
NOT(!):非;
XOR:亦或;
l 位運算符;
&:按位與;
|:按位或;
~:按位取反;
^:按位亦或;
<<:按位左移;
>>:按位右移;
11. MySQL常用函數
l 字符串函數:處理字符串;
l 數值函數:處理數字;
l 日期函數:處理日期和時間;
EXTRACT();獲取指定值的函數:EXTRACT(type FROM date)
SELECT NOW() 當前日期和時間,
EXTRACT(YEAR FROM NOW()) 年,
EXTRACT(MONTH FROM NOW()) 月,
EXTRACT(DAY FROM NOW()) 日,
EXTRACT(HOUR FORM NOW())小時 ,
EXTRACT(MINUTE FROM NOW()) 分,
EXTRACT(SECOND FROM NOW())秒 ;
l 系統信息函數:獲取MySQL軟件的系統信息;
SELECT VERSION() 版本號, DATABASE() 數據庫名, USER () 用戶名;
注:此章節函數很多,就不一一列舉說明了,也不難自己遇到了查下資料就好了。
12. 存儲過程和函數的操作
存儲過程和函數可以簡單的理解爲一條或多條SQL語句的集合,查看幫助文檔可以發現,存儲過程和函數就是事件經過編譯並存儲在數據庫中的一段SQL語句集合。
存儲過程和函數的執行不是由程序調用,也不是由手工啓動,而是由事件來觸發、激活從而實現執行。而存儲過程和函數的執行,則需要手工調用存儲過程和函數的名字並需要制定相應的參數。
存儲過程和函數的區別:函數必須有返回值,而存儲過程則沒有。存儲過程的參數類型遠遠多於函數參數類型。
存儲過程和函數優點:
l 允許標準組件式編程,提高了SQL語句的重用性、共享性和可移植性。
l 能夠實現較快的執行速度,能夠減少網絡流量。
l 可以被作爲一種安全機制來利用。
缺陷:
l 編寫比單句SQL語句複雜,需要用戶具有更高的技能和更豐富的經驗。
l 需要創建這些數據庫對象的權限。
創建存儲過程和函數
l 存儲過程:CREATE PROCEDURE procedure_name ([procedure_paramter[,…..]])
[characteristic…] routine_body
l 函數:CREATE FUNCTION function_name ([function_paramter[,…..]])
[characteristic…] routine_body
Characteristic 存儲過程或函數的特性,routine_body參數表示存儲過程或函數的SQL語句代碼,可以用BEGIN…END來標誌SQL語句的開始和結束。
創建存儲過程示例:
DELIMITER $$
CREATE PROCEDURE proce_employee_sal()
COMMENT ‘查詢所有僱員的工資’
BEGIN
SELECT sal
FROM t_employee;
END $$
DELIMITER ;
創建函數示例:
DELIMITER $$
CREATE FUNCTION func_employee_sal(empnoINT(11))
RETURNS DOUBLE(10,2)
COMMENT ‘查詢所有僱員的工資’
BEGIN
RETURN (SELECT sal
FROM t_employee
WHEREt_employee.empno=empno);
END $$
DELIMITER ;
注:關於存儲過程和函數的表達式在這裏就不介紹了。
使用光標(遊標)
MySQL軟件的查詢語句可以返回多條記錄結果,那麼在表達式中如何遍歷這些記錄結果呢?MySQL軟件提供了光標(遊標)來實現。
l 聲明光標
DECLARE cursor_nameCURSOR FOR select_statement ;
l 打開光標
OPEN cursor_name
l 使用光標
FETCH cursor_name INTO var_name [,var_name] …
l 關閉光標
CLOSE cursor_name
示例:
1. 聲明:DECLARE cursor_employee CURSOR FOR SELECT sal FROM t_employee;
2. 打開:OPEN cursor_employee ;
3. 執行:FETCH cursor_employee INTO employee_sal ;
4. 關閉:CLOSE cursor_employee ;
查詢存儲過程和函數(三種方式)
l 存儲過程狀態信息:SHOW PROCEDURE STATUS [ LIKE ‘proce_employee_sal] \G
函數狀態信息:SHOW FUNCTION STATUS [ LIKE ‘proce_employee_sal] \G
l 查看系統表information_schema.routines 詳細信息
USE information_schema ;
SELECT * FROM routines \G
SELECT * FROM ROUTINES WHERE SPECIFIC_NAME = ‘proce_employee_sal ’ \G
l SHOW CREATE PROCEDURE 查看定義信息
存儲過程:SHOW CREATE PROCEDURE proce_name \G
函數:SHOW CREATE FUNCTION func_name \G
修改
ALTER關鍵字
刪除
DROP關鍵字
來自自己的qq空間,轉到CSDN