有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB類型,有相同的最大長度和存儲需求。
mysql命令:
數據庫操做:
一、顯示全部數據庫:Show databases;
二、建立數據庫:Create database 數據庫名;
三、刪除數據庫:Drop database 數據庫名;
表操做:
CREATE TABLE 表名( 屬性名 數據類型 [完整性約束條件],
屬性名 數據類型 [完整性約束條件],
.
.
屬性名 數據表格 [完整性約束條件]
);
約束條件
|
說明
|
PRIMARY KEY
|
標識該屬性爲該表的主鍵,能夠惟一的標識對應的記錄
|
FOREIGN KEY
|
標識該屬性爲該表的外鍵,與某表的主鍵關聯
|
NOT NULL
|
標識該屬性不能爲空
|
UNIQUE
|
標識該屬性的值是惟一的
|
AUTO_INCREMENT
|
標識該屬性的值自動增長
|
DEFAULT
|
|
注: UNIQUE 和 PRIMARY KEY 約束均爲列或列集合提供了惟一性的保證。簡單來講:unique=primary key+not null
區別:一、primary key只能有一個,unique能夠有多個同時存在;
二、primary key不能爲空,而unique能夠爲空;
primary key通常在設計邏輯中用做記錄標識,而unique只是用來保證惟一性
UNIQUE (bookId)//新建表時將bookId設爲惟一
//添加惟一約束
ALTER TABLE Persons
ADD UNIQUE (Id_P)
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)//設置Id_P和LastName都爲惟一併命名爲uc_PersonID
//刪除惟一約束
ALTER TABLE Persons
DROP INDEX uc_PersonID
建表時建立外鍵
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)//設置本表Id_p字段和Persons表的Id_p主鍵關聯
查看錶結構:
1,查看基本表結構: DESCRIBE(或DESC) 表名;//返回表字段及其詳細信息表格
2,查看錶詳細結構: SHOW CREATE TABLE 表名;//返回結果是建立表的sql
刪除/清空 表:
一、 drop table 表名; //完全刪除表格,刪除字段數據,釋放內存空間
二、 truncate 表名; //刪除表格數據,不刪除字段,釋放內存空間
三、 delete from 表名;或delete * from 表名;// 刪除內容不刪除定義,不釋放空間,系統一行一行地刪,效率較truncate低
truncate和delete對比:
一、truncate 將從新設置高水平線和全部的索引。在對整個表和索引進行徹底瀏覽時,通過 truncate 操做後的表比Delete操做後的表要快得多。 當表被清空後表和表的索引將從新設置成初始大小,而delete則不能。
二、truncate 是隱式提交,不能觸發任何Delete觸發器,不能經過rollback命令撤回,而delete能夠,由於delete 語句每次刪除一行,都在事務日誌中爲所刪除的每行記錄一項 ;
三、truncate table 在功能上與不帶 WHERE 子句的 delete語句相同:兩者均刪除表中的所有行。但 truncate 比 delete速度快,且使用的系統和事務日誌資源少,由於delete是一行一行的刪除。
注意:truncate不能清空父表
修改表:
1,修改表名 ALTER TABLE 舊錶名 RENMAE 新表名 ;
2,修改字段 ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新數據類型
3,增長字段 ALTER TABLE 表名 ADD 屬性名 數據類型 [完整性約束條件] [FIRST | AFTER 屬性名 2]
4,刪除字段 ALTER TABLE 表名 DROP 屬性名
插入數據
格式:INSERT INTO 表名 VALUES(值 1,值 2,值 3,...,值 n);
格式:INSERT INTO 表名(屬性 1,屬性 2,...,屬性 n) VALUES(值 1,值 2,值 3,...,值 n);
INSERT INTO 表名 [(屬性列表)] VALUES(取值列表 1),(取值列表 2) ..., (取值列表 n);
更新數據
UPDATE 表名 SET 屬性名 1=取值 1,屬性名 2=取值 2, ..., 屬性名 n=取值 n WHERE 條件表達式;
刪除數據
DELETE FROM 表名 [WHERE 條件表達式]
查詢表
單表查詢:
條件查詢 WHERE:
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] IN (元素 1,元素 2,元素 3);//查找屬性(不爲)爲元素一、元素2和元素3的結果
SELECT 字段 1,字段 2...FROM 表名 WHERE 條件表達式 1 AND 條件表達式 2 [...AND 條件表達式 n] //and多條件查詢
SELECT 字段 1,字段 2...FROM 表名 WHERE 條件表達式 1 OR 條件表達式 2 [...OR 條件表達式 n] //or多條件查詢
範圍查詢 BETWEEN AND:
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] BETWEEN 取值 1 > 指定值;//大於小於等符號
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] BETWEEN 取值 1 AND 取值 2;//兩端都包含
模糊查詢 LIKE:
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] LIKE ‘字符串’;
「%」表明任意字符;
「_」 表明單個字符;
空值查詢 NOT NULL:
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 IS [NOT] NULL;
去重複查詢 DISTINCT :
SELECT DISTINCT 字段名 FROM 表名;
排序 ORDER BY
SELECT 字段 1,字段 2...FROM 表名 ORDER BY 屬性名 [ASC|DESC] //ASC升序(默認) DESC降序
分組查詢 GROUP BY
GROUP BY 屬性名 [HAVING 條件表達式][WITH ROLLUP]
1,單獨使用(毫無心義);
2,與 GROUP_CONCAT()函數一塊兒使用;
3,與聚合函數一塊兒使用;
4,與 HAVING 一塊兒使用(限制輸出的結果);
5,與 WITH ROLLUP 一塊兒使用(最後加入一個總和行);
GROUP_CONCAT()函數示例:
語句 SELECT locus,GROUP_CONCAT(id) FROM info WHERE locus IN('AB086827','AF040764') GROUP BY locus; 的返回結果爲
+----------+------------------+
| locus | GROUP_CONCAT(id) |
+----------+------------------+
| AB086827 | 1,2 |
| AF040764 | 23,24 |
+----------+------------------+
即將查詢到的括號內字段的結果合併到一塊兒並用逗號隔開
能夠將逗號更換成其餘符號,如:
語句 SELECT locus,GROUP_CONCAT(distinct id ORDER BY id DESC SEPARATOR '_') FROM info WHERE locus IN('AB086827','AF040764') GROUP BY locus;的返回結果爲
+----------+----------------------------------------------------------+
| locus | GROUP_CONCAT(distinct id ORDER BY id DESC SEPARATOR '_') |
+----------+----------------------------------------------------------+
| AB086827 | 2_1 |
| AF040764 | 24_23 |
+----------+----------------------------------------------------------+
同時有CONCAT函數將查詢結果連成一個字符串,可是查詢的字段中有null時則整個結果爲null,如:
SELECT CONCAT(id, ‘,’, name,age) AS con FROM info LIMIT 1;返回結果爲
+----------+
| con |
+----------+
| 1,BioCyc23 |
+----------+
WITH ROLLUP會在返回結果的最後加上一行將查詢出的若是是數字結果則將全部結果數字相加,若是是字符結果則將全部字符合並
SELECT gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName WITH ROLLUP;
分頁查詢 limit:
SELECT 字段 1,字段 2...FROM 表名 LIMIT 初始位置,記錄數;
聚合函數查詢:
一,COUNT()函數
COUNT()函數用來統計記錄的條數; 與 GOUPE BY 關鍵字一塊兒使用;
二,SUN()函數
SUM()函數是求和函數; 與 GOUPE BY 關鍵字一塊兒使用;如:SELECT stuName,SUM(score) FROM t_grade GROUP BY stuName;//根據學生姓名分組算出每一個學生的分數總和
注意:當用group by 分組查詢時只能查出分組的字段和聚合函數的結果,其餘字段沒法查出
三,AVG()函數
AVG()函數是求平均值的函數; 與 GOUPE BY 關鍵字一塊兒使用;//SELECT stuName,AVG(score) FROM t_grade WHERE stuName="張三";//算出張三的平均分
四,MAX()函數
MAX()函數是求最大值的函數; 與 GOUPE BY 關鍵字一塊兒使用;
MIN()函數
MIN()函數是求最小值的函數; 與 GOUPE BY 關鍵字一塊兒使用;
多表查詢
鏈接查詢:
鏈接查詢是將兩個或兩個以上的表按照某個條件鏈接起來,從中選取須要的數據;
t_book表: t_bookType表:
如:SELECT * from t_book,t_booktype; 返回結果將兩個表的全部組合結果返回
一、內鏈接查詢:
內鏈接查詢是一種最經常使用的鏈接查詢。內鏈接查詢能夠查詢兩個或者兩個以上的表;
SELECT * from t_book b,t_booktype t where t.id=b.id;
或SELECT * from t_book,t_booktype where t_book.id=t_booktype.id;
查詢結果:
也可這麼寫來查詢須要的字段:SELECT bookName,author,bookTypeName from t_book,t_booktype where t_book.id=t_booktype.id;
注意:若是查詢的字段(如id)中兩個表都有時這種寫法會出錯,由於沒法得知id是哪一個表的字段,因此平時多表查詢時要寫別名
修改成:SELECT tb.bookName,tb.author,tby.id from t_book tb ,t_booktype tby where tb.id=tby.id;
二、外鏈接查詢
外鏈接能夠查出某一張表的全部信息;
SELECT 屬性名列表 FROM 表名 1 LEFT|RIGHT JOIN 表名 2 ON 表名 1.屬性名 1=表名 2.屬性名 2;
能夠查詢出「表名 1」的全部記錄,而「表名 2」中,只能查詢出匹配的記錄;如:
select * from t_book tb left JOIN t_booktype tby on tb.bookTypeId=tby.id; 查詢結果:
能夠查詢出「表名 2」的全部記錄,而「表名 1」中,只能查詢出匹配的記錄;如:
select * from t_book tb right JOIN t_booktype tby on tb.bookTypeId=tby.id; 查詢結果:
即where後面有多個條件and鏈接查詢
子查詢
1 、帶 In 關鍵字的子查詢
一個查詢語句的條件可能落在另外一個 SELECT 語句的查詢結果中。
2 、帶比較運算符的子查詢
子查詢可使用比較運算符。
3 、帶 (not)Exists 關鍵字的子查詢
假如子查詢查詢到記錄,則進行外層查詢,不然,不執行外層查詢;not exists表示內層沒有內容時才查詢外層
如:SELECT * from t_book where EXISTS(select * from t_booktype);//表示t_booktype中返回的有內容時才執行外層t_book的查詢
4 、帶 Any 關鍵字的子查詢
ANY 關鍵字表示知足其中任一條件;如:SELECT * FROM t_book WHERE price>= ANY (SELECT price FROM t_pricelevel);//表示篩選價格大於任意t_pricelevel表中選出的價格的結果,即比最小的大的價格就知足條件
5 、帶 All 關鍵字的子查詢
ALL 關鍵字表示知足全部條件;如:SELECT * FROM t_book WHERE price>= ALL (SELECT price FROM t_pricelevel);//表示篩選價格大於全部t_pricelevel表中選出的價格的結果,即比最大的價格大的才知足條件
合併查詢
使用 UNION 關鍵字是,數據庫系統會將全部的查詢結果合併到一塊兒,而後去除掉相同的記錄;
使用 UNION ALL,不會去除掉系統的記錄;
索引
索引定義
索引是由數據庫表中一列或者多列組合而成,其做用是提升對錶中數據的查詢速度,創建索引查詢速度有數量級提高 ;
相似於圖書的目錄,方便快速定位,尋找指定的內容;
索引的優缺點
優勢:提升查詢數據的速度;
缺點:建立和維護索引的時間增長了;
索引分類
1,普通索引
這類索引能夠建立在任何數據類型中;
2,惟一性索引
使用 UNIQUE 參數能夠設置,在建立惟一性索引時,限制該索引的值必須是惟一的;
3,全文索引
使用 FULLTEXT 參數能夠設置,全文索引只能建立在 CHAR,VARCHAR,TEXT 類型的字段上。主要做用
就是提升查詢較大字符串類型的速度;只有 MyISAM 引擎支持該索引,Mysql 默認引擎不支持;
4,單列索引
在表中能夠給單個字段建立索引,單列索引能夠是普通索引,也能夠是惟一性索引,還能夠是全文索引;
5,多列索引
多列索引是在表的多個字段上建立一個索引;
6,空間索引
使用 SPATIAL 參數能夠設置空間索引。空間索引只能創建在空間數據類型上,這樣能夠提升系統獲取空間數
據的效率;只有 MyISAM 引擎支持該索引,Mysql 默認引擎不支持;
建立索引
CREATE TABLE 表名 (屬性名 數據類型 [完整性約束條件],
屬性名 數據類型 [完整性約束條件],
....
屬性名 數據類型
[UNIQUE | FULLTEXT | SPATIAL ] INDEX| KEY
[別名] (屬性名 1 [(長度)] [ASC | DESC])
);
1,建立普通索引
CREATE TABLE mytable(
id INT PRIMARY KEY AUTO_INCREMENT,
bookId INT,
bookName VARCHAR(20) NOT NULL,
price DECIMAL(6,2),
INDEX(bookId) //建立普通索引
//UNIQUE INDEX (bookId) //建立惟一性索引
//UNIQUE INDEX bokId(bookId) //建立惟一性索引並起別名爲bokId
//UNIQUE INDEX bokId(bookId,id) //建立多列索引並起別名爲bokId
);
2,建立惟一性索引
3,建立全文索引(mysql默認搜索引擎不支持)
4,建立單列索引
5,建立多列索引
6,建立空間索引(不支持)
CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (屬性名 [(長度)] [ ASC | DESC]);
如:CREATE INDEX bookId ON mytable(bookId); //建立普通索引
CREATE UNIQUE INDEX bookId ON mytable(bookId); //建立惟一索引
CREATE UNIQUE INDEX bookId_price ON mytable(bookId,price); //建立多列索引
ALTER TABLE 表名 ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (屬性名 [(長度)] [ ASC | DESC]);
如:ALTER TABLE mytable ADD INDEX index_bookId(bookId); //建立普通索引
ALTER TABLE mytable ADD UNIQUE INDEX index_bookId(bookId); //建立惟一索引
ALTER TABLE mytable ADD UNIQUE INDEX index_bookId_price(bookId,price); //建立多列索引
刪除索引
DROP INDEX 索引名 ON 表名 ; 如:drop index index_bookId_price on mytable;
視圖
第一節:視圖的引入
1,視圖是一種虛擬的表,是從數據庫中一個或者多個表中導出來的表。
2,數據庫中只存放了視圖的定義,而並無存放視圖中的數據,這些數據存放在原來的表中。
3,使用視圖查詢數據時,數據庫系統會從原來的表中取出對應的數據。
第二節:視圖的做用
1,使操做簡便化;
2,增長數據的安全性;
3,提升表的邏輯獨立性;
第三節:建立視圖
CREATE [ ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }]
VIEW 視圖名 [ ( 屬性清單) ]
AS SELECT 語句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
ALGORITHM 是可選參數,表示視圖選擇的算法;
「視圖名」參數表示要建立的視圖的名稱;
「屬性清單」是可選參數,其指定了視圖中各類屬性的名詞,默認狀況下與 SELECT 語句中查詢的屬性相同;
SELECT 語句參數是一個完整的查詢語句,標識從某個表查出某些知足條件的記錄,將這些記錄導入視圖中;
WITH CHECK OPTION 是可選參數,表彷佛更新視圖時要保證在該視圖的權限範圍以內;
ALGORITHM 包括 3 個選項 UNDEFINED、MERGE 和 TEMPTABLE。其中,
UNDEFINED 選項表示 MySQL 將 自動選擇所要使用的算法;
MERGE 選項表示將使用視圖的語句與視圖定義合併起來,使得視圖定義的某一部分 取代語句的對應部分;
TEMPTABLE 選項表示將視圖的結果存入臨時表,而後使用臨時表執行語句;
CASCADED 是可選參數,表示更新視圖時要知足全部相關視圖和表的條件,該參數爲默認值;
LOCAL 表示更新視圖時,要 知足該視圖自己的定義條件便可;
如:建立視圖:create view v1 as select * from mytable where bookId >30;
查詢使用:select * from v1;
建立視圖並給返回的結果欄目定義欄目名:CREATE VIEW v1(b,p) AS select bookId,bookName from mytable;
返回結果如:
注意查詢視圖字段時有別名的話按照別名查詢,沒有別名能夠按照原字段名稱查詢;
第四節:查看視圖
4.1 DESCRIBE 視圖名稱; //查看視圖字段屬性信息
4.2 SHOW TABLE STATUS LIKE ‘視圖名稱’;// 查看視圖基本信息,由於視圖是虛表,故查詢結果字段都爲空;此sql也能夠查詢普通表的基本信息;後面沒有like指定視圖時表示查詢庫中全部表和視圖的基本信息
4.3 SHOW CREATE VIEW 視圖名稱;//查看視圖詳細信息
4.3 在 views 表中查看視圖詳細信息
第五節:修改視圖
5.1 CREATE OR REPLACE VIEW 語句修改視圖
CREATE OR REPLACE [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 視圖名 [( 屬性清單 )]
AS SELECT 語句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
如:create or replace view v1 as select * from mytable where bookId < 30;
5.2 ALTER 語句修改視圖
ALTER [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 視圖名 [( 屬性清單 )]
AS SELECT 語句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
如:alter view v1 as select * from mytable;
第六節:更新視圖
更新視圖是指經過視圖來插入(INSERT)、更新(UPDATE)和刪除(DELETE)表中的數據。由於視圖是一個虛
擬的表,其中沒有數據。經過視圖更新時,都是轉換基本表來更新。更新視圖時,只能更新權限範圍內的數據。
超出了範圍,就不能更新。
6.1 插入(INSERT)
CREATE VIEW v1(b,p) AS select bookId,bookName from mytable;
INSERT into v1 values(44,'think in java');//插入視圖,再次查看視圖v1時會看到插入的數據,視圖操做實際是對錶的操做,能夠看到mytable表中增長了一條數據,可是其餘沒有插入的字段則是顯示默認值
6.2 更新(UPDATE)
update v1 set b=8,p='設計模式' where b=44
6.3 刪除(DELETE)
delete from v1 where b=44;
第七節:刪除視圖
刪除視圖是指刪除數據庫中已存在的視圖。刪除視圖時,只能刪除視圖的定義,不會刪除數據;
DROP VIEW [ IF EXISTS ] 視圖名列表 [ RESTRICT | CASCADE ]
如: DROP VIEW IF EXISTS v1;
觸發器
第一節:觸發器的引入
觸發器(TRIGGER)是由事件來觸發某個操做。這些事件包括 INSERT 語句、UPDATE 語句和 DELETE 語句。
當數據庫系統執行這些事件時,就會激活觸發器執行相應的操做。
第二節:建立與使用觸發器
2.1 建立只有一個執行語句的觸發器
CREATE TRIGGER 觸發器名 BEFORE | AFTER 觸發事件
ON 表名 FOR EACH ROW 事件發生時要執行的語句
如:CREATE TRIGGER trig_book AFTER INSERT
ON t_book FOR EACH ROW
UPDATE t_bookType SET bookNum=bookNum+1 WHERE new.bookTypeId=t_booktype.id;
表示t_book表中國執行插入操做時觸發t_bookType的更新操做,將bookNum加1
注:new是中間量,表示插入(更新)時的那條數據,若是是刪除時用old,表示刪除的那條數據
2.2 建立有多個執行語句的觸發器
CREATE TRIGGER 觸發器名 BEFORE | AFTER 觸發事件
ON 表名 FOR EACH ROW
BEGIN
執行語句列表
END
如:
DELIMITER |
CREATE TRIGGER trig_book2 AFTER DELETE
ON t_book FOR EACH ROW
BEGIN
UPDATE t_bookType SET bookNum=bookNum-1 WHERE old.bookTypeId=t_booktype.id;
INSERT INTO t_log VALUES(NULL,NOW(),'在book表裏刪除了一條數據');
DELETE FROM t_test WHERE old.bookTypeId=t_test.id;
END
|
DELIMITER ;
注:DELIMITER | 包裹起來避免觸發多條sql時遇到分號中斷執行的狀況
第三節:查看觸發器
3.1 SHOW TRIGGERS; 語句查看觸發器信息
3.2 在 triggers 表中查看觸發器信息
第四節:刪除觸發器
DROP TRIGGER 觸發器名;
mysql經常使用函數(部分舉例)
第一節:日期和時間函數
1,CURDATE() 返回當前系統日期; 如:select CURDATE() ,CURTIME(),MONTH(created_at) from theme13;
2,CURTIME() 返回當前系統時間;
3,MONTH(d) 返回日期 d 中的月份值,範圍是 1~12
第二節:字符串函數
1,CHAR_LENGTH(s) 計算字符串 s 的字符數;
2,UPPER(s) 把全部字母變成大寫字母;
3,LOWER(s) 把全部字母變成小寫字母;
第三節:數學函數
1,A BS(x) 求絕對值
2,SQRT(x) 求平方根
3,MOD(x,y) 求餘
第四節:加密函數
1,PASSWORD(str) 通常對用戶的密碼加密 不可逆
2,MD5(str) 普通加密 不可逆
3,ENCODE(str,pswd_str) 加密函數,結果是一個二進制數,必須使用 BLOB 類型的字段來保存它;
4,DECODE(crypt_str,pswd_str) 解密函數;
存儲過程和函數的引入
第一節:存儲過程和函數的引入
存儲過程和函數是在數據庫中定義一些 SQL 語句的集合,而後直接調用這些存儲過程和函數來執行已經定義好
的 SQL 語句。存儲過程和函數能夠避免開發人員重複的編寫相同的 SQL 語句。並且,存儲過程和函數是在 MySQL
服務器中存儲和執行的,能夠減小客戶端和服務器端的數據傳輸;
第二節:建立存儲過程和函數
1 建立存儲過程
CREATE PROCEDURE sp_name([proc_parameter[,...]])
[characteristic...] routine_body
sp_name 參數是存儲過程的名稱;
proc_parameter 表示存儲過程的參數列表;
characteristic 參數指定存儲過程的特性;
routine_body 參數是 SQL 代碼的內容,能夠用 BEGIN...END 來標誌 SQL 代碼的開始和結束。
proc_parameter 中的每一個參數由 3 部分組成。這 3 部分分別是輸入輸出類型、參數名稱和參數類型。
[ IN | OUT | INOUT ] param_name type
其中,IN 表示輸入參數;OUT 表示輸出參數;INOUT 表示既能夠是輸入,也能夠是輸出;param_name 參數是
存儲過程的參數名稱;type 參數指定存儲過程的參數類型,該類型能夠是 MySQL 數據庫的任意數據類型;
Characteristic 參數有多個取值。其取值說明以下:
LANGUAGE SQL:說明 routine_body 部分是由 SQL 語言的語句組成,這也是數據庫系統默認的語言。
[ NOT ] DETERMINISTIC :指明存儲過程的執行結果是不是肯定的。DETERMINISTIC 表示結果是肯定的。每
次執行存儲過程時,相同的輸入會獲得相同的輸出。NOT DETERMINISTIC 表示結果是非肯定的,相同的輸入
可能獲得不一樣的輸出。默認狀況下,結果是非肯定的。
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使用 SQL 語句的限制;
CONTAINS SQL 表示子程序包含 SQL 語句,但不包含讀或寫數據的語句;NO SQL 表示子程序中不包含 SQL
語句;READS SQL DATA 表示子程序中包含讀數據的語句;MODIFIES SQL DATA 表示子程序中包含寫數據的
語句。默認狀況下,系統會指定爲 CONTAINS SQL;
SQL SECURITY { DEFINER | INVOKER };指明誰有權限來執行。DEFINER 表示只有定義者本身才可以執行;
INVOKER 表示調用者能夠執行。默認狀況下,系統指定的權限是 DEFINER。
COMMENT ‘string’ :註釋信息;
如:
DELIMITER &&
CREATE PROCEDURE pro_book ( IN bT INT,OUT count_num INT)
READS SQL DATA
BEGIN
SELECT COUNT(*) FROM t_book WHERE bookTypeId=bT;
END
&&
DELIMITER ;
調用:CALL pro_book(1,@total);
2 建立存儲函數
CREATE FUNCTION sp_name ( [func_parameter[,...]] )
RETURNS type
[ characteristic... ] routine_body
sp_name 參數是存儲函數的名稱;func_parameter 表示存儲函數的參數列表;RETURNS type 指定返回值的
類型;characteristic 參數指定存儲過程的特性,該參數的取值與存儲過程當中的取值是同樣的;routine_body 參數
是 SQL 代碼的內容,能夠用 BEGIN...END 來標誌 SQL 代碼的開始和結束;
func_parameter 能夠由多個參數組成,其中每一個參數由參數名稱和參數類型組成,其形式以下:
param_name type
其中,param_name 參數是存儲函數的參數名稱;type 參數指定存儲函數的參數類型,
該類型能夠是 MySQL 數據庫的任意數據類型;
如:
DELIMITER &&
CREATE FUNCTION func_book (bookId INT)
RETURNS VARCHAR(20)
BEGIN
RETURN ( SELECT bookName FROM t_book WHERE id=bookId );
END
&&
DELIMITER ;
SELECT func_book(2);
3 變量的使用
DECLARE var_name [,...] type [ DEFAULT value ]
如:
DELIMITER &&
CREATE PROCEDURE pro_user()
BEGIN
DECLARE a,b VARCHAR(20) ;
INSERT INTO t_user VALUES(NULL,a,b);
END
&&
DELIMITER ;
調用該存儲過程後會向數據庫添加一條空值記錄
//將t_user2表數據讀取出來直接插入到t_user中
DELIMITER &&
CREATE PROCEDURE pro_user3()
BEGIN
DECLARE a,b VARCHAR(20) ;
SELECT userName2,password2 INTO a,b FROM t_user2 WHERE id2=1;
INSERT INTO t_user VALUES(NULL,a,b);
END
&&
DELIMITER ;
SET var_name = expr [,var_name=expr] ...
SELECT col_name[,...] INTO var_name[,...]
FROM table_name WHERE condition
如:
DELIMITER &&
CREATE PROCEDURE pro_user2()
BEGIN
DECLARE a,b VARCHAR(20) ;
SET a='java1234',b='123456';
INSERT INTO t_user VALUES(NULL,a,b);
END
&&
DELIMITER ;
4 遊標的使用
查詢語句可能查詢出多條記錄,在存儲過程和函數中使用遊標來逐條讀取查詢結果集中的記錄。遊標的使
用包括聲明遊標、打開遊標、使用遊標和關閉遊標。遊標必須聲明在處理程序以前,而且聲明在變量和條
件以後。
1,聲明遊標
DECLARE cursor_name CURSOR FOR select_statement ;
2,打開遊標
OPEN cursor_name;
3,使用遊標
FETCH cursor_name INTO var_name [,var_name ... ];
4,關閉遊標
CLOSE cursor_name;
如:
DELIMITER &&
CREATE PROCEDURE pro_user4()
BEGIN
DECLARE a,b VARCHAR(20) ;
DECLARE cur_t_user2 CURSOR FOR SELECT userName2,password2 FROM t_user2; //聲明遊標
OPEN cur_t_user2; //打開遊標
FETCH cur_t_user2 INTO a,b; //將遊標數據賦給a和b
INSERT INTO t_user VALUES(NULL,a,b);
CLOSE cur_t_user2; //關閉遊標
END
&&
DELIMITER ;
5 流程控制的使用
存儲過程和函數中可使用流程控制來控制語句的執行。MySQL 中可使用 IF 語句、CASE 語句、LOOP語句、LEAVE 語句、ITERATE 語句、REPEAT 語句和 WHILE 語句來進行流程控制。
IF search_condition THEN statement_list
[ ELSEIF search_condition THEN statement_list ]...
[ ELSE statement_list ]
END IF
如:
DELIMITER &&
CREATE PROCEDURE pro_user5(IN bookId INT)
BEGIN
SELECT COUNT(*) INTO @num FROM t_user WHERE id=bookId;
IF @num>0 THEN UPDATE t_user SET userName='java12345' WHERE id=bookId;
ELSE
INSERT INTO t_user VALUES(NULL,'2312312','2321312');
END IF ;
END
&&
DELIMITER ;
注:@num表示定義的會話變量或者全局變量
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list ]
END CASE
如:
DELIMITER &&
CREATE PROCEDURE pro_user6(IN bookId INT)
BEGIN
SELECT COUNT(*) INTO @num FROM t_user WHERE id=bookId;
CASE @num
WHEN 1 THEN UPDATE t_user SET userName='java12345' WHERE id=bookId;
WHEN 2 THEN INSERT INTO t_user VALUES(NULL,'2312312','2321312');
ELSE INSERT INTO t_user VALUES(NULL,'231231221321312','2321312321312');
END CASE ;
END
&&
DELIMITER ;
LOOP 語句可使某些特定的語句重複執行,實現一個簡單的循環。可是 LOOP 語句自己沒有中止循環的語句,必須是遇到 LEAVE 語句等才能中止循環。LOOP 語句的語法的基本形式以下:
[begin_label:]LOOP
Statement_list
END LOOP [ end_label ]
LEAVE 語句主要用於跳出循環控制。語法形式以下:
LEAVE label
如:
DELIMITER &&
CREATE PROCEDURE pro_user7(IN totalNum INT)
BEGIN
aaa:LOOP
SET totalNum=totalNum-1;
IF totalNum=0 THEN LEAVE aaa ;
ELSE INSERT INTO t_user VALUES(totalNum,'2312312','2321312');
END IF ;
END LOOP aaa ;
END
&&
DELIMITER ;
ITERATE 語句也是用來跳出循環的語句。可是,ITERATE 語句是跳出本次循環,而後直接進入下一次循環。基本語法:
ITERATE label ;
如:
DELIMITER &&
CREATE PROCEDURE pro_user8(IN totalNum INT)
BEGIN
aaa:LOOP
SET totalNum=totalNum-1;
IF totalNum=0 THEN LEAVE aaa ;
ELSEIF totalNum=3 THEN ITERATE aaa ;
END IF ;
INSERT INTO t_user VALUES(totalNum,'2312312','2321312');
END LOOP aaa ;
END
&&
DELIMITER ;
REPEAT 語句是有條件控制的循環語句。當知足特定條件時,就會跳出循環語句。REPEAT 語句的基本語法形式以下:
[ begin_label : ] REPEAT
Statement_list
UNTIL search_condition
END REPEAT [ end_label ]
如:
DELIMITER &&
CREATE PROCEDURE pro_user9(IN totalNum INT)
BEGIN
REPEAT
SET totalNum=totalNum-1;
INSERT INTO t_user VALUES(totalNum,'2312312','2321312');
UNTIL totalNum=1
END REPEAT;
END
&&
DELIMITER ;
//表示重複直到totalNum=1結束循環
[ begin_label : ] WHILE search_condition DO
Statement_list
END WHILE [ end_label ]
如:
DELIMITER &&
CREATE PROCEDURE pro_user10(IN totalNum INT)
BEGIN
WHILE totalNum>0 DO
INSERT INTO t_user VALUES(totalNum,'2312312','2321312');
SET totalNum=totalNum-1;
END WHILE ;
END
&&
DELIMITER ;
第三節:調用存儲過程和函數
1 調用存儲過程
CALL sp_name( [parameter[,...]] )
2 調用存儲函數
fun_name( [parameter[,...]] )
第四節:查看存儲過程和函數
4.1 SHOW STATUS 語句查看存儲過程和函數的狀態
SHOW { PROCEDURE | FUNCTION } STATUS [ LIKE ‘pattern’ ] ;//pattern表明存儲過程名
如:SHOW PROCEDURE STATUS LIKE 'pro_book';
4.2 SHOW CREATE 語句查看存儲過程的函數的定義
SHOW CREATE { PROCEDURE | FUNCTION } sp_name ;
如:SHOW CREATE PROCEDURE pro_book;
4.3 從 information_schema.Routines 表中查看存儲過程和函數的信息
第五節:修改存儲過程和函數
ALTER { PROCEDURE | FUNCTION } sp_name [ characteristic ... ]
characteristic :
{ CONTAINS SQL } NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT ‘string’
其中,sp_name 參數表示存儲過程或函數的名稱;characteristic 參數指定函數的特性。CONTAINS SQL 表示子程
序包含 SQL 語句,但不包含讀或寫數據的語句;NO SQL 表示子程序中不包含 SQL 語句;READS SQL DATA
表 示 子 程 序 中 包 含 數 據 的 語 句 ; MODIFIES
SQL DATA 表 示 子 程 序 中 包 含 寫 數 據 的 語 句 。 SQL
SECURITY{ DEFINER | INVODER } 指明誰有權限來執行。 DEFINER 表示只有定義者本身才可以執行;
INVODER 表示調用者能夠執行。COMMENT ‘string’ 是註釋信息。
如:
ALTER PROCEDURE pro_book COMMENT '我來測試一個COMMENT'; //修改pro_book 的註釋爲'我來測試一個COMMENT'
第六節:刪除存儲過程和函數
DROP {PROCEDURE | FUNCTION } sp_name ;
如:
DROP PROCEDURE pro_user3;
數據備份與還原
第一節:數據備份
備份數據能夠保證數據庫中數據的安全,數據庫管理員須要按期的進行數據庫備份;
1.1 使用 mysqldump 命令備份
mysqldump -u username -p dbname table1 table2 ... > BackupName.sql
dbname 參數表示數據庫的名稱;table1 和 table2 參數表示表的名稱,沒有該參數時將備份整個數據庫;
BackupName.sql 參數表示備份文件的名稱,文件名前面能夠加上一個絕對路徑。一般以 sql 做爲後綴。
如:
mysqldump -u root -p db_book > c:\db_book.sql //將整個db_book數據庫備份到c盤db_book.sql文件中,固然圖形界面都是能夠的
1.2 使用 sqlyog 圖形工具有份
第二節:數據還原
2.2 使用 mysql 命令還原
Mysql -u root -p [dbname] < backup.sql
dbname 參數表示數據庫名稱。該參數是可選參數,能夠指定數據庫名,也能夠不指定。指定數據庫名時,表
示還原該數據庫下的表。不指定數據庫名時,表示還原特定的一個數據庫。而備份文件中有建立數據庫的語句。
2.3 使用 sqlyog 圖形工具還原