MySQL基本增刪改查語句

數據庫操作: 

1、顯示所有數據庫:Show databases;
2、創建數據庫:Create database 數據庫名;
3、刪除數據庫:Drop database 數據庫名;

表操作:

查看錶結構:
1,查看基本表結構: DESCRIBE(或DESC) 表名;//返回表字段及其詳細信息表格
2,查看錶詳細結構: SHOW CREATE TABLE 表名;//返回結果是創建表的sql
 
刪除/清空 表:
1、 drop table  表名; //徹底刪除表格,刪除字段數據,釋放內存空間
2、 truncate 表名;  //刪除表格數據,不刪除字段,釋放內存空間
3、 delete from 表名;或delete * from 表名;// 刪除內容不刪除定義,不釋放空間,系統一行一行地刪,效率較truncate低
 
truncate和delete對比:
1、truncate 將重新設置高水平線和所有的索引。在對整個表和索引進行完全瀏覽時,經過 truncate 操作後的表比Delete操作後的表要快得多。 當表被清空後表和表的索引將重新設置成初始大小,而delete則不能。 
2、truncate 是隱式提交,不能觸發任何Delete觸發器,不能通過rollback命令撤回,而delete可以,因爲delete 語句每次刪除一行,都在事務日誌中爲所刪除的每行記錄一項 ;
3、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);//查找屬性(不爲)爲元素1、元素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; 返回結果將兩個表的所有組合結果返回

 

1、內連接查詢:
內連接查詢是一種最常用的連接查詢。內連接查詢可以查詢兩個或者兩個以上的表;
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;
2、外連接查詢
外連接可以查出某一張表的所有信息;
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 關鍵字是,數據庫系統會將所有的查詢結果合併到一起,然後去除掉相同的記錄;
UNION ALL
     使用 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 語句來創建索引
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 觸發器名;

函數(部分):

第一節:日期和時間函數
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 語句
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 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,LEAVE 語句
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 語句是跳出本次循環,然後直接進入下一次循環。基本語法:
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 語句是有條件控制的循環語句。當滿足特定條件時,就會跳出循環語句。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結束循環
WHILE 語句
[ 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;

 

 

 

 

 

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